[lxc-devel] [PATCH] implement lxc.include for directories
Serge Hallyn
serge.hallyn at ubuntu.com
Fri Jan 16 19:22:17 UTC 2015
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 <serge.hallyn at ubuntu.com>
---
src/lxc/bdev.c | 9 ---------
src/lxc/confile.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/lxc/utils.c | 9 +++++++++
src/lxc/utils.h | 1 +
4 files changed, 65 insertions(+), 9 deletions(-)
diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
index 5c6b00a..c0cc050 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 0366959..e73f97c 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -37,6 +37,7 @@
#include <netinet/in.h>
#include <net/if.h>
#include <time.h>
+#include <dirent.h>
#include "parse.h"
#include "config.h"
@@ -1663,9 +1664,63 @@ 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;
+INFO("looking at %s", fnam);
+ 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;
+ }
+INFO("reading %s", path);
+
+ ret = lxc_config_read(path, lxc_conf, true);
+ if (ret < 0)
+ goto out;
+ }
+ ret = 0;
+
+out:
+INFO("returning %d", ret);
+ 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 2037ef0..23b1b11 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 5ffafca..ae2c851 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);
--
2.1.0
More information about the lxc-devel
mailing list