- const char **pats;
- if (list->num_pats >= list->num_allocated_pats) {
- pats = REALLOC(list->pats,
- sizeof(list->pats[0]) * (list->num_allocated_pats + 8));
- if (!pats)
- return WIMLIB_ERR_NOMEM;
- list->num_allocated_pats += 8;
- list->pats = pats;
- }
- list->pats[list->num_pats++] = pattern;
- return 0;
-}
-
-/* Parses the contents of the image capture configuration file and fills in a
- * `struct capture_config'. */
-static int init_capture_config(const char *_config_str, size_t config_len,
- const char *_prefix, struct capture_config *config)
-{
- char *config_str;
- char *prefix;
- char *p;
- char *eol;
- char *next_p;
- size_t bytes_remaining;
- enum pattern_type type = NONE;
- int ret;
- unsigned long line_no = 0;
-
- DEBUG("config_len = %zu", config_len);
- bytes_remaining = config_len;
- memset(config, 0, sizeof(*config));
- config_str = MALLOC(config_len);
- if (!config_str) {
- ERROR("Could not duplicate capture config string");
- return WIMLIB_ERR_NOMEM;
- }
- prefix = STRDUP(_prefix);
- if (!prefix) {
- FREE(config_str);
- return WIMLIB_ERR_NOMEM;
- }
-
- memcpy(config_str, _config_str, config_len);
- next_p = config_str;
- config->config_str = config_str;
- config->prefix = prefix;
- config->prefix_len = strlen(prefix);
- while (bytes_remaining) {
- line_no++;
- p = next_p;
- eol = memchr(p, '\n', bytes_remaining);
- if (!eol) {
- ERROR("Expected end-of-line in capture config file on "
- "line %lu", line_no);
- ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
- goto out_destroy;
- }
-
- next_p = eol + 1;
- bytes_remaining -= (next_p - p);
- if (eol == p)
- continue;
-
- if (*(eol - 1) == '\r')
- eol--;
- *eol = '\0';
-
- /* Translate backslash to forward slash */
- for (char *pp = p; pp != eol; pp++)
- if (*pp == '\\')
- *pp = '/';
-
- /* Remove drive letter */
- if (eol - p > 2 && isalpha(*p) && *(p + 1) == ':')
- p += 2;
-
- ret = 0;
- if (strcmp(p, "[ExclusionList]") == 0)
- type = EXCLUSION_LIST;
- else if (strcmp(p, "[ExclusionException]") == 0)
- type = EXCLUSION_EXCEPTION;
- else if (strcmp(p, "[CompressionExclusionList]") == 0)
- type = COMPRESSION_EXCLUSION_LIST;
- else if (strcmp(p, "[AlignmentList]") == 0)
- type = ALIGNMENT_LIST;
- else if (p[0] == '[' && strrchr(p, ']')) {
- ERROR("Unknown capture configuration section `%s'", p);
- ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
- } else switch (type) {
- case EXCLUSION_LIST:
- DEBUG("Adding pattern \"%s\" to exclusion list", p);
- ret = pattern_list_add_pattern(&config->exclusion_list, p);
- break;
- case EXCLUSION_EXCEPTION:
- DEBUG("Adding pattern \"%s\" to exclusion exception list", p);
- ret = pattern_list_add_pattern(&config->exclusion_exception, p);
- break;
- case COMPRESSION_EXCLUSION_LIST:
- DEBUG("Adding pattern \"%s\" to compression exclusion list", p);
- ret = pattern_list_add_pattern(&config->compression_exclusion_list, p);
- break;
- case ALIGNMENT_LIST:
- DEBUG("Adding pattern \"%s\" to alignment list", p);
- ret = pattern_list_add_pattern(&config->alignment_list, p);
- break;
- default:
- ERROR("Line %lu of capture configuration is not "
- "in a block (such as [ExclusionList])",
- line_no);
- ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
- break;
- }
- if (ret != 0)
- goto out_destroy;
- }
- return 0;
-out_destroy:
- destroy_capture_config(config);
- return ret;
-}
-
-static bool match_pattern(const char *path, const char *path_basename,
- const struct pattern_list *list)
-{
- for (size_t i = 0; i < list->num_pats; i++) {
- const char *pat = list->pats[i];
- const char *string;
- if (pat[0] == '/')
- /* Absolute path from root of capture */
- string = path;
- else {
- if (strchr(pat, '/'))
- /* Relative path from root of capture */
- string = path + 1;
- else
- /* A file name pattern */
- string = path_basename;
+ struct wimlib_update_command *add_cmds;
+
+ DEBUG("Translating %zu capture sources to wimlib_update_command's",
+ num_sources);
+ add_cmds = CALLOC(num_sources, sizeof(add_cmds[0]));
+ if (add_cmds) {
+ for (size_t i = 0; i < num_sources; i++) {
+ DEBUG("Source %zu of %zu: fs_source_path=\"%"TS"\", "
+ "wim_target_path=\"%"TS"\"",
+ i + 1, num_sources,
+ sources[i].fs_source_path,
+ sources[i].wim_target_path);
+ add_cmds[i].op = WIMLIB_UPDATE_OP_ADD;
+ add_cmds[i].add.add_flags = add_image_flags;
+ add_cmds[i].add.config = (struct wimlib_capture_config*)config;
+ add_cmds[i].add.fs_source_path = sources[i].fs_source_path;
+ add_cmds[i].add.wim_target_path = sources[i].wim_target_path;