Skip to content

Commit d70a913

Browse files
rapperskullLukeUsher
authored andcommitted
Write directory size as a multiple of sector size (empty directories occupy one sector)
Don't fail on empty directories
1 parent 715d798 commit d70a913

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
@@ -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

18711891
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 );
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

18851903
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+
}
18891911
}
18901912

18911913
return 0;

0 commit comments

Comments
 (0)