Skip to content

Commit 95cef91

Browse files
committed
Write directory size as a multiple of sector size (empty directories occupy one sector)
Don't fail on empty directories
1 parent 0a25b32 commit 95cef91

File tree

1 file changed

+34
-12
lines changed

1 file changed

+34
-12
lines changed

extract-xiso.c

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

18721892
int 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

18861904
int 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

Comments
 (0)