+static const char *file_get_contents(const char *filename, size_t *len_ret)
+{
+ struct stat stbuf;
+ char *buf;
+ size_t len;
+ FILE *fp;
+
+ if (stat(filename, &stbuf) != 0) {
+ imagex_error_with_errno("Failed to stat the file `%s'", filename);
+ return NULL;
+ }
+ len = stbuf.st_size;
+
+ fp = fopen(filename, "rb");
+ if (!fp) {
+ imagex_error_with_errno("Failed to open the file `%s'", filename);
+ return NULL;
+ }
+
+ buf = malloc(len);
+ if (!buf) {
+ imagex_error("Failed to allocate buffer of %zu bytes to hold "
+ "contents of file `%s'", len, filename);
+ goto out_fclose;
+ }
+ if (fread(buf, 1, len, fp) != len) {
+ imagex_error_with_errno("Failed to read %lu bytes from the "
+ "file `%s'", len, filename);
+ goto out_free_buf;
+ }
+ *len_ret = len;
+ return buf;
+out_free_buf:
+ free(buf);
+out_fclose:
+ fclose(fp);
+ return NULL;
+}
+
+static int open_swms_from_glob(const char *swm_glob,
+ const char *first_part,
+ int open_flags,
+ WIMStruct ***additional_swms_ret,
+ unsigned *num_additional_swms_ret)
+{
+ unsigned num_additional_swms = 0;
+ WIMStruct **additional_swms = NULL;
+ glob_t globbuf;
+ int ret;
+
+ ret = glob(swm_glob, GLOB_ERR | GLOB_NOSORT, NULL, &globbuf);
+ if (ret != 0) {
+ if (ret == GLOB_NOMATCH) {
+ imagex_error("Found no files for glob \"%s\"",
+ swm_glob);
+ } else {
+ imagex_error_with_errno("Failed to process glob "
+ "\"%s\"", swm_glob);
+ }
+ ret = -1;
+ goto out;
+ }
+ num_additional_swms = globbuf.gl_pathc;
+ additional_swms = calloc(num_additional_swms, sizeof(additional_swms[0]));
+ if (!additional_swms) {
+ imagex_error("Out of memory");
+ ret = -1;
+ goto out_globfree;
+ }
+ size_t offset = 0;
+ for (size_t i = 0; i < num_additional_swms; i++) {
+ if (strcmp(globbuf.gl_pathv[i], first_part) == 0) {
+ offset++;
+ continue;
+ }
+ ret = wimlib_open_wim(globbuf.gl_pathv[i],
+ open_flags | WIMLIB_OPEN_FLAG_SPLIT_OK,
+ &additional_swms[i - offset]);
+ if (ret != 0)
+ goto out_close_swms;
+ }
+ *additional_swms_ret = additional_swms;
+ *num_additional_swms_ret = num_additional_swms - offset;
+ ret = 0;
+ goto out_globfree;
+out_close_swms:
+ for (unsigned i = 0; i < num_additional_swms; i++)
+ wimlib_free(additional_swms[i]);
+ free(additional_swms);
+out_globfree:
+ globfree(&globbuf);
+out:
+ return ret;
+}
+