X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=programs%2Fimagex.c;h=580e65acd530fbd3f95f193246f154ef2814805d;hb=9fb3aaca115429b0af2a623bf20bfceef74f047f;hp=f635e08613ec9e2447db625f41372784e301ab08;hpb=811a38dfe05ef337e2d627f654f8a3e559900790;p=wimlib diff --git a/programs/imagex.c b/programs/imagex.c index f635e086..580e65ac 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -29,7 +29,7 @@ #include #include #include -#include + #include #include #include @@ -43,6 +43,12 @@ #include #endif +#ifdef __WIN32__ +# include "imagex-win32.h" +#else +# include +#endif + #define ARRAY_LEN(array) (sizeof(array) / sizeof(array[0])) #define for_opt(c, opts) while ((c = getopt_long_only(argc, (char**)argv, "", \ @@ -733,6 +739,7 @@ static int open_swms_from_glob(const char *swm_glob, glob_t globbuf; int ret; + /* Warning: glob() is replaced in Windows native builds */ ret = glob(swm_glob, GLOB_ERR | GLOB_NOSORT, NULL, &globbuf); if (ret != 0) { if (ret == GLOB_NOMATCH) { @@ -893,11 +900,17 @@ static int imagex_apply(int argc, char **argv) } } +#ifdef __WIN32__ + win32_acquire_restore_privileges(); +#endif ret = wimlib_extract_image(w, image, target, extract_flags, additional_swms, num_additional_swms, imagex_progress_func); if (ret == 0) printf("Done applying WIM image.\n"); +#ifdef __WIN32__ + win32_release_restore_privileges(); +#endif out: wimlib_free(w); if (additional_swms) { @@ -1074,6 +1087,9 @@ static int imagex_capture_or_append(int argc, char **argv) } } } +#ifdef __WIN32__ + win32_acquire_capture_privileges(); +#endif ret = wimlib_add_image_multisource(w, capture_sources, num_sources, name, @@ -1084,17 +1100,17 @@ static int imagex_capture_or_append(int argc, char **argv) add_image_flags, imagex_progress_func); if (ret != 0) - goto out; + goto out_release_privs; cur_image = wimlib_get_num_images(w); if (desc) { ret = wimlib_set_image_descripton(w, cur_image, desc); if (ret != 0) - goto out; + goto out_release_privs; } if (flags_element) { ret = wimlib_set_image_flags(w, cur_image, flags_element); if (ret != 0) - goto out; + goto out_release_privs; } if (cmd == APPEND) { ret = wimlib_overwrite(w, write_flags, num_threads, @@ -1107,6 +1123,10 @@ static int imagex_capture_or_append(int argc, char **argv) ret = 0; if (ret != 0) imagex_error("Failed to write the WIM file `%s'", wimfile); +out_release_privs: +#ifdef __WIN32__ + win32_release_capture_privileges(); +#endif out: wimlib_free(w); free(config_str); @@ -1322,9 +1342,10 @@ static int imagex_export(int argc, char **argv) wim_is_new = false; /* Destination file exists. */ - if (!S_ISREG(stbuf.st_mode) && !S_ISLNK(stbuf.st_mode)) { + + if (!S_ISREG(stbuf.st_mode)) { imagex_error("`%s' is not a regular file", - dest_wimfile); + dest_wimfile); ret = -1; goto out; } @@ -2124,14 +2145,14 @@ int main(int argc, char **argv) for_imagex_command(cmd) { if (strcmp(cmd->name, *argv) == 0) { ret = cmd->func(argc, argv); - goto out; + goto out_check_write_error; } } imagex_error("Unrecognized command: `%s'", argv[0]); usage_all(); return 1; -out: +out_check_write_error: /* For 'imagex info' and 'imagex dir', data printed to standard output * is part of the program's actual behavior and not just for * informational purposes, so we should set a failure exit status if @@ -2143,7 +2164,7 @@ out: ret = -1; } } - +out: /* Exit status (ret): -1 indicates an error found by 'imagex' outside * of the wimlib library code. 0 indicates success. > 0 indicates a * wimlib error code from which an error message can be printed. */