commands_utils: improve code redundancy to make abstract unix socket name

Signed-off-by: 2xsec <dh48.jeong@samsung.com>
This commit is contained in:
2xsec 2018-10-12 15:05:43 +09:00
parent 2f1264995f
commit 5b46db1a63
No known key found for this signature in database
GPG Key ID: 0BE2750EE612F372
3 changed files with 26 additions and 25 deletions

View File

@ -1244,24 +1244,17 @@ out_close:
int lxc_cmd_init(const char *name, const char *lxcpath, const char *suffix) int lxc_cmd_init(const char *name, const char *lxcpath, const char *suffix)
{ {
int fd, len, ret; int fd, ret;
char path[LXC_AUDS_ADDR_LEN] = {0}; char path[LXC_AUDS_ADDR_LEN] = {0};
char *offset = &path[1];
/* -2 here because this is an abstract unix socket so it needs a ret = lxc_make_abstract_socket_name(path, sizeof(path), name, lxcpath, NULL, suffix);
* leading \0, and we null terminate, so it needs a trailing \0.
* Although null termination isn't required by the API, we do it anyway
* because we print the sockname out sometimes.
*/
len = sizeof(path) - 2;
ret = lxc_make_abstract_socket_name(offset, len, name, lxcpath, NULL, suffix);
if (ret < 0) if (ret < 0)
return -1; return -1;
TRACE("Creating abstract unix socket \"%s\"", offset); TRACE("Creating abstract unix socket \"%s\"", &path[1]);
fd = lxc_abstract_unix_open(path, SOCK_STREAM, 0); fd = lxc_abstract_unix_open(path, SOCK_STREAM, 0);
if (fd < 0) { if (fd < 0) {
SYSERROR("Failed to create command socket %s", offset); SYSERROR("Failed to create command socket %s", &path[1]);
if (errno == EADDRINUSE) if (errno == EADDRINUSE)
ERROR("Container \"%s\" appears to be already running", name); ERROR("Container \"%s\" appears to be already running", name);

View File

@ -96,24 +96,38 @@ int lxc_cmd_sock_get_state(const char *name, const char *lxcpath,
return ret; return ret;
} }
int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname, int lxc_make_abstract_socket_name(char *path, size_t pathlen,
const char *lxcname,
const char *lxcpath, const char *lxcpath,
const char *hashed_sock_name, const char *hashed_sock_name,
const char *suffix) const char *suffix)
{ {
const char *name; const char *name;
char *offset;
char *tmppath; char *tmppath;
size_t len;
size_t tmplen; size_t tmplen;
uint64_t hash; uint64_t hash;
int ret; int ret;
if (!path)
return -1;
offset = &path[1];
/* -2 here because this is an abstract unix socket so it needs a
* leading \0, and we null terminate, so it needs a trailing \0.
* Although null termination isn't required by the API, we do it anyway
* because we print the sockname out sometimes.
*/
len = pathlen -2;
name = lxcname; name = lxcname;
if (!name) if (!name)
name = ""; name = "";
if (hashed_sock_name != NULL) { if (hashed_sock_name != NULL) {
ret = ret = snprintf(offset, len, "lxc/%s/%s", hashed_sock_name, suffix);
snprintf(path, len, "lxc/%s/%s", hashed_sock_name, suffix);
if (ret < 0 || ret >= len) { if (ret < 0 || ret >= len) {
ERROR("Failed to create abstract socket name"); ERROR("Failed to create abstract socket name");
return -1; return -1;
@ -129,7 +143,7 @@ int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname,
} }
} }
ret = snprintf(path, len, "%s/%s/%s", lxcpath, name, suffix); ret = snprintf(offset, len, "%s/%s/%s", lxcpath, name, suffix);
if (ret < 0) { if (ret < 0) {
ERROR("Failed to create abstract socket name"); ERROR("Failed to create abstract socket name");
return -1; return -1;
@ -147,7 +161,7 @@ int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname,
} }
hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT); hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT);
ret = snprintf(path, len, "lxc/%016" PRIx64 "/%s", hash, suffix); ret = snprintf(offset, len, "lxc/%016" PRIx64 "/%s", hash, suffix);
if (ret < 0 || ret >= len) { if (ret < 0 || ret >= len) {
ERROR("Failed to create abstract socket name"); ERROR("Failed to create abstract socket name");
return -1; return -1;
@ -161,15 +175,8 @@ int lxc_cmd_connect(const char *name, const char *lxcpath,
{ {
int ret, client_fd; int ret, client_fd;
char path[LXC_AUDS_ADDR_LEN] = {0}; char path[LXC_AUDS_ADDR_LEN] = {0};
char *offset = &path[1];
/* -2 here because this is an abstract unix socket so it needs a ret = lxc_make_abstract_socket_name(path, sizeof(path), name, lxcpath,
* leading \0, and we null terminate, so it needs a trailing \0.
* Although null termination isn't required by the API, we do it anyway
* because we print the sockname out sometimes.
*/
size_t len = sizeof(path) - 2;
ret = lxc_make_abstract_socket_name(offset, len, name, lxcpath,
hashed_sock_name, suffix); hashed_sock_name, suffix);
if (ret < 0) if (ret < 0)
return -1; return -1;

View File

@ -25,7 +25,8 @@
#include "state.h" #include "state.h"
#include "commands.h" #include "commands.h"
int lxc_make_abstract_socket_name(char *path, int len, const char *lxcname, int lxc_make_abstract_socket_name(char *path, size_t pathlen,
const char *lxcname,
const char *lxcpath, const char *lxcpath,
const char *hashed_sock_name, const char *hashed_sock_name,
const char *suffix); const char *suffix);