|
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, 0) |
| 333 | + |
332 | 334 | #include "win32/getopt.c" |
333 | 335 | #if defined(_MSC_VER) |
334 | 336 | #include "win32/asprintf.c" |
@@ -1722,24 +1724,30 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep |
1722 | 1724 | context.progress = in_context->progress; |
1723 | 1725 | context.final_bytes = in_context->final_bytes; |
1724 | 1726 |
|
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); |
1743 | 1751 |
|
1744 | 1752 | if ( context.path ) free( context.path ); |
1745 | 1753 | } else { |
@@ -1990,10 +1998,18 @@ int generate_avl_tree_local( dir_node_avl **out_root, int *io_n ) { |
1990 | 1998 | if ( S_ISDIR( sb.st_mode ) ) { |
1991 | 1999 | empty_dir = false; |
1992 | 2000 |
|
1993 | | - if ( chdir( avl->filename ) == -1 ) chdir_err( avl->filename ); |
| 2001 | + char* rpwd = realpath( ".", NULL ); |
| 2002 | + if ( ! rpwd ) { |
| 2003 | + read_err(); |
| 2004 | + } else { |
1994 | 2005 |
|
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 | + } |
1997 | 2013 | } else if ( S_ISREG( sb.st_mode ) ) { |
1998 | 2014 | empty_dir = false; |
1999 | 2015 | if ( sb.st_size > ULONG_MAX ) { |
|
0 commit comments