mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-09 21:20:48 +00:00
commands_utils: improve code redundancy to make abstract unix socket name
Signed-off-by: 2xsec <dh48.jeong@samsung.com>
This commit is contained in:
parent
2f1264995f
commit
5b46db1a63
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user