This is needed for lxc_wait and lxc_monitor to handle lxcpath.  However,
the full path name is limited to 108 bytes.  Should we use a md5sum of
the lxcpath instead of the path itself?

In any case, with this patch, lxc-wait and lxc-monitor work right with
respect to multiple lxcpaths.

The lxcpath is added to the lxc_handler to make it available most of the
places we need it.

I also remove function prototypes in monitor.h for two functions which
are not defined or used anywhere.

TODO: make cgroups tolerate multiple same-named containers.

Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
---
 src/lxc/freezer.c      | 14 +++++++-------
 src/lxc/lxc.h          |  6 +++---
 src/lxc/lxc_freeze.c   |  2 +-
 src/lxc/lxc_monitor.c  |  2 +-
 src/lxc/lxc_unfreeze.c |  2 +-
 src/lxc/lxccontainer.c |  4 ++--
 src/lxc/monitor.c      | 36 ++++++++++++++++++++++++++++--------
 src/lxc/monitor.h      |  5 ++---
 src/lxc/start.c        |  3 ++-
 src/lxc/start.h        |  1 +
 src/lxc/state.c        |  2 +-
 src/lxc/stop.c         |  2 +-
 12 files changed, 50 insertions(+), 29 deletions(-)

diff --git a/src/lxc/freezer.c b/src/lxc/freezer.c
index 3e4f55d..e8b1311 100644
--- a/src/lxc/freezer.c
+++ b/src/lxc/freezer.c
@@ -40,7 +40,7 @@
 
 lxc_log_define(lxc_freezer, lxc);
 
-static int freeze_unfreeze(const char *name, int freeze)
+static int freeze_unfreeze(const char *name, int freeze, const char *lxcpath)
 {
        char *nsgroup;
        char freezer[MAXPATHLEN], *f;
@@ -98,7 +98,7 @@ static int freeze_unfreeze(const char *name, int freeze)
                ret = strncmp(f, tmpf, strlen(f));
                if (!ret)
                {
-                       lxc_monitor_send_state(name, freeze ? FROZEN : THAWED);
+                       lxc_monitor_send_state(name, freeze ? FROZEN : THAWED, 
lxcpath);
                        break;          /* Success */
                }
 
@@ -122,14 +122,14 @@ out:
        return ret;
 }
 
-int lxc_freeze(const char *name)
+int lxc_freeze(const char *name, const char *lxcpath)
 {
-       lxc_monitor_send_state(name, FREEZING);
-       return freeze_unfreeze(name, 1);
+       lxc_monitor_send_state(name, FREEZING, lxcpath);
+       return freeze_unfreeze(name, 1, lxcpath);
 }
 
-int lxc_unfreeze(const char *name)
+int lxc_unfreeze(const char *name, const char *lxcpath)
 {
-       return freeze_unfreeze(name, 0);
+       return freeze_unfreeze(name, 0, lxcpath);
 }
 
diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h
index 4e770a6..0fa9480 100644
--- a/src/lxc/lxc.h
+++ b/src/lxc/lxc.h
@@ -74,7 +74,7 @@ extern int lxc_execute(const char *name, char *const argv[], 
int quiet,
  * The function will return an fd corresponding to the events
  * Returns a file descriptor on success, < 0 otherwise
  */
-extern int lxc_monitor_open(void);
+extern int lxc_monitor_open(const char *lxcpath);
 
 /*
  * Read the state of the container if this one has changed
@@ -108,14 +108,14 @@ extern int lxc_console(const char *name, int ttynum, int 
*fd, const char *lxcpat
  * @name : the container name
  * Returns 0 on success, < 0 otherwise
  */
-extern int lxc_freeze(const char *name);
+extern int lxc_freeze(const char *name, const char *lxcpath);
 
 /*
  * Unfreeze all previously frozen tasks.
  * @name : the name of the container
  * Return 0 on sucess, < 0 otherwise
  */
-extern int lxc_unfreeze(const char *name);
+extern int lxc_unfreeze(const char *name, const char *lxcpath);
 
 /*
  * Retrieve the container state
diff --git a/src/lxc/lxc_freeze.c b/src/lxc/lxc_freeze.c
index 4da5654..77d5388 100644
--- a/src/lxc/lxc_freeze.c
+++ b/src/lxc/lxc_freeze.c
@@ -58,6 +58,6 @@ int main(int argc, char *argv[])
                         my_args.progname, my_args.quiet))
                return -1;
 
-       return lxc_freeze(my_args.name);
+       return lxc_freeze(my_args.name, my_args.lxcpath);
 }
 
diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
index 2b8b0a0..b308019 100644
--- a/src/lxc/lxc_monitor.c
+++ b/src/lxc/lxc_monitor.c
@@ -87,7 +87,7 @@ int main(int argc, char *argv[])
                return -1;
        }
 
-       fd = lxc_monitor_open();
+       fd = lxc_monitor_open(my_args.lxcpath);
        if (fd < 0)
                return -1;
 
diff --git a/src/lxc/lxc_unfreeze.c b/src/lxc/lxc_unfreeze.c
index 02e9a47..4a9ecd1 100644
--- a/src/lxc/lxc_unfreeze.c
+++ b/src/lxc/lxc_unfreeze.c
@@ -57,6 +57,6 @@ int main(int argc, char *argv[])
                         my_args.progname, my_args.quiet))
                return -1;
 
-       return lxc_unfreeze(my_args.name);
+       return lxc_unfreeze(my_args.name, my_args.lxcpath);
 }
 
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 1e257c0..f24c39f 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -195,7 +195,7 @@ static bool lxcapi_freeze(struct lxc_container *c)
 
        if (lxclock(c->slock, 0))
                return false;
-       ret = lxc_freeze(c->name);
+       ret = lxc_freeze(c->name, c->config_path);
        lxcunlock(c->slock);
        if (ret)
                return false;
@@ -210,7 +210,7 @@ static bool lxcapi_unfreeze(struct lxc_container *c)
 
        if (lxclock(c->slock, 0))
                return false;
-       ret = lxc_unfreeze(c->name);
+       ret = lxc_unfreeze(c->name, c->config_path);
        lxcunlock(c->slock);
        if (ret)
                return false;
diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
index 2eb0397..1caecd7 100644
--- a/src/lxc/monitor.c
+++ b/src/lxc/monitor.c
@@ -47,13 +47,23 @@ lxc_log_define(lxc_monitor, lxc);
 #define UNIX_PATH_MAX 108
 #endif
 
-static void lxc_monitor_send(struct lxc_msg *msg)
+static void lxc_monitor_send(struct lxc_msg *msg, const char *lxcpath)
 {
        int fd;
        struct sockaddr_un addr = { .sun_family = AF_UNIX };
        char *offset = &addr.sun_path[1];
-
-       strcpy(offset, "lxc-monitor");
+       size_t ret, len;
+
+       /*
+        * addr.sun_path is only 108 bytes.
+        * should we take a hash of lxcpath?  a subset of it?
+        */
+       len = sizeof(addr.sun_path) - 1;
+       ret = snprintf(offset, len, "%s/lxc-monitor", lxcpath);
+       if (ret < 0 || ret >= len) {
+               ERROR("lxcpath too long to open monitor");
+               return;
+       }
 
        fd = socket(PF_UNIX, SOCK_DGRAM, 0);
        if (fd < 0)
@@ -65,23 +75,33 @@ static void lxc_monitor_send(struct lxc_msg *msg)
        close(fd);
 }
 
-void lxc_monitor_send_state(const char *name, lxc_state_t state)
+void lxc_monitor_send_state(const char *name, lxc_state_t state, const char 
*lxcpath)
 {
        struct lxc_msg msg = { .type = lxc_msg_state,
                               .value = state };
        strncpy(msg.name, name, sizeof(msg.name));
        msg.name[sizeof(msg.name) - 1] = 0;
 
-       lxc_monitor_send(&msg);
+       lxc_monitor_send(&msg, lxcpath);
 }
 
