]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
use a default per-container logfile
authorSerge Hallyn <serge.hallyn@canonical.com>
Wed, 16 Jan 2013 22:37:46 +0000 (16:37 -0600)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 22 Jan 2013 22:56:10 +0000 (17:56 -0500)
log_open: make sure the parent directory for logfiles

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/log.c

index db5c52f369aaeafb4dbab194416cae633589c6e3..dc0aa313acb32e9e02cc48752468bc5e54e94f1d 100644 (file)
@@ -125,12 +125,47 @@ extern void lxc_log_setprefix(const char *prefix)
        log_prefix[sizeof(log_prefix) - 1] = 0;
 }
 
+static int build_dir(const char *name)
+{
+       char *n = strdup(name);  // because we'll be modifying it
+       char *p, *e;
+       int ret;
+
+       if (!n) {
+               ERROR("Out of memory while creating directory '%s'.", name);
+               return -1;
+       }
+
+       e = &n[strlen(n)];
+       for (p = n+1; p < e; p++) {
+               if (*p != '/')
+                       continue;
+               *p = '\0';
+               if (access(n, F_OK)) {
+                       ret = lxc_unpriv(mkdir(n, 0755));
+                       if (ret && errno != -EEXIST) {
+                               SYSERROR("failed to create directory '%s'.", n);
+                               free(n);
+                               return -1;
+                       }
+               }
+               *p = '/';
+       }
+       free(n);
+       return 0;
+}
+
 /*---------------------------------------------------------------------------*/
 static int log_open(const char *name)
 {
        int fd;
        int newfd;
 
+       if (build_dir(name)) {
+               ERROR("failed to create dir for log file \"%s\" : %s", name,
+                     strerror(errno));
+               return -1;
+       }
        fd = lxc_unpriv(open(name, O_CREAT | O_WRONLY |
                             O_APPEND | O_CLOEXEC, 0666));
        if (fd == -1) {
@@ -160,16 +195,6 @@ static char *build_log_path(const char *name)
        p = malloc(len);
        if (!p)
                return p;
-       ret = snprintf(p, len, "%s/%s", LOGPATH, name);
-       if (ret < 0 || ret >= len) {
-               free(p);
-               return NULL;
-       }
-       ret = mkdir(p, 0755);
-       if (ret == -1 && errno != EEXIST) {
-               free(p);
-               return NULL;
-       }
        ret = snprintf(p, len, "%s/%s/%s.log", LOGPATH, name, name);
        if (ret < 0 || ret >= len) {
                free(p);