[lxc-devel] [PATCH] hash command unix socket name (v2)

S.Çağlar Onur caglar at 10ur.org
Wed Feb 19 22:25:05 UTC 2014


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 <caglar at 10ur.org> wrote:
> Changes since v1;
>   * Address Stéphane's comments
>
> Signed-off-by: S.Çağlar Onur <caglar at 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
>



-- 
S.Çağlar Onur <caglar at 10ur.org>


More information about the lxc-devel mailing list