Quoting Dwight Engen (dwight.en...@oracle.com):
> Moving these files should allow $lxcpath to be a read-only fs.

Thanks, nice cleanup too.  One concern though - lxc_monitor_sock_name()
just keeps making a longer and longer path, and it's limited to 108
bytes.  Is there any reason not to use an abstract unix sock for it?
The monitor-fifo doesn't have the length restriction so
$rundir/lxc/$lxcpath/monitor-fifo is ok for it.

> Signed-off-by: Dwight Engen <dwight.en...@oracle.com>
> ---
> Tested lxc-monitor and lxc-wait as root, do not have environment to test
> unprivileged user (XDG_RUNTIME_DIR) case but believe that should work.
> 
>  src/lxc/lxc_monitord.c | 17 +++++++--------
>  src/lxc/lxclock.c      |  5 +----
>  src/lxc/monitor.c      | 56 
> ++++++++++++++++++++++++++++++++++++++++++++------
>  src/lxc/monitor.h      |  2 ++
>  src/lxc/utils.c        | 10 +++++++++
>  src/lxc/utils.h        |  2 ++
>  6 files changed, 72 insertions(+), 20 deletions(-)
> 
> diff --git a/src/lxc/lxc_monitord.c b/src/lxc/lxc_monitord.c
> index c5e156e..fda6cf4 100644
> --- a/src/lxc/lxc_monitord.c
> +++ b/src/lxc/lxc_monitord.c
> @@ -76,11 +76,9 @@ static int lxc_monitord_fifo_create(struct lxc_monitor 
> *mon)
>       char fifo_path[PATH_MAX];
>       int ret;
>  
> -     ret = snprintf(fifo_path, sizeof(fifo_path), "%s/monitor-fifo", 
> mon->lxcpath);
> -     if (ret < 0 || ret >= sizeof(fifo_path)) {
> -             ERROR("lxcpath too long to monitor fifo");
> -             return -1;
> -     }
> +     ret = lxc_monitor_fifo_name(mon->lxcpath, fifo_path, sizeof(fifo_path), 
> 1);
> +     if (ret < 0)
> +             return ret;
>  
>       ret = mknod(fifo_path, S_IFIFO|S_IRUSR|S_IWUSR, 0);
>       if (ret < 0) {
> @@ -102,11 +100,10 @@ static int lxc_monitord_fifo_delete(struct lxc_monitor 
> *mon)
>       char fifo_path[PATH_MAX];
>       int ret;
>  
> -     ret = snprintf(fifo_path, sizeof(fifo_path), "%s/monitor-fifo", 
> mon->lxcpath);
> -     if (ret < 0 || ret >= sizeof(fifo_path)) {
> -             ERROR("lxcpath too long to monitor fifo");
> -             return -1;
> -     }
> +     ret = lxc_monitor_fifo_name(mon->lxcpath, fifo_path, sizeof(fifo_path), 
> 0);
> +     if (ret < 0)
> +             return ret;
> +
>       unlink(fifo_path);
>       return 0;
>  }
> diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c
> index 79ebf84..1d6a86c 100644
> --- a/src/lxc/lxclock.c
> +++ b/src/lxc/lxclock.c
> @@ -56,10 +56,7 @@ static char *lxclock_name(const char *p, const char *n)
>  
>       /* length of "/lock/lxc/" + $lxcpath + "/" + $lxcname + '\0' */
>       len = strlen("/lock/lxc/") + strlen(n) + strlen(p) + 2;
> -     rundir = getenv("XDG_RUNTIME_DIR");
> -     if (geteuid() == 0 || rundir == NULL)
> -             rundir = "/run";
> -
> +     rundir = get_rundir();
>       len += strlen(rundir);
>  
>       if ((dest = malloc(len)) == NULL)
> diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
> index 412d38f..bdcc581 100644
> --- a/src/lxc/monitor.c
> +++ b/src/lxc/monitor.c
> @@ -40,6 +40,7 @@
>  #include "af_unix.h"
>  
>  #include <lxc/log.h>
> +#include <lxc/lxclock.h>
>  #include <lxc/state.h>
>  #include <lxc/monitor.h>
>  #include <lxc/utils.h>
> @@ -47,17 +48,45 @@
>  lxc_log_define(lxc_monitor, lxc);
>  
>  /* routines used by monitor publishers (containers) */
> +int lxc_monitor_fifo_name(const char *lxcpath, char *fifo_path, size_t 
> fifo_path_sz,
> +                       int do_mkdirp)
> +{
> +     int ret;
> +     const char *rundir;
> +
> +     rundir = get_rundir();
> +     if (do_mkdirp) {
> +             ret = snprintf(fifo_path, fifo_path_sz, "%s/lxc/%s", rundir, 
> lxcpath);
> +             if (ret < 0 || ret >= fifo_path_sz) {
> +                     ERROR("rundir/lxcpath (%s/%s) too long for monitor 
> fifo", rundir, lxcpath);
> +                     return -1;
> +             }
> +             process_lock();
> +             ret = mkdir_p(fifo_path, 0755);
> +             process_unlock();
> +             if (ret < 0) {
> +                     ERROR("unable to create monitor fifo dir %s", 
> fifo_path);
> +                     return ret;
> +             }
> +     }
> +     ret = snprintf(fifo_path, fifo_path_sz, "%s/lxc/%s/monitor-fifo", 
> rundir, lxcpath);
> +     if (ret < 0 || ret >= fifo_path_sz) {
> +             ERROR("rundir/lxcpath (%s/%s) too long for monitor fifo", 
> rundir, lxcpath);
> +             return -1;
> +     }
> +     return 0;
> +}
> +
>  static void lxc_monitor_fifo_send(struct lxc_msg *msg, const char *lxcpath)
>  {
>       int fd,ret;
>       char fifo_path[PATH_MAX];
>  
>       BUILD_BUG_ON(sizeof(*msg) > PIPE_BUF); /* write not guaranteed atomic */
> -     ret = snprintf(fifo_path, sizeof(fifo_path), "%s/monitor-fifo", 
> lxcpath);
> -     if (ret < 0 || ret >= sizeof(fifo_path)) {
> -             ERROR("lxcpath too long to open monitor fifo");
> +
> +     ret = lxc_monitor_fifo_name(lxcpath, fifo_path, sizeof(fifo_path), 0);
> +     if (ret < 0)
>               return;
> -     }
>  
>       fd = open(fifo_path, O_WRONLY);
>       if (fd < 0) {
> @@ -98,6 +127,7 @@ int lxc_monitor_sock_name(const char *lxcpath, struct 
> sockaddr_un *addr) {
>       size_t len;
>       int ret;
>       char *sockname = &addr->sun_path[0]; // 1 for abstract
> +     const char *rundir;
>  
>       /* addr.sun_path is only 108 bytes.
>        * should we take a hash of lxcpath? a subset of it? ftok()? we need
> @@ -106,9 +136,23 @@ int lxc_monitor_sock_name(const char *lxcpath, struct 
> sockaddr_un *addr) {
>       memset(addr, 0, sizeof(*addr));
>       addr->sun_family = AF_UNIX;
>       len = sizeof(addr->sun_path) - 1;
> -     ret = snprintf(sockname, len, "%s/monitor-sock", lxcpath);
> +     rundir = get_rundir();
> +     ret = snprintf(sockname, len, "%s/lxc/%s", rundir, lxcpath);
> +     if (ret < 0 || ret >= len) {
> +             ERROR("rundir/lxcpath (%s/%s) too long for monitor unix 
> socket", rundir, lxcpath);
> +             return -1;
> +     }
> +     process_lock();
> +     ret = mkdir_p(sockname, 0755);
> +     process_unlock();
> +     if (ret < 0) {
> +             ERROR("unable to create monitor sock %s", sockname);
> +             return ret;
> +     }
> +
> +     ret = snprintf(sockname, len, "%s/lxc/%s/monitor-sock", rundir, 
> lxcpath);
>       if (ret < 0 || ret >= len) {
> -             ERROR("lxcpath too long for unix socket");
> +             ERROR("rundir/lxcpath (%s/%s) too long for monitor unix 
> socket", rundir, lxcpath);
>               return -1;
>       }
>       return 0;
> diff --git a/src/lxc/monitor.h b/src/lxc/monitor.h
> index 2a61091..8093919 100644
> --- a/src/lxc/monitor.h
> +++ b/src/lxc/monitor.h
> @@ -41,6 +41,8 @@ struct lxc_msg {
>  
>  extern int lxc_monitor_open(const char *lxcpath);
>  extern int lxc_monitor_sock_name(const char *lxcpath, struct sockaddr_un 
> *addr);
> +extern int lxc_monitor_fifo_name(const char *lxcpath, char *fifo_path,
> +                              size_t fifo_path_sz, int do_mkdirp);
>  extern void lxc_monitor_send_state(const char *name, lxc_state_t state,
>                           const char *lxcpath);
>  extern int lxc_monitord_spawn(const char *lxcpath);
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index ba0604a..2e66585 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -318,6 +318,16 @@ const char *default_lxc_path(void)
>       return lxc_global_config_value("lxcpath");
>  }
>  
> +const char *get_rundir()
> +{
> +     const char *rundir;
> +
> +     rundir = getenv("XDG_RUNTIME_DIR");
> +     if (geteuid() == 0 || rundir == NULL)
> +             rundir = "/run";
> +     return rundir;
> +}
> +
>  int wait_for_pid(pid_t pid)
>  {
>       int status, ret;
> diff --git a/src/lxc/utils.h b/src/lxc/utils.h
> index 1a7b551..9776d18 100644
> --- a/src/lxc/utils.h
> +++ b/src/lxc/utils.h
> @@ -37,6 +37,8 @@ extern int lxc_rmdir_onedev(char *path);
>  extern int lxc_setup_fs(void);
>  extern int get_u16(unsigned short *val, const char *arg, int base);
>  extern int mkdir_p(const char *dir, mode_t mode);
> +extern const char *get_rundir(void);
> +
>  /*
>   * Return a buffer containing the default container path.
>   * Caller must NOT free this buffer, since it may be static.
> -- 
> 1.8.1.4
> 

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to