diff options
author | Stef Walter <stef@memberwebs.com> | 2006-03-01 00:44:06 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2006-03-01 00:44:06 +0000 |
commit | b97cb618663bacba6ef4281a15a361599acff931 (patch) | |
tree | 74a615b0d4860b2bf97eda8404e0c2a330cf6cc2 /common | |
parent | 90939533e330a18e8817d95c7a54aa8f7eabe9f0 (diff) |
Support config files in a config directory tree in rrdbot and tools.
Diffstat (limited to 'common')
-rw-r--r-- | common/config-parser.c | 76 |
1 files changed, 60 insertions, 16 deletions
diff --git a/common/config-parser.c b/common/config-parser.c index 23f57a4..905e019 100644 --- a/common/config-parser.c +++ b/common/config-parser.c @@ -226,39 +226,58 @@ finally: return ret; } -int -cfg_parse_dir(const char* dirname, void* data) +static int +parse_dir_internal(const char* subdir, void* data) { - char olddir[MAXPATHLEN]; + char path[MAXPATHLEN]; struct dirent* dire; - char *memory; + char* memory; DIR* dir; + int r; - ASSERT(dirname != NULL); - - if(!getcwd(olddir, MAXPATHLEN)) - olddir[0] = 0; - - if(chdir(dirname) == -1) - errmsg(NULL, data, "couldn't list config directory: %s", dirname); - - dir = opendir("."); + /* Open specified or current directory */ + dir = opendir(subdir ? subdir : "."); if(!dir) { - errmsg(NULL, data, "couldn't list config directory: %s", dirname); + errmsg(NULL, data, "couldn't list config directory: %s", + subdir ? subdir : "."); return -1; } while((dire = readdir(dir)) != NULL) { + /* Build a file path to this entry */ + if(subdir) + { + strlcpy(path, subdir, MAXPATHLEN); + strlcat(path, "/", MAXPATHLEN); + strlcat(path, dire->d_name, MAXPATHLEN); + } + else + strlcpy(path, dire->d_name, MAXPATHLEN); + + /* Descend into each sub directory */ + if(dire->d_type == DT_DIR) + { + /* No hidden or dot directories */ + if(dire->d_name[0] == '.') + continue; + + r = parse_dir_internal(path, data); + if(r < 0) + return r; + + continue; + } + if(dire->d_type != DT_REG && dire->d_type != DT_LNK) continue; /* Build a happy path name */ - cfg_parse_file(dire->d_name, data, &memory); + cfg_parse_file(path, data, &memory); /* We call it with blanks after files */ - if(cfg_value(dire->d_name, NULL, NULL, NULL, data) == -1) + if(cfg_value(path, NULL, NULL, NULL, data) == -1) break; /* Keep the memory around */ @@ -270,3 +289,28 @@ cfg_parse_dir(const char* dirname, void* data) return 0; } + +int +cfg_parse_dir(const char* dirname, void* data) +{ + char olddir[MAXPATHLEN]; + int ret; + + ASSERT(dirname != NULL); + + if(!getcwd(olddir, MAXPATHLEN)) + olddir[0] = 0; + + if(chdir(dirname) == -1) + { + errmsg(NULL, data, "couldn't list config directory: %s", dirname); + return -1; + } + + ret = parse_dir_internal(NULL, data); + + if(olddir[0]) + chdir(olddir); + + return ret; +} |