mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
Fri Feb 20 09:03:05 IST 2007 Mark McLoughlin <markmc@redhat.com>
* qemud/qemud.c: clean up qemudInitialize() and qemudListen() so as to coalesce the two "system vs. user" code paths and fix up some problems noticed by dan.
This commit is contained in:
parent
96b89415a3
commit
28a07e4c80
@ -1,3 +1,9 @@
|
|||||||
|
Fri Feb 20 09:03:05 IST 2007 Mark McLoughlin <markmc@redhat.com>
|
||||||
|
|
||||||
|
* qemud/qemud.c: clean up qemudInitialize() and qemudListen()
|
||||||
|
so as to coalesce the two "system vs. user" code paths and
|
||||||
|
fix up some problems noticed by dan.
|
||||||
|
|
||||||
Fri Feb 19 16:59:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
|
Fri Feb 19 16:59:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
|
||||||
|
|
||||||
* qemud/qemud.c: don't shutdown guest and networks on
|
* qemud/qemud.c: don't shutdown guest and networks on
|
||||||
|
175
qemud/qemud.c
175
qemud/qemud.c
@ -350,55 +350,111 @@ static int qemudListenUnix(struct qemud_server *server,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qemudListen(struct qemud_server *server, int sys) {
|
static int
|
||||||
char sockname[PATH_MAX];
|
qemudEnsureDir(const char *path)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
char parent[PATH_MAX];
|
||||||
|
char *p;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (stat(path, &st) >= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
strncpy(parent, path, PATH_MAX);
|
||||||
|
parent[PATH_MAX - 1] = '\0';
|
||||||
|
|
||||||
|
if (!(p = strrchr(parent, '/')))
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
if (p == parent)
|
||||||
|
return EPERM;
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
if ((err = qemudEnsureDir(parent)))
|
||||||
|
return err;
|
||||||
|
|
||||||
|
if (mkdir(path, 0777) < 0 && errno != EEXIST)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qemudInitPaths(int sys,
|
||||||
|
char *configDir,
|
||||||
|
char *networkConfigDir,
|
||||||
|
char *sockname,
|
||||||
|
char *roSockname,
|
||||||
|
int maxlen) {
|
||||||
|
uid_t uid;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
uid = geteuid();
|
||||||
|
|
||||||
if (sys) {
|
if (sys) {
|
||||||
if (snprintf(sockname, sizeof(sockname), "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= (int)sizeof(sockname))
|
if (uid != 0) {
|
||||||
goto snprintf_error;
|
|
||||||
|
|
||||||
unlink(sockname);
|
|
||||||
if (qemudListenUnix(server, sockname, 0) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (snprintf(sockname, sizeof(sockname), "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= (int)sizeof(sockname))
|
|
||||||
goto snprintf_error;
|
|
||||||
|
|
||||||
unlink(sockname);
|
|
||||||
if (qemudListenUnix(server, sockname, 1) < 0)
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
struct passwd *pw;
|
|
||||||
int uid;
|
|
||||||
|
|
||||||
if ((uid = geteuid()) < 0) {
|
|
||||||
qemudLog(QEMUD_ERR, "You must run the daemon as root to use system mode");
|
qemudLog(QEMUD_ERR, "You must run the daemon as root to use system mode");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (snprintf(configDir, maxlen, "%s/libvirt/qemu", SYSCONF_DIR) >= maxlen)
|
||||||
|
goto snprintf_error;
|
||||||
|
|
||||||
|
if (snprintf(networkConfigDir, maxlen, "%s/libvirt/qemu/networks", SYSCONF_DIR) >= maxlen)
|
||||||
|
goto snprintf_error;
|
||||||
|
|
||||||
|
if (snprintf(sockname, maxlen, "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= maxlen)
|
||||||
|
goto snprintf_error;
|
||||||
|
|
||||||
|
unlink(sockname);
|
||||||
|
|
||||||
|
if (snprintf(roSockname, maxlen, "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= maxlen)
|
||||||
|
goto snprintf_error;
|
||||||
|
|
||||||
|
unlink(sockname);
|
||||||
|
} else {
|
||||||
|
struct passwd *pw;
|
||||||
|
|
||||||
if (!(pw = getpwuid(uid))) {
|
if (!(pw = getpwuid(uid))) {
|
||||||
qemudLog(QEMUD_ERR, "Failed to find user record for uid '%s': %s",
|
qemudLog(QEMUD_ERR, "Failed to find user record for uid '%d': %s",
|
||||||
uid, strerror(errno));
|
uid, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snprintf(sockname, sizeof(sockname), "@%s/.libvirt/qemud-sock", pw->pw_dir) >= (int)sizeof(sockname))
|
if (snprintf(configDir, maxlen, "%s/.libvirt/qemu", pw->pw_dir) >= maxlen)
|
||||||
goto snprintf_error;
|
goto snprintf_error;
|
||||||
|
|
||||||
if (qemudListenUnix(server, sockname, 0) < 0)
|
if (snprintf(networkConfigDir, maxlen, "%s/.libvirt/qemu/networks", pw->pw_dir) >= maxlen)
|
||||||
return -1;
|
goto snprintf_error;
|
||||||
|
|
||||||
|
if (snprintf(sockname, maxlen, "@%s/.libvirt/qemud-sock", pw->pw_dir) >= maxlen)
|
||||||
|
goto snprintf_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err = qemudEnsureDir(configDir))) {
|
||||||
|
qemudLog(QEMUD_ERR, "Failed to create directory '%s': %s",
|
||||||
|
configDir, strerror(err));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err = qemudEnsureDir(networkConfigDir))) {
|
||||||
|
qemudLog(QEMUD_ERR, "Failed to create directory '%s': %s",
|
||||||
|
networkConfigDir, strerror(err));
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
snprintf_error:
|
snprintf_error:
|
||||||
qemudLog(QEMUD_ERR, "Resulting path to long for buffer in qemudListen()");
|
qemudLog(QEMUD_ERR, "Resulting path to long for buffer in qemudInitPaths()");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct qemud_server *qemudInitialize(int sys, int sigread) {
|
static struct qemud_server *qemudInitialize(int sys, int sigread) {
|
||||||
struct qemud_server *server;
|
struct qemud_server *server;
|
||||||
char libvirtConf[PATH_MAX];
|
char sockname[PATH_MAX];
|
||||||
|
char roSockname[PATH_MAX];
|
||||||
|
|
||||||
if (!(server = calloc(1, sizeof(struct qemud_server)))) {
|
if (!(server = calloc(1, sizeof(struct qemud_server)))) {
|
||||||
qemudLog(QEMUD_ERR, "Failed to allocate struct qemud_server");
|
qemudLog(QEMUD_ERR, "Failed to allocate struct qemud_server");
|
||||||
@ -411,63 +467,17 @@ static struct qemud_server *qemudInitialize(int sys, int sigread) {
|
|||||||
server->nextvmid = 1;
|
server->nextvmid = 1;
|
||||||
server->sigread = sigread;
|
server->sigread = sigread;
|
||||||
|
|
||||||
if (sys) {
|
roSockname[0] = '\0';
|
||||||
if (snprintf(libvirtConf, sizeof(libvirtConf), "%s/libvirt", SYSCONF_DIR) >= (int)sizeof(libvirtConf)) {
|
|
||||||
goto snprintf_cleanup;
|
|
||||||
}
|
|
||||||
if (mkdir(libvirtConf, 0777) < 0) {
|
|
||||||
if (errno != EEXIST) {
|
|
||||||
qemudLog(QEMUD_ERR, "Failed to create directory '%s': %s",
|
|
||||||
libvirtConf, strerror(errno));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (snprintf(server->configDir, sizeof(server->configDir), "%s/libvirt/qemu", SYSCONF_DIR) >= (int)sizeof(server->configDir)) {
|
if (qemudInitPaths(sys, server->configDir, server->networkConfigDir,
|
||||||
goto snprintf_cleanup;
|
sockname, roSockname, PATH_MAX) < 0)
|
||||||
}
|
goto cleanup;
|
||||||
if (snprintf(server->networkConfigDir, sizeof(server->networkConfigDir), "%s/libvirt/qemu/networks", SYSCONF_DIR) >= (int)sizeof(server->networkConfigDir)) {
|
|
||||||
goto snprintf_cleanup;
|
if (qemudListenUnix(server, sockname, 0) < 0)
|
||||||
}
|
goto cleanup;
|
||||||
} else {
|
|
||||||
struct passwd *pw;
|
if (roSockname[0] == '\0' && qemudListenUnix(server, roSockname, 1) < 0)
|
||||||
int uid;
|
|
||||||
|
|
||||||
if ((uid = geteuid()) < 0) {
|
|
||||||
qemudLog(QEMUD_ERR, "You must run the daemon as root to use system mode");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
if (!(pw = getpwuid(uid))) {
|
|
||||||
qemudLog(QEMUD_ERR, "Failed to find user record for uid '%s': %s",
|
|
||||||
uid, strerror(errno));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (snprintf(libvirtConf, sizeof(libvirtConf), "%s/.libvirt", pw->pw_dir) >= (int)sizeof(libvirtConf)) {
|
|
||||||
goto snprintf_cleanup;
|
|
||||||
}
|
|
||||||
if (mkdir(libvirtConf, 0777) < 0) {
|
|
||||||
if (errno != EEXIST) {
|
|
||||||
qemudLog(QEMUD_ERR, "Failed to create directory '%s': %s",
|
|
||||||
libvirtConf, strerror(errno));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (snprintf(server->configDir, sizeof(server->configDir), "%s/.libvirt/qemu", pw->pw_dir) >= (int)sizeof(server->configDir)) {
|
|
||||||
goto snprintf_cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (snprintf(server->networkConfigDir, sizeof(server->networkConfigDir), "%s/.libvirt/qemu/networks", pw->pw_dir) >= (int)sizeof(server->networkConfigDir)) {
|
|
||||||
goto snprintf_cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (qemudListen(server, sys) < 0) {
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
|
|
||||||
if (qemudScanConfigs(server) < 0) {
|
if (qemudScanConfigs(server) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -475,9 +485,6 @@ static struct qemud_server *qemudInitialize(int sys, int sigread) {
|
|||||||
|
|
||||||
return server;
|
return server;
|
||||||
|
|
||||||
snprintf_cleanup:
|
|
||||||
qemudLog(QEMUD_ERR, "Resulting path to long for buffer in qemudInitialize()");
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (server) {
|
if (server) {
|
||||||
struct qemud_socket *sock = server->sockets;
|
struct qemud_socket *sock = server->sockets;
|
||||||
|
Loading…
Reference in New Issue
Block a user