Skip to content

Commit 76a7fb7

Browse files
rapperskullthrimbor
authored andcommitted
Write directory after its content in case properties change
Set correct file size while rewriting ISO with truncated files
1 parent 56fc4c7 commit 76a7fb7

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

extract-xiso.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,7 @@ int extract_file( int in_xiso, dir_node *in_file, modes in_mode , char* path) {
16711671
} while (i < in_file->file_size && read_size > 0);
16721672
if (!err && i < in_file->file_size) {
16731673
exiso_log("\nWARNING: File %s is truncated. Reported size: %u bytes, read size: %u bytes!", in_file->filename, in_file->file_size, i);
1674+
in_file->file_size = i;
16741675
}
16751676
}
16761677
if (in_mode == k_extract) close(out);
@@ -1717,15 +1718,18 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17171718
if ( in_context->from == -1 ) {
17181719
if ( chdir( in_avl->filename ) == -1 ) chdir_err( in_avl->filename );
17191720
}
1720-
if ( ! err && lseek( in_context->xiso, (xoff_t) in_avl->start_sector * XISO_SECTOR_SIZE, SEEK_SET ) == -1 ) seek_err();
1721-
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_directory, (void *) in_context->xiso, k_prefix, 0 );
1722-
if ( ! err && ( pos = lseek( in_context->xiso, 0, SEEK_CUR ) ) == -1 ) seek_err();
1723-
if ( ! err && ( pad = (int) (( XISO_SECTOR_SIZE - ( pos % XISO_SECTOR_SIZE ) ) % XISO_SECTOR_SIZE) ) ) {
1724-
memset( sector, XISO_PAD_BYTE, pad );
1725-
if ( write( in_context->xiso, sector, pad ) != pad ) write_err();
1726-
}
1721+
17271722
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_file, &context, k_prefix, 0 );
17281723
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_tree, &context, k_prefix, 0 );
1724+
1725+
if (!err && lseek(in_context->xiso, (xoff_t)in_avl->start_sector * XISO_SECTOR_SIZE, SEEK_SET) == -1) seek_err();
1726+
if (!err) err = avl_traverse_depth_first(in_avl->subdirectory, (traversal_callback)write_directory, (void*)in_context->xiso, k_prefix, 0);
1727+
if (!err && (pos = lseek(in_context->xiso, 0, SEEK_CUR)) == -1) seek_err();
1728+
if (!err && (pad = (int)((XISO_SECTOR_SIZE - (pos % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE))) {
1729+
memset(sector, XISO_PAD_BYTE, pad);
1730+
if (write(in_context->xiso, sector, pad) != pad) write_err();
1731+
}
1732+
17291733
if ( ! err && in_context->from == -1 ) {
17301734
if ( chdir( ".." ) == -1 ) chdir_err( ".." );
17311735
}
@@ -1805,7 +1809,8 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
18051809
}
18061810
}
18071811
} while (bytes);
1808-
i = in_avl->file_size - bytes;
1812+
i = in_avl->file_size;
1813+
in_avl->file_size -= bytes;
18091814

18101815
if (!err && (bytes = (XISO_SECTOR_SIZE - (in_avl->file_size % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE)) {
18111816
memset(buf, XISO_PAD_BYTE, bytes);
@@ -1814,7 +1819,7 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
18141819
exiso_log(err ? "failed\n" : "[OK]\n");
18151820

18161821
if (!err && i != in_avl->file_size) {
1817-
exiso_log("WARNING: File %s is truncated. Reported size: %u bytes, wrote size: %u bytes!\n", in_avl->filename, in_avl->file_size, i);
1822+
exiso_log("WARNING: File %s is truncated. Reported size: %u bytes, wrote size: %u bytes!\n", in_avl->filename, i, in_avl->file_size);
18181823
}
18191824

18201825
if (!err) {

0 commit comments

Comments
 (0)