Changes since v1; * Address Stéphane's comments Signed-off-by: S.Çağlar Onur <cag...@10ur.org> --- 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 _______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel