@@ -1205,9 +1205,16 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
12051205
12061206 if ( ! err ) {
12071207 if ( tmp == XISO_PAD_SHORT ) {
1208+ if ( l_offset == 0 ) { // Directory is empty
1209+ if (in_mode == k_generate_avl ) {
1210+ avl_insert (in_root , EMPTY_SUBDIRECTORY );
1211+ }
1212+ goto end_traverse ;
1213+ }
1214+
12081215 l_offset = l_offset * XISO_DWORD_SIZE + ( XISO_SECTOR_SIZE - ( l_offset * XISO_DWORD_SIZE ) % XISO_SECTOR_SIZE );
12091216 err = lseek ( in_xiso , in_dir_start + (xoff_t ) l_offset , SEEK_SET ) == -1 ? 1 : 0 ;
1210-
1217+
12111218 if ( ! err ) goto read_entry ; // me and my silly comments
12121219 } else {
12131220 l_offset = tmp ;
@@ -1254,7 +1261,7 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
12541261
12551262 avl -> file_size = dir -> file_size ;
12561263 avl -> old_start_sector = dir -> start_sector ;
1257-
1264+
12581265 if ( avl_insert ( in_root , avl ) == k_avl_error ) misc_err ( "this iso appears to be corrupt\n" , 0 , 0 , 0 );
12591266 }
12601267 }
@@ -1299,7 +1306,10 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
12991306 if ( ( err = mkdir ( dir -> filename , 0755 ) ) ) mkdir_err ( dir -> filename );
13001307 if ( ! err && dir -> start_sector && ( err = chdir ( dir -> filename ) ) ) chdir_err ( dir -> filename );
13011308 }
1302- if ( ! err && in_mode != k_list && in_mode != k_generate_avl ) exiso_log ( "creating %s (0 bytes) [OK]\n" , path );
1309+ if ( ! err && in_mode != k_generate_avl ) {
1310+ exiso_log ("%s%s%s%s (0 bytes)%s" , in_mode == k_extract ? "creating " : "" , in_path , dir -> filename , PATH_CHAR_STR , in_mode == k_extract ? " [OK]" : "" ); flush ();
1311+ exiso_log ("\n" );
1312+ }
13031313 }
13041314 }
13051315
@@ -1352,6 +1362,8 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
13521362 }
13531363 }
13541364
1365+ end_traverse :
1366+
13551367 if ( dir -> filename ) free ( dir -> filename );
13561368
13571369 if ( ( dir = dir -> parent ) ) goto left_processed ;
@@ -1725,6 +1737,10 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17251737 }
17261738
17271739 if ( context .path ) free ( context .path );
1740+ } else {
1741+ memset (sector , XISO_PAD_BYTE , XISO_SECTOR_SIZE );
1742+ if ((pos = lseek (in_context -> xiso , in_avl -> start_sector * XISO_SECTOR_SIZE , SEEK_SET )) == -1 ) seek_err ();
1743+ if (!err && write (in_context -> xiso , sector , XISO_SECTOR_SIZE ) != XISO_SECTOR_SIZE ) write_err ();
17281744 }
17291745 }
17301746 }
@@ -1807,6 +1823,7 @@ int write_directory( dir_node_avl *in_avl, int in_xiso, int in_depth ) {
18071823 xoff_t pos ;
18081824 int err = 0 , pad ;
18091825 unsigned short l_offset , r_offset ;
1826+ unsigned long file_size = in_avl -> file_size + (in_avl -> subdirectory ? (XISO_SECTOR_SIZE - (in_avl -> file_size % XISO_SECTOR_SIZE )) % XISO_SECTOR_SIZE : 0 );
18101827 char length = (char ) strlen ( in_avl -> filename ), attributes = in_avl -> subdirectory ? XISO_ATTRIBUTE_DIR : XISO_ATTRIBUTE_ARC , sector [ XISO_SECTOR_SIZE ];
18111828
18121829 little32 ( in_avl -> file_size );
@@ -1825,7 +1842,7 @@ int write_directory( dir_node_avl *in_avl, int in_xiso, int in_depth ) {
18251842 if ( ! err && write ( in_xiso , & l_offset , XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err ();
18261843 if ( ! err && write ( in_xiso , & r_offset , XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err ();
18271844 if ( ! err && write ( in_xiso , & in_avl -> start_sector , XISO_SECTOR_OFFSET_SIZE ) != XISO_SECTOR_OFFSET_SIZE ) write_err ();
1828- if ( ! err && write ( in_xiso , & in_avl -> file_size , XISO_FILESIZE_SIZE ) != XISO_FILESIZE_SIZE ) write_err ();
1845+ if ( ! err && write ( in_xiso , & file_size , XISO_FILESIZE_SIZE ) != XISO_FILESIZE_SIZE ) write_err ();
18291846 if ( ! err && write ( in_xiso , & attributes , XISO_ATTRIBUTES_SIZE ) != XISO_ATTRIBUTES_SIZE ) write_err ();
18301847 if ( ! err && write ( in_xiso , & length , XISO_FILENAME_LENGTH_SIZE ) != XISO_FILENAME_LENGTH_SIZE ) write_err ();
18311848 if ( ! err && write ( in_xiso , in_avl -> filename , length ) != length ) write_err ();
@@ -1841,7 +1858,10 @@ int calculate_directory_offsets( dir_node_avl *in_avl, unsigned long *io_current
18411858 wdsafp_context context ;
18421859
18431860 if ( in_avl -> subdirectory ) {
1844- if ( in_avl -> subdirectory == EMPTY_SUBDIRECTORY ) in_avl -> start_sector = 0 ;
1861+ if (in_avl -> subdirectory == EMPTY_SUBDIRECTORY ) {
1862+ in_avl -> start_sector = * io_current_sector ;
1863+ * io_current_sector += 1 ;
1864+ }
18451865 else {
18461866 context .current_sector = io_current_sector ;
18471867 context .dir_start = (xoff_t ) ( in_avl -> start_sector = * io_current_sector ) * XISO_SECTOR_SIZE ;
@@ -1870,10 +1890,8 @@ int write_dir_start_and_file_positions( dir_node_avl *in_avl, wdsafp_context *io
18701890
18711891
18721892int calculate_total_files_and_bytes ( dir_node_avl * in_avl , void * in_context , int in_depth ) {
1873- if ( in_avl -> subdirectory ) {
1874- if ( in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1875- avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_total_files_and_bytes , nil , k_prefix , 0 );
1876- }
1893+ if ( in_avl -> subdirectory && in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1894+ avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_total_files_and_bytes , nil , k_prefix , 0 );
18771895 } else {
18781896 ++ s_total_files ;
18791897 s_total_bytes += in_avl -> file_size ;
@@ -1884,9 +1902,13 @@ int calculate_total_files_and_bytes( dir_node_avl *in_avl, void *in_context, int
18841902
18851903
18861904int calculate_directory_requirements ( dir_node_avl * in_avl , void * in_context , int in_depth ) {
1887- if ( in_avl -> subdirectory && in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1888- avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_directory_size , & in_avl -> file_size , k_prefix , 0 );
1889- avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_directory_requirements , in_context , k_prefix , 0 );
1905+ if ( in_avl -> subdirectory ) {
1906+ if (in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1907+ avl_traverse_depth_first (in_avl -> subdirectory , (traversal_callback )calculate_directory_size , & in_avl -> file_size , k_prefix , 0 );
1908+ avl_traverse_depth_first (in_avl -> subdirectory , (traversal_callback )calculate_directory_requirements , in_context , k_prefix , 0 );
1909+ } else {
1910+ in_avl -> file_size = XISO_SECTOR_SIZE ;
1911+ }
18901912 }
18911913
18921914 return 0 ;
0 commit comments