-int lxc_monitor_open(void)
+int lxc_monitor_open(const char *lxcpath)
 {
        struct sockaddr_un addr = { .sun_family = AF_UNIX };
        char *offset = &addr.sun_path[1];
        int fd;
-
-       strcpy(offset, "lxc-monitor");
+       size_t ret, len;
+
+       /*
+        * addr.sun_path is only 108 bytes.
+        * should we take a hash of lxcpath?  a subset of it?
+        */
+       len = sizeof(addr.sun_path) - 1;
+       ret = snprintf(offset, len, "%s/lxc-monitor", lxcpath);
+       if (ret < 0 || ret >= len) {
+               ERROR("lxcpath too long to open monitor");
+               return -1;
+       }
 
        fd = socket(PF_UNIX, SOCK_DGRAM, 0);
        if (fd < 0) {
diff --git a/src/lxc/monitor.h b/src/lxc/monitor.h
index ab08f10..46e35a9 100644
--- a/src/lxc/monitor.h
+++ b/src/lxc/monitor.h
@@ -36,8 +36,7 @@ struct lxc_msg {
        int value;
 };
 
-void lxc_monitor_send_state(const char *name, lxc_state_t state);
-void lxc_monitor_send_priority(const char *name, int priority);
-void lxc_monitor_cleanup(const char *name);
+void lxc_monitor_send_state(const char *name, lxc_state_t state,
+                           const char *lxcpath);
 
 #endif
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 139be08..de431be 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -311,7 +311,7 @@ int lxc_clone_flags_callback(int fd, struct lxc_request 
*request,
 int lxc_set_state(const char *name, struct lxc_handler *handler, lxc_state_t 
state)
 {
        handler->state = state;
-       lxc_monitor_send_state(name, state);
+       lxc_monitor_send_state(name, state, handler->lxcpath);
        return 0;
 }
 
@@ -379,6 +379,7 @@ struct lxc_handler *lxc_init(const char *name, struct 
lxc_conf *conf, const char
        memset(handler, 0, sizeof(*handler));
 
        handler->conf = conf;
+       handler->lxcpath = lxcpath;
 
        apparmor_handler_init(handler);
        handler->name = strdup(name);
diff --git a/src/lxc/start.h b/src/lxc/start.h
index 8c8cbaf..a0afa87 100644
--- a/src/lxc/start.h
+++ b/src/lxc/start.h
@@ -50,6 +50,7 @@ struct lxc_handler {
        int aa_enabled;
 #endif
        int pinfd;
+       const char *lxcpath;
 };
 
 extern struct lxc_handler *lxc_init(const char *name, struct lxc_conf *, const 
char *);
diff --git a/src/lxc/state.c b/src/lxc/state.c
index 7d6c0d5..9fcb06d 100644
--- a/src/lxc/state.c
+++ b/src/lxc/state.c
@@ -200,7 +200,7 @@ extern int lxc_wait(const char *lxcname, const char 
*states, int timeout, const
        if (fillwaitedstates(states, s))
                return -1;
 
-       fd = lxc_monitor_open();
+       fd = lxc_monitor_open(lxcpath);
        if (fd < 0)
                return -1;
 
diff --git a/src/lxc/stop.c b/src/lxc/stop.c
index fa1e375..c796283 100644
--- a/src/lxc/stop.c
+++ b/src/lxc/stop.c
@@ -85,7 +85,7 @@ extern int lxc_stop_callback(int fd, struct lxc_request 
*request,
 
        answer.ret = kill(handler->pid, SIGKILL);
        if (!answer.ret) {
-               ret = lxc_unfreeze(handler->name);
+               ret = lxc_unfreeze(handler->name, handler->lxcpath);
                if (!ret)
                        return 0;
 
-- 
1.8.1.2


------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to