-enum pattern_type {
- NONE = 0,
- EXCLUSION_LIST,
- EXCLUSION_EXCEPTION,
- COMPRESSION_EXCLUSION_LIST,
- ALIGNMENT_LIST,
-};
-
-#define COMPAT_DEFAULT_CONFIG
-
-/* Default capture configuration file when none is specified. */
-static const tchar *default_config =
-#ifdef COMPAT_DEFAULT_CONFIG /* XXX: This policy is being moved to library
- users. The next ABI-incompatible library
- version will default to the empty string here. */
-T(
-"[ExclusionList]\n"
-"\\$ntfs.log\n"
-"\\hiberfil.sys\n"
-"\\pagefile.sys\n"
-"\\System Volume Information\n"
-"\\RECYCLER\n"
-"\\Windows\\CSC\n"
-);
-#else
-T("");
-#endif
-
-static void
-destroy_pattern_list(struct pattern_list *list)
-{
- FREE(list->pats);
-}
-
-static void
-destroy_capture_config(struct capture_config *config)
-{
- destroy_pattern_list(&config->exclusion_list);
- destroy_pattern_list(&config->exclusion_exception);
- destroy_pattern_list(&config->compression_exclusion_list);
- destroy_pattern_list(&config->alignment_list);
- FREE(config->config_str);
- memset(config, 0, sizeof(*config));
-}
-
-static int
-pattern_list_add_pattern(struct pattern_list *list, const tchar *pattern)
-{
- const tchar **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(struct capture_config *config,
- const tchar *_config_str,
- size_t config_num_tchars)
-{
- tchar *config_str;
- tchar *p;
- tchar *eol;
- tchar *next_p;
- size_t num_tchars_remaining;
- enum pattern_type type = NONE;
- int ret;
- unsigned long line_no = 0;
-
- DEBUG("config_num_tchars = %zu", config_num_tchars);
- num_tchars_remaining = config_num_tchars;
- memset(config, 0, sizeof(*config));
- config_str = TMALLOC(config_num_tchars);
- if (!config_str) {
- ERROR("Could not duplicate capture config string");
- return WIMLIB_ERR_NOMEM;
- }
-
- tmemcpy(config_str, _config_str, config_num_tchars);
- next_p = config_str;
- config->config_str = config_str;
- while (num_tchars_remaining != 0) {
- line_no++;
- p = next_p;
- eol = tmemchr(p, T('\n'), num_tchars_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;
- num_tchars_remaining -= (next_p - p);
- if (eol == p)
- continue;
-
- if (*(eol - 1) == T('\r'))
- eol--;
- *eol = T('\0');
-
- /* Translate backslash to forward slash */
- for (tchar *pp = p; pp != eol; pp++)
- if (*pp == T('\\'))
- *pp = T('/');
-
- /* Check if the path begins with a drive letter */
- if (eol - p > 2 && *p != T('/') && *(p + 1) == T(':')) {
- /* Don't allow relative paths on other drives */
- if (eol - p < 3 || *(p + 2) != T('/')) {
- ERROR("Relative paths including a drive letter "
- "are not allowed!\n"
- " Perhaps you meant "
- "\"%"TS":/%"TS"\"?\n",
- *p, p + 2);
- ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
- goto out_destroy;
- }
- #ifndef __WIN32__
- /* UNIX: strip the drive letter */
- p += 2;
- #endif
- }
-
- ret = 0;
- if (!tstrcmp(p, T("[ExclusionList]")))
- type = EXCLUSION_LIST;
- else if (!tstrcmp(p, T("[ExclusionException]")))
- type = EXCLUSION_EXCEPTION;
- else if (!tstrcmp(p, T("[CompressionExclusionList]")))
- type = COMPRESSION_EXCLUSION_LIST;
- else if (!tstrcmp(p, T("[AlignmentList]")))
- type = ALIGNMENT_LIST;
- else if (p[0] == T('[') && tstrrchr(p, T(']'))) {
- ERROR("Unknown capture configuration section \"%"TS"\"", p);
- ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
- } else switch (type) {
- case EXCLUSION_LIST:
- DEBUG("Adding pattern \"%"TS"\" to exclusion list", p);
- ret = pattern_list_add_pattern(&config->exclusion_list, p);
- break;
- case EXCLUSION_EXCEPTION:
- DEBUG("Adding pattern \"%"TS"\" to exclusion exception list", p);
- ret = pattern_list_add_pattern(&config->exclusion_exception, p);
- break;
- case COMPRESSION_EXCLUSION_LIST:
- DEBUG("Adding pattern \"%"TS"\" to compression exclusion list", p);
- ret = pattern_list_add_pattern(&config->compression_exclusion_list, p);
- break;
- case ALIGNMENT_LIST:
- DEBUG("Adding pattern \"%"TS"\" 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
-is_absolute_path(const tchar *path)
-{
- if (*path == T('/'))
- return true;
-#ifdef __WIN32__
- /* Drive letter */
- if (*path && *(path + 1) == T(':'))
- return true;
-#endif
- return false;
-}
-