#include <ctype.h>
#include <errno.h>
#include <getopt.h>
-#include <glob.h>
+
#include <inttypes.h>
#include <libgen.h>
#include <limits.h>
#include <alloca.h>
#endif
+#ifdef __WIN32__
+# include "imagex-win32.h"
+#else
+# include <glob.h>
+#endif
+
#define ARRAY_LEN(array) (sizeof(array) / sizeof(array[0]))
#define for_opt(c, opts) while ((c = getopt_long_only(argc, (char**)argv, "", \
/*
* Parses a filename in the source list file format. (See the man page for
* 'imagex capture' for details on this format and the meaning.) Accepted
- * formats for filenames are an unquoted string, whitespace-delimited, or a
+ * formats for filenames are an unquoted string (whitespace-delimited), or a
* double or single-quoted string.
*
* @line_p: Pointer to the pointer to the line of data. Will be updated
p = source_list_contents;
j = 0;
for (i = 0; i < nlines; i++) {
- char *endp = strchr(p, '\n');
+ /* XXX: Could use rawmemchr() here instead, but it may not be
+ * available on all platforms. */
+ char *endp = memchr(p, '\n', source_list_nbytes);
size_t len = endp - p + 1;
*endp = '\0';
if (!is_comment_line(p, len)) {
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) {
}
}
+#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) {
}
}
}
+#ifdef __WIN32__
+ win32_acquire_capture_privileges();
+#endif
ret = wimlib_add_image_multisource(w, capture_sources,
num_sources, name,
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,
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);
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;
}
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
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. */