Hmm just realized that this breaks list_active_containers as it parses /proc/unix/net to find names. So please ignore this for 1.0 as it's too risky. Will try to address that incoming days.
On Wed, Feb 19, 2014 at 5:09 PM, S.Çağlar Onur <[email protected]> wrote: > Changes since v1; > * Address Stéphane's comments > > Signed-off-by: S.Çağlar Onur <[email protected]> > --- > src/lxc/commands.c | 34 +++++++++++++++++++++++++++++----- > 1 file changed, 29 insertions(+), 5 deletions(-) > > diff --git a/src/lxc/commands.c b/src/lxc/commands.c > index 6b46c2c..e5d8a8e 100644 > --- a/src/lxc/commands.c > +++ b/src/lxc/commands.c > @@ -32,6 +32,8 @@ > #include <sys/param.h> > #include <malloc.h> > #include <stdlib.h> > +#include <stdbool.h> > +#include <inttypes.h> > > #include "log.h" > #include "lxc.h" > @@ -74,10 +76,12 @@ > lxc_log_define(lxc_commands, lxc); > > static int fill_sock_name(char *path, int len, const char *name, > - const char *inpath) > + const char *inpath, bool init) > { > + char *offset = &path[1], sock_name[PATH_MAX]; > const char *lxcpath = NULL; > - int ret; > + uint64_t hash; > + int ret, sock; > > if (!inpath) { > lxcpath = lxc_global_config_value("lxc.lxcpath"); > @@ -86,12 +90,32 @@ static int fill_sock_name(char *path, int len, const char > *name, > return -1; > } > } > - ret = snprintf(path, len, "%s/%s/command", lxcpath ? lxcpath : > inpath, name); > + ret = snprintf(sock_name, PATH_MAX, "%s/%s/command", lxcpath ? > lxcpath : inpath, name); > + if (ret < 0 || ret >= PATH_MAX) { > + return -1; > + } > > + /* addr.sun_path is only 108 bytes, so we hash the full name */ > + hash = fnv_64a_buf(sock_name, ret, FNV1A_64_INIT); > + ret = snprintf(offset, len, "lxc/command/%016" PRIx64, hash); > if (ret < 0 || ret >= len) { > ERROR("Name too long"); > return -1; > } > + > + /* if caller is not lxc_cmd_init then try connecting to UDS, > + * fallback to the old naming scheme if that fails */ > + if (!init) { > + sock = lxc_abstract_unix_connect(path); > + if (sock < 0 && errno == ECONNREFUSED) { > + ret = snprintf(offset, len, "%s/%s/command", lxcpath > ? lxcpath : inpath, name); > + if (ret < 0 || ret >= len) { > + ERROR("Name too long"); > + return -1; > + } > + } > + close(sock); > + } > return 0; > } > > @@ -248,7 +272,7 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr > *cmd, int *stopped, > *stopped = 0; > > len = sizeof(path)-1; > - if (fill_sock_name(offset, len, name, lxcpath)) > + if (fill_sock_name(path, len, name, lxcpath, false)) > return -1; > > sock = lxc_abstract_unix_connect(path); > @@ -856,7 +880,7 @@ int lxc_cmd_init(const char *name, struct lxc_handler > *handler, > int len; > > len = sizeof(path)-1; > - if (fill_sock_name(offset, len, name, lxcpath)) > + if (fill_sock_name(path, len, name, lxcpath, true)) > return -1; > > fd = lxc_abstract_unix_open(path, SOCK_STREAM, 0); > -- > 1.8.3.2 > -- S.Çağlar Onur <[email protected]> _______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
