On 01/16/2013 05:37 PM, Serge Hallyn wrote:
> Quoting Stéphane Graber (stgra...@ubuntu.com):
> ...
>> We probably should have code to actually create the path if it's
>> missing, similar to what's done for /var/lib/lxc and /var/cache/lxc.
> 
> How about the following patch on top of the original?
> 
> log_open: make sure the parent directory for logfiles
> 
> Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>

Acked-by: Stéphane Graber <stgra...@ubuntu.com>

And pushed to staging. Thanks.

> ---
>  src/lxc/log.c | 45 +++++++++++++++++++++++++++++++++++----------
>  1 file changed, 35 insertions(+), 10 deletions(-)
> 
> diff --git a/src/lxc/log.c b/src/lxc/log.c
> index db5c52f..dc0aa31 100644
> --- a/src/lxc/log.c
> +++ b/src/lxc/log.c
> @@ -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);
> 


-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnnow-d2d
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to