From: Serge Hallyn Date: Fri, 16 Jan 2015 20:22:46 +0000 (+0000) Subject: implement lxc.include for directories X-Git-Tag: lxc-1.1.0.rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1daebd9051199fab633b42de95a3515faa26a80;p=thirdparty%2Flxc.git implement lxc.include for directories If you have 'lxc.include = /some/dir' and /some/dir is a directory, then any '*.conf" files under /some/dir will be read. Signed-off-by: Serge Hallyn Acked-by: Stéphane Graber --- diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c index 5c6b00a22..c0cc050d1 100644 --- a/src/lxc/bdev.c +++ b/src/lxc/bdev.c @@ -357,15 +357,6 @@ struct bdev_type { const struct bdev_ops *ops; }; -static int is_dir(const char *path) -{ - struct stat statbuf; - int ret = stat(path, &statbuf); - if (ret == 0 && S_ISDIR(statbuf.st_mode)) - return 1; - return 0; -} - static int dir_detect(const char *path) { if (strncmp(path, "dir:", 4) == 0) diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 036695935..1d429415a 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -37,6 +37,7 @@ #include #include #include +#include #include "parse.h" #include "config.h" @@ -1663,9 +1664,60 @@ int append_unexp_config_line(const char *line, struct lxc_conf *conf) return 0; } +static int do_includedir(const char *dirp, struct lxc_conf *lxc_conf) +{ + struct dirent dirent, *direntp; + DIR *dir; + char path[MAXPATHLEN]; + int ret = -1, len; + + dir = opendir(dirp); + if (!dir) { + SYSERROR("failed to open '%s'", dirp); + return -1; + } + + while (!readdir_r(dir, &dirent, &direntp)) { + const char *fnam; + if (!direntp) + break; + + fnam = direntp->d_name; + if (!strcmp(fnam, ".")) + continue; + + if (!strcmp(fnam, "..")) + continue; + + len = strlen(fnam); + if (len < 6 || strncmp(fnam+len-5, ".conf", 5) != 0) + continue; + len = snprintf(path, MAXPATHLEN, "%s/%s", dirp, fnam); + if (len < 0 || len >= MAXPATHLEN) { + ERROR("lxc.include filename too long under '%s'", dirp); + ret = -1; + goto out; + } + + ret = lxc_config_read(path, lxc_conf, true); + if (ret < 0) + goto out; + } + ret = 0; + +out: + if (closedir(dir)) + WARN("lxc.include dir: failed to close directory"); + + return ret; +} + static int config_includefile(const char *key, const char *value, struct lxc_conf *lxc_conf) { + if (is_dir(value)) + return do_includedir(value, lxc_conf); + return lxc_config_read(value, lxc_conf, true); } diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 2037ef00f..23b1b11ef 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -1497,3 +1497,12 @@ int print_to_file(const char *file, const char *content) fclose(f); return ret; } + +int is_dir(const char *path) +{ + struct stat statbuf; + int ret = stat(path, &statbuf); + if (ret == 0 && S_ISDIR(statbuf.st_mode)) + return 1; + return 0; +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 5ffafca50..ae2c851e2 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -284,3 +284,4 @@ bool file_exists(const char *f); char *choose_init(const char *rootfs); int print_to_file(const char *file, const char *content); bool switch_to_ns(pid_t pid, const char *ns); +int is_dir(const char *path);