Commit e1daebd9 by Serge Hallyn Committed by Stéphane Graber

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: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com> Acked-by: 's avatarStéphane Graber <stgraber@ubuntu.com>
parent 9cb4d183
...@@ -357,15 +357,6 @@ struct bdev_type { ...@@ -357,15 +357,6 @@ struct bdev_type {
const struct bdev_ops *ops; 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) static int dir_detect(const char *path)
{ {
if (strncmp(path, "dir:", 4) == 0) if (strncmp(path, "dir:", 4) == 0)
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <net/if.h> #include <net/if.h>
#include <time.h> #include <time.h>
#include <dirent.h>
#include "parse.h" #include "parse.h"
#include "config.h" #include "config.h"
...@@ -1663,9 +1664,60 @@ int append_unexp_config_line(const char *line, struct lxc_conf *conf) ...@@ -1663,9 +1664,60 @@ int append_unexp_config_line(const char *line, struct lxc_conf *conf)
return 0; 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, static int config_includefile(const char *key, const char *value,
struct lxc_conf *lxc_conf) struct lxc_conf *lxc_conf)
{ {
if (is_dir(value))
return do_includedir(value, lxc_conf);
return lxc_config_read(value, lxc_conf, true); return lxc_config_read(value, lxc_conf, true);
} }
......
...@@ -1497,3 +1497,12 @@ int print_to_file(const char *file, const char *content) ...@@ -1497,3 +1497,12 @@ int print_to_file(const char *file, const char *content)
fclose(f); fclose(f);
return ret; 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;
}
...@@ -284,3 +284,4 @@ bool file_exists(const char *f); ...@@ -284,3 +284,4 @@ bool file_exists(const char *f);
char *choose_init(const char *rootfs); char *choose_init(const char *rootfs);
int print_to_file(const char *file, const char *content); int print_to_file(const char *file, const char *content);
bool switch_to_ns(pid_t pid, const char *ns); bool switch_to_ns(pid_t pid, const char *ns);
int is_dir(const char *path);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment