@@ -1204,9 +1204,16 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
1204
1204
1205
1205
if ( ! err ) {
1206
1206
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
+
1207
1214
l_offset = l_offset * XISO_DWORD_SIZE + ( XISO_SECTOR_SIZE - ( l_offset * XISO_DWORD_SIZE ) % XISO_SECTOR_SIZE );
1208
1215
err = lseek ( in_xiso , in_dir_start + (xoff_t ) l_offset , SEEK_SET ) == -1 ? 1 : 0 ;
1209
-
1216
+
1210
1217
if ( ! err ) goto read_entry ; // me and my silly comments
1211
1218
} else {
1212
1219
l_offset = tmp ;
@@ -1253,7 +1260,7 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
1253
1260
1254
1261
avl -> file_size = dir -> file_size ;
1255
1262
avl -> old_start_sector = dir -> start_sector ;
1256
-
1263
+
1257
1264
if ( avl_insert ( in_root , avl ) == k_avl_error ) misc_err ( "this iso appears to be corrupt\n" , 0 , 0 , 0 );
1258
1265
}
1259
1266
}
@@ -1298,7 +1305,10 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
1298
1305
if ( ( err = mkdir ( dir -> filename , 0755 ) ) ) mkdir_err ( dir -> filename );
1299
1306
if ( ! err && dir -> start_sector && ( err = chdir ( dir -> filename ) ) ) chdir_err ( dir -> filename );
1300
1307
}
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
+ }
1302
1312
}
1303
1313
}
1304
1314
@@ -1351,6 +1361,8 @@ int traverse_xiso( int in_xiso, dir_node *in_dir_node, xoff_t in_dir_start, char
1351
1361
}
1352
1362
}
1353
1363
1364
+ end_traverse :
1365
+
1354
1366
if ( dir -> filename ) free ( dir -> filename );
1355
1367
1356
1368
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
1724
1736
}
1725
1737
1726
1738
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 ();
1727
1743
}
1728
1744
}
1729
1745
}
@@ -1806,6 +1822,7 @@ int write_directory( dir_node_avl *in_avl, int in_xiso, int in_depth ) {
1806
1822
xoff_t pos ;
1807
1823
int err = 0 , pad ;
1808
1824
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 );
1809
1826
char length = (char ) strlen ( in_avl -> filename ), attributes = in_avl -> subdirectory ? XISO_ATTRIBUTE_DIR : XISO_ATTRIBUTE_ARC , sector [ XISO_SECTOR_SIZE ];
1810
1827
1811
1828
little32 ( in_avl -> file_size );
@@ -1824,7 +1841,7 @@ int write_directory( dir_node_avl *in_avl, int in_xiso, int in_depth ) {
1824
1841
if ( ! err && write ( in_xiso , & l_offset , XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err ();
1825
1842
if ( ! err && write ( in_xiso , & r_offset , XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err ();
1826
1843
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 ();
1828
1845
if ( ! err && write ( in_xiso , & attributes , XISO_ATTRIBUTES_SIZE ) != XISO_ATTRIBUTES_SIZE ) write_err ();
1829
1846
if ( ! err && write ( in_xiso , & length , XISO_FILENAME_LENGTH_SIZE ) != XISO_FILENAME_LENGTH_SIZE ) write_err ();
1830
1847
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
1840
1857
wdsafp_context context ;
1841
1858
1842
1859
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
+ }
1844
1864
else {
1845
1865
context .current_sector = io_current_sector ;
1846
1866
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
1869
1889
1870
1890
1871
1891
int 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 );
1876
1894
} else {
1877
1895
++ s_total_files ;
1878
1896
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
1883
1901
1884
1902
1885
1903
int 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
+ }
1889
1911
}
1890
1912
1891
1913
return 0 ;
0 commit comments