Skip to content

Commit e5c662d

Browse files
committed
Made it so adding symlinks works
and fixed a warning
1 parent 3438285 commit e5c662d

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

extract-xiso.c

+37-21
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,8 @@
329329
#define S_ISDIR( x ) ( ( x ) & _S_IFDIR )
330330
#define S_ISREG( x ) ( ( x ) & _S_IFREG )
331331

332+
#define realpath(x, y) _fullpath(y, x, 0)
333+
332334
#include "win32/getopt.c"
333335
#if defined(_MSC_VER)
334336
#include "win32/asprintf.c"
@@ -1722,24 +1724,30 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17221724
context.progress = in_context->progress;
17231725
context.final_bytes = in_context->final_bytes;
17241726

1725-
if ( in_context->from == -1 ) {
1726-
if ( chdir( in_avl->filename ) == -1 ) chdir_err( in_avl->filename );
1727-
}
1728-
1729-
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_file, &context, k_prefix, 0 );
1730-
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_tree, &context, k_prefix, 0 );
1731-
1732-
if (!err && lseek(in_context->xiso, (xoff_t)in_avl->start_sector * XISO_SECTOR_SIZE, SEEK_SET) == -1) seek_err();
1733-
if (!err) err = avl_traverse_depth_first(in_avl->subdirectory, (traversal_callback)write_directory, (void*)in_context->xiso, k_prefix, 0);
1734-
if (!err && (pos = lseek(in_context->xiso, 0, SEEK_CUR)) == -1) seek_err();
1735-
if (!err && (pad = (int)((XISO_SECTOR_SIZE - (pos % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE))) {
1736-
memset(sector, XISO_PAD_BYTE, pad);
1737-
if (write(in_context->xiso, sector, pad) != pad) write_err();
1738-
}
1739-
1740-
if ( ! err && in_context->from == -1 ) {
1741-
if ( chdir( ".." ) == -1 ) chdir_err( ".." );
1742-
}
1727+
char* rpwd = realpath( ".", NULL );
1728+
if ( ! rpwd ) {
1729+
read_err();
1730+
} else {
1731+
if ( in_context->from == -1 ) {
1732+
if ( chdir( in_avl->filename ) == -1 ) chdir_err( in_avl->filename );
1733+
}
1734+
1735+
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_file, &context, k_prefix, 0 );
1736+
if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_tree, &context, k_prefix, 0 );
1737+
1738+
if (!err && lseek(in_context->xiso, (xoff_t)in_avl->start_sector * XISO_SECTOR_SIZE, SEEK_SET) == -1) seek_err();
1739+
if (!err) err = avl_traverse_depth_first(in_avl->subdirectory, (traversal_callback)write_directory, (void*)(uintptr_t)in_context->xiso, k_prefix, 0);
1740+
if (!err && (pos = lseek(in_context->xiso, 0, SEEK_CUR)) == -1) seek_err();
1741+
if (!err && (pad = (int)((XISO_SECTOR_SIZE - (pos % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE))) {
1742+
memset(sector, XISO_PAD_BYTE, pad);
1743+
if (write(in_context->xiso, sector, pad) != pad) write_err();
1744+
}
1745+
1746+
if ( ! err && in_context->from == -1 ) {
1747+
if ( chdir( rpwd ) == -1 ) chdir_err( rpwd );
1748+
}
1749+
}
1750+
free(rpwd);
17431751

17441752
if ( context.path ) free( context.path );
17451753
} else {
@@ -1990,10 +1998,18 @@ int generate_avl_tree_local( dir_node_avl **out_root, int *io_n ) {
19901998
if ( S_ISDIR( sb.st_mode ) ) {
19911999
empty_dir = false;
19922000

1993-
if ( chdir( avl->filename ) == -1 ) chdir_err( avl->filename );
2001+
char* rpwd = realpath( ".", NULL );
2002+
if ( ! rpwd ) {
2003+
read_err();
2004+
} else {
19942005

1995-
if ( ! err ) err = generate_avl_tree_local( &avl->subdirectory, io_n );
1996-
if ( ! err && chdir( ".." ) == -1 ) chdir_err( ".." );
2006+
if ( ! err && chdir( avl->filename ) == -1 ) chdir_err( avl->filename );
2007+
2008+
if ( ! err ) err = generate_avl_tree_local( &avl->subdirectory, io_n );
2009+
if ( ! err && chdir( rpwd ) == -1 ) chdir_err( rpwd );
2010+
2011+
free( rpwd );
2012+
}
19972013
} else if ( S_ISREG( sb.st_mode ) ) {
19982014
empty_dir = false;
19992015
if ( sb.st_size > ULONG_MAX ) {

0 commit comments

Comments
 (0)