time_t now;
#endif
FILE *f;
+ int isdir = 0;
#ifdef HAVE_STAT
now = time(0);
return 0;
}
#endif
- errno = 0;
- f = fopen(data->filespec, "r");
- if (f == NULL) {
- retval = errno;
- if (retval == 0)
- retval = ENOENT;
- return retval;
+
+#ifdef HAVE_STAT
+ isdir = S_ISDIR(st.st_mode);
+#endif
+ if (!isdir) {
+ errno = 0;
+ f = fopen(data->filespec, "r");
+ if (f == NULL)
+ return (errno != 0) ? errno : ENOENT;
+ set_cloexec_file(f);
}
- set_cloexec_file(f);
+
data->upd_serial++;
data->flags &= PROFILE_FILE_SHARED; /* FIXME same as '=' operator */
- retval = profile_parse_file(f, &data->root, ret_modspec);
- fclose(f);
+
+ if (isdir) {
+ retval = profile_process_directory(data->filespec, &data->root);
+ } else {
+ retval = profile_parse_file(f, &data->root, ret_modspec);
+ (void)fclose(f);
+ }
if (retval) {
return retval;
}
errcode_t profile_parse_file
(FILE *f, struct profile_node **root, char **ret_modspec);
+errcode_t profile_process_directory
+ (const char *dirname, struct profile_node **root);
+
errcode_t profile_write_tree_file
(struct profile_node *root, FILE *dstfile);
return 0;
}
+errcode_t profile_process_directory(const char *dirname,
+ struct profile_node **root)
+{
+ errcode_t retval;
+ struct profile_node *node;
+
+ *root = NULL;
+ retval = profile_create_node("(root)", 0, &node);
+ if (retval)
+ return retval;
+ retval = parse_include_dir(dirname, node);
+ if (retval) {
+ profile_free_node(node);
+ return retval;
+ }
+ *root = node;
+ return 0;
+}
+
/*
* Return TRUE if the string begins or ends with whitespace
*/