@@ -1204,9 +1204,16 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
12041204
12051205 if ( ! err ) {
12061206 if ( tmp == XISO_PAD_SHORT ) {
1207+ if ( l_offset == 0 ) { // Directory is empty
1208+ if (in_mode == k_generate_avl ) {
1209+ avl_insert (in_root , EMPTY_SUBDIRECTORY );
1210+ }
1211+ goto end_traverse ;
1212+ }
1213+
12071214 l_offset = l_offset * XISO_DWORD_SIZE + ( XISO_SECTOR_SIZE - ( l_offset * XISO_DWORD_SIZE ) % XISO_SECTOR_SIZE );
12081215 err = lseek ( in_xiso , in_dir_start + (xoff_t ) l_offset , SEEK_SET ) == -1 ? 1 : 0 ;
1209-
1216+
12101217 if ( ! err ) goto read_entry ; // me and my silly comments
12111218 } else {
12121219 l_offset = tmp ;
@@ -1253,7 +1260,7 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
12531260
12541261 avl -> file_size = dir -> file_size ;
12551262 avl -> old_start_sector = dir -> start_sector ;
1256-
1263+
12571264 if ( avl_insert ( in_root , avl ) == k_avl_error ) misc_err ( "this iso appears to be corrupt\n" , 0 , 0 , 0 );
12581265 }
12591266 }
@@ -1298,7 +1305,10 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
12981305 if ( ( err = mkdir ( dir -> filename , 0755 ) ) ) mkdir_err ( dir -> filename );
12991306 if ( ! err && dir -> start_sector && ( err = chdir ( dir -> filename ) ) ) chdir_err ( dir -> filename );
13001307 }
1301- if ( ! err && in_mode != k_list && in_mode != k_generate_avl ) exiso_log ( "creating %s (0 bytes) [OK]\n" , path );
1308+ if ( ! err && in_mode != k_generate_avl ) {
1309+ 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 ();
1310+ exiso_log ("\n" );
1311+ }
13021312 }
13031313 }
13041314
@@ -1351,6 +1361,8 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
13511361 }
13521362 }
13531363
1364+ end_traverse :
1365+
13541366 if ( dir -> filename ) free ( dir -> filename );
13551367
13561368 if ( ( dir = dir -> parent ) ) goto left_processed ;
@@ -1724,6 +1736,10 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17241736 }
17251737
17261738 if ( context .path ) free ( context .path );
1739+ } else {
1740+ memset (sector , XISO_PAD_BYTE , XISO_SECTOR_SIZE );
1741+ if ((pos = lseek (in_context -> xiso , in_avl -> start_sector * XISO_SECTOR_SIZE , SEEK_SET )) == -1 ) seek_err ();
1742+ if (!err && write (in_context -> xiso , sector , XISO_SECTOR_SIZE ) != XISO_SECTOR_SIZE ) write_err ();
17271743 }
17281744 }
17291745 }
@@ -1806,6 +1822,7 @@ int write_directory( dir_node_avl *in_avl, int in_xiso, int in_depth ) {
18061822 xoff_t pos ;
18071823 int err = 0 , pad ;
18081824 unsigned short l_offset , r_offset ;
1825+ 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 );
18091826 char length = (char ) strlen ( in_avl -> filename ), attributes = in_avl -> subdirectory ? XISO_ATTRIBUTE_DIR : XISO_ATTRIBUTE_ARC , sector [ XISO_SECTOR_SIZE ];
18101827
18111828 little32 ( in_avl -> file_size );
@@ -1824,7 +1841,7 @@ int write_directory( dir_node_avl *in_avl, int in_xiso, int in_depth ) {
18241841 if ( ! err && write ( in_xiso , & l_offset , XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err ();
18251842 if ( ! err && write ( in_xiso , & r_offset , XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err ();
18261843 if ( ! err && write ( in_xiso , & in_avl -> start_sector , XISO_SECTOR_OFFSET_SIZE ) != XISO_SECTOR_OFFSET_SIZE ) write_err ();
1827- if ( ! err && write ( in_xiso , & in_avl -> file_size , XISO_FILESIZE_SIZE ) != XISO_FILESIZE_SIZE ) write_err ();
1844+ if ( ! err && write ( in_xiso , & file_size , XISO_FILESIZE_SIZE ) != XISO_FILESIZE_SIZE ) write_err ();
18281845 if ( ! err && write ( in_xiso , & attributes , XISO_ATTRIBUTES_SIZE ) != XISO_ATTRIBUTES_SIZE ) write_err ();
18291846 if ( ! err && write ( in_xiso , & length , XISO_FILENAME_LENGTH_SIZE ) != XISO_FILENAME_LENGTH_SIZE ) write_err ();
18301847 if ( ! err && write ( in_xiso , in_avl -> filename , length ) != length ) write_err ();
@@ -1840,7 +1857,10 @@ int calculate_directory_offsets( dir_node_avl *in_avl, unsigned long *io_current
18401857 wdsafp_context context ;
18411858
18421859 if ( in_avl -> subdirectory ) {
1843- if ( in_avl -> subdirectory == EMPTY_SUBDIRECTORY ) in_avl -> start_sector = 0 ;
1860+ if (in_avl -> subdirectory == EMPTY_SUBDIRECTORY ) {
1861+ in_avl -> start_sector = * io_current_sector ;
1862+ * io_current_sector += 1 ;
1863+ }
18441864 else {
18451865 context .current_sector = io_current_sector ;
18461866 context .dir_start = (xoff_t ) ( in_avl -> start_sector = * io_current_sector ) * XISO_SECTOR_SIZE ;
@@ -1869,10 +1889,8 @@ int write_dir_start_and_file_positions( dir_node_avl *in_avl, wdsafp_context *io
18691889
18701890
18711891int calculate_total_files_and_bytes ( dir_node_avl * in_avl , void * in_context , int in_depth ) {
1872- if ( in_avl -> subdirectory ) {
1873- if ( in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1874- avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_total_files_and_bytes , nil , k_prefix , 0 );
1875- }
1892+ if ( in_avl -> subdirectory && in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1893+ avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_total_files_and_bytes , nil , k_prefix , 0 );
18761894 } else {
18771895 ++ s_total_files ;
18781896 s_total_bytes += in_avl -> file_size ;
@@ -1883,9 +1901,13 @@ int calculate_total_files_and_bytes( dir_node_avl *in_avl, void *in_context, int
18831901
18841902
18851903int calculate_directory_requirements ( dir_node_avl * in_avl , void * in_context , int in_depth ) {
1886- if ( in_avl -> subdirectory && in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1887- avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_directory_size , & in_avl -> file_size , k_prefix , 0 );
1888- avl_traverse_depth_first ( in_avl -> subdirectory , (traversal_callback ) calculate_directory_requirements , in_context , k_prefix , 0 );
1904+ if ( in_avl -> subdirectory ) {
1905+ if (in_avl -> subdirectory != EMPTY_SUBDIRECTORY ) {
1906+ avl_traverse_depth_first (in_avl -> subdirectory , (traversal_callback )calculate_directory_size , & in_avl -> file_size , k_prefix , 0 );
1907+ avl_traverse_depth_first (in_avl -> subdirectory , (traversal_callback )calculate_directory_requirements , in_context , k_prefix , 0 );
1908+ } else {
1909+ in_avl -> file_size = XISO_SECTOR_SIZE ;
1910+ }
18891911 }
18901912
18911913 return 0 ;
0 commit comments