Skip to content

Commit

Permalink
commands: mv lxc_make_abstract_socket_name()
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner authored and stgraber committed Jul 16, 2017
1 parent 965730c commit 039f386
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 63 deletions.
1 change: 1 addition & 0 deletions src/lxc/commands.c
Expand Up @@ -40,6 +40,7 @@
#include "utils.h"
#include "cgroup.h"
#include "commands.h"
#include "commands_utils.h"
#include "console.h"
#include "confile.h"
#include "lxclock.h"
Expand Down
64 changes: 64 additions & 0 deletions src/lxc/commands_utils.c
Expand Up @@ -18,8 +18,11 @@
*/

#define _GNU_SOURCE
#define __STDC_FORMAT_MACROS /* Required for PRIu64 to work. */
#include <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
Expand All @@ -30,6 +33,7 @@
#include "log.h"
#include "monitor.h"
#include "state.h"
#include "utils.h"

lxc_log_define(lxc_commands_utils, lxc);

Expand Down Expand Up @@ -89,3 +93,63 @@ int lxc_cmd_sock_get_state(const char *name, const char *lxcpath,
close(state_client_fd);
return ret;
}

int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname,
const char *lxcpath,
const char *hashed_sock_name,
const char *suffix)
{
const char *name;
char *tmppath;
size_t tmplen;
uint64_t hash;
int ret;

name = lxcname;
if (!name)
name = "";

if (hashed_sock_name != NULL) {
ret =
snprintf(path, len, "lxc/%s/%s", hashed_sock_name, suffix);
if (ret < 0 || ret >= len) {
ERROR("Failed to create abstract socket name");
return -1;
}
return 0;
}

if (!lxcpath) {
lxcpath = lxc_global_config_value("lxc.lxcpath");
if (!lxcpath) {
ERROR("Failed to allocate memory");
return -1;
}
}

ret = snprintf(path, len, "%s/%s/%s", lxcpath, name, suffix);
if (ret < 0) {
ERROR("Failed to create abstract socket name");
return -1;
}
if (ret < len)
return 0;

/* ret >= len; lxcpath or name is too long. hash both */
tmplen = strlen(name) + strlen(lxcpath) + 2;
tmppath = alloca(tmplen);
ret = snprintf(tmppath, tmplen, "%s/%s", lxcpath, name);
if (ret < 0 || (size_t)ret >= tmplen) {
ERROR("Failed to create abstract socket name");
return -1;
}

hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT);
ret = snprintf(path, len, "lxc/%016" PRIx64 "/%s", hash, suffix);
if (ret < 0 || ret >= len) {
ERROR("Failed to create abstract socket name");
return -1;
}

return 0;
}
5 changes: 5 additions & 0 deletions src/lxc/commands_utils.h
Expand Up @@ -24,6 +24,11 @@

#include "state.h"

int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname,
const char *lxcpath,
const char *hashed_sock_name,
const char *suffix);

/* lxc_cmd_sock_get_state Register a new state client fd in the container's
* in-memory handler and retrieve the requested
* states.
Expand Down
1 change: 1 addition & 0 deletions src/lxc/start.c
Expand Up @@ -59,6 +59,7 @@
#include "caps.h"
#include "cgroup.h"
#include "commands.h"
#include "commands_utils.h"
#include "conf.h"
#include "console.h"
#include "error.h"
Expand Down
59 changes: 0 additions & 59 deletions src/lxc/utils.c
Expand Up @@ -2338,62 +2338,3 @@ int run_command(char *buf, size_t buf_size, int (*child_fn)(void *), void *args)

return fret;
}

int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname,
const char *lxcpath,
const char *hashed_sock_name,
const char *suffix)
{
const char *name;
char *tmppath;
size_t tmplen;
uint64_t hash;
int ret;

name = lxcname;
if (!name)
name = "";

if (hashed_sock_name != NULL) {
ret =
snprintf(path, len, "lxc/%s/%s", hashed_sock_name, suffix);
if (ret < 0 || ret >= len) {
ERROR("Failed to create abstract socket name");
return -1;
}
return 0;
}

if (!lxcpath) {
lxcpath = lxc_global_config_value("lxc.lxcpath");
if (!lxcpath) {
ERROR("Failed to allocate memory");
return -1;
}
}

ret = snprintf(path, len, "%s/%s/%s", lxcpath, name, suffix);
if (ret < 0) {
ERROR("Failed to create abstract socket name");
return -1;
}
if (ret < len)
return 0;

/* ret >= len; lxcpath or name is too long. hash both */
tmplen = strlen(name) + strlen(lxcpath) + 2;
tmppath = alloca(tmplen);
ret = snprintf(tmppath, tmplen, "%s/%s", lxcpath, name);
if (ret < 0 || ret >= tmplen) {
ERROR("Failed to create abstract socket name");
return -1;
}
hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT);
ret = snprintf(path, len, "lxc/%016" PRIx64 "/%s", hash, suffix);
if (ret < 0 || ret >= len) {
ERROR("Failed to create abstract socket name");
return -1;
}

return 0;
}
4 changes: 0 additions & 4 deletions src/lxc/utils.h
Expand Up @@ -374,9 +374,5 @@ int lxc_unstack_mountpoint(const char *path, bool lazy);
* @param[in] args Arguments to be passed to child_fn.
*/
int run_command(char *buf, size_t buf_size, int (*child_fn)(void *), void *args);
int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname,
const char *lxcpath,
const char *hashed_sock_name,
const char *suffix);

#endif /* __LXC_UTILS_H */

0 comments on commit 039f386

Please sign in to comment.