|
329 | 329 | #define S_ISDIR( x ) ( ( x ) & _S_IFDIR )
|
330 | 330 | #define S_ISREG( x ) ( ( x ) & _S_IFREG )
|
331 | 331 |
|
| 332 | + #define realpath(x, y) _fullpath(y, x, MAX_PATH) |
| 333 | + |
332 | 334 | #include "win32/getopt.c"
|
333 | 335 | #if defined(_MSC_VER)
|
334 | 336 | #include "win32/asprintf.c"
|
@@ -1730,7 +1732,7 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
|
1730 | 1732 | if ( ! err ) err = avl_traverse_depth_first( in_avl->subdirectory, (traversal_callback) write_tree, &context, k_prefix, 0 );
|
1731 | 1733 |
|
1732 | 1734 | 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); |
| 1735 | + if (!err) err = avl_traverse_depth_first(in_avl->subdirectory, (traversal_callback)write_directory, (void*)(uintptr_t)in_context->xiso, k_prefix, 0); |
1734 | 1736 | if (!err && (pos = lseek(in_context->xiso, 0, SEEK_CUR)) == -1) seek_err();
|
1735 | 1737 | if (!err && (pad = (int)((XISO_SECTOR_SIZE - (pos % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE))) {
|
1736 | 1738 | memset(sector, XISO_PAD_BYTE, pad);
|
@@ -1990,10 +1992,18 @@ int generate_avl_tree_local( dir_node_avl **out_root, int *io_n ) {
|
1990 | 1992 | if ( S_ISDIR( sb.st_mode ) ) {
|
1991 | 1993 | empty_dir = false;
|
1992 | 1994 |
|
1993 |
| - if ( chdir( avl->filename ) == -1 ) chdir_err( avl->filename ); |
| 1995 | + char* rpwd = realpath( ".", NULL ); |
| 1996 | + if ( ! rpwd ) { |
| 1997 | + read_err(); |
| 1998 | + } else { |
| 1999 | + |
| 2000 | + if ( ! err && chdir( avl->filename ) == -1 ) chdir_err( avl->filename ); |
| 2001 | + |
| 2002 | + if ( ! err ) err = generate_avl_tree_local( &avl->subdirectory, io_n ); |
| 2003 | + if ( ! err && chdir( rpwd ) == -1 ) chdir_err( rpwd ); |
1994 | 2004 |
|
1995 |
| - if ( ! err ) err = generate_avl_tree_local( &avl->subdirectory, io_n ); |
1996 |
| - if ( ! err && chdir( ".." ) == -1 ) chdir_err( ".." ); |
| 2005 | + free( rpwd ); |
| 2006 | + } |
1997 | 2007 | } else if ( S_ISREG( sb.st_mode ) ) {
|
1998 | 2008 | empty_dir = false;
|
1999 | 2009 | if ( sb.st_size > ULONG_MAX ) {
|
|
0 commit comments