server->autostartNetworkConfigDir etc. is starting to
get a little unwieldly so put the config directory
paths in an array.
Signed-off-by: Mark McLoughlin <markmc(a)redhat.com>
Index: libvirt/qemud/internal.h
===================================================================
--- libvirt.orig/qemud/internal.h
+++ libvirt/qemud/internal.h
@@ -54,6 +54,15 @@ typedef enum {
#endif
} qemudLogPriority;
+typedef enum {
+ QEMUD_DIR_DOMAINS = 0,
+ QEMUD_DIR_AUTO_DOMAINS,
+ QEMUD_DIR_NETWORKS,
+ QEMUD_DIR_AUTO_NETWORKS,
+
+ QEMUD_N_CONFIG_DIRS
+} qemudConfigDirType;
+
/* Different types of QEMU acceleration possible */
enum qemud_vm_virt_type {
QEMUD_VIRT_QEMU,
@@ -292,14 +301,15 @@ struct qemud_server {
struct qemud_network *networks;
brControl *brctl;
iptablesContext *iptables;
- char configDir[PATH_MAX];
- char networkConfigDir[PATH_MAX];
- char autostartConfigDir[PATH_MAX];
- char autostartNetworkConfigDir[PATH_MAX];
+ char configDirs[QEMUD_N_CONFIG_DIRS][PATH_MAX];
char errorMessage[QEMUD_MAX_ERROR_LEN];
int errorCode;
unsigned int shutdown : 1;
};
+#define domainsDir configDirs[QEMUD_DIR_DOMAINS]
+#define autoDomainsDir configDirs[QEMUD_DIR_AUTO_DOMAINS]
+#define networksDir configDirs[QEMUD_DIR_NETWORKS]
+#define autoNetworksDir configDirs[QEMUD_DIR_AUTO_NETWORKS]
int qemudStartVMDaemon(struct qemud_server *server,
struct qemud_vm *vm);
Index: libvirt/qemud/qemud.c
===================================================================
--- libvirt.orig/qemud/qemud.c
+++ libvirt/qemud/qemud.c
@@ -354,15 +354,22 @@ static int qemudListenUnix(struct qemud_
return 0;
}
-static int qemudInitPaths(int sys,
- char *configDir,
- char *networkConfigDir,
- char *autostartConfigDir,
- char *autostartNetworkConfigDir,
+static int qemudInitPaths(struct qemud_server *server,
+ int sys,
char *sockname,
char *roSockname,
int maxlen) {
+ const char *paths[] = {
+ "libvirt/qemu", /* QEMUD_DIR_DOMAINS */
+ "libvirt/qemu/autostart", /* QEMUD_DIR_AUTO_DOMAINS */
+ "libvirt/qemu/networks", /* QEMUD_DIR_NETWORKS */
+ "libvirt/qemu/networks/autostart", /* QEMUD_DIR_AUTO_NETWORKS */
+ };
+
uid_t uid;
+ struct passwd *pw;
+ const char *base = NULL;
+ int i;
uid = geteuid();
@@ -372,18 +379,6 @@ static int qemudInitPaths(int sys,
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(autostartConfigDir, maxlen, "%s/libvirt/qemu/autostart",
SYSCONF_DIR) >= maxlen)
- goto snprintf_error;
-
- if (snprintf(autostartNetworkConfigDir, maxlen,
"%s/libvirt/qemu/networks/autostart", SYSCONF_DIR) >= maxlen)
- goto snprintf_error;
-
if (snprintf(sockname, maxlen, "%s/run/libvirt/qemud-sock",
LOCAL_STATE_DIR) >= maxlen)
goto snprintf_error;
@@ -393,30 +388,24 @@ static int qemudInitPaths(int sys,
goto snprintf_error;
unlink(sockname);
- } else {
- struct passwd *pw;
+ base = SYSCONF_DIR;
+ } else {
if (!(pw = getpwuid(uid))) {
qemudLog(QEMUD_ERR, "Failed to find user record for uid '%d':
%s",
uid, strerror(errno));
return -1;
}
- if (snprintf(configDir, maxlen, "%s/.libvirt/qemu", pw->pw_dir)
>= maxlen)
- goto snprintf_error;
-
- if (snprintf(networkConfigDir, maxlen, "%s/.libvirt/qemu/networks",
pw->pw_dir) >= maxlen)
- goto snprintf_error;
-
- if (snprintf(autostartConfigDir, maxlen, "%s/.libvirt/qemu/autostart",
pw->pw_dir) >= maxlen)
+ if (snprintf(sockname, maxlen, "(a)%s/.libvirt/qemud-sock",
pw->pw_dir) >= maxlen)
goto snprintf_error;
- if (snprintf(autostartNetworkConfigDir, maxlen,
"%s/.libvirt/qemu/networks/autostart", pw->pw_dir) >= maxlen)
- goto snprintf_error;
+ base = pw->pw_dir;
+ }
- if (snprintf(sockname, maxlen, "(a)%s/.libvirt/qemud-sock",
pw->pw_dir) >= maxlen)
+ for (i = 0; i < QEMUD_N_CONFIG_DIRS; i++)
+ if (snprintf(server->configDirs[i], PATH_MAX, "%s/%s", base,
paths[i]) >= PATH_MAX)
goto snprintf_error;
- }
return 0;
@@ -443,9 +432,7 @@ static struct qemud_server *qemudInitial
roSockname[0] = '\0';
- if (qemudInitPaths(sys, server->configDir, server->networkConfigDir,
- server->autostartConfigDir,
server->autostartNetworkConfigDir,
- sockname, roSockname, PATH_MAX) < 0)
+ if (qemudInitPaths(server, sys, sockname, roSockname, PATH_MAX) < 0)
goto cleanup;
if (qemudListenUnix(server, sockname, 0) < 0)
Index: libvirt/qemud/conf.c
===================================================================
--- libvirt.orig/qemud/conf.c
+++ libvirt/qemud/conf.c
@@ -1137,7 +1137,8 @@ int qemudBuildCommandLine(struct qemud_s
/* Save a guest's config data into a persistent file */
static int qemudSaveConfig(struct qemud_server *server,
- struct qemud_vm *vm) {
+ struct qemud_vm *vm,
+ const char *configDir) {
char *xml;
int fd = -1, ret = -1;
int towrite;
@@ -1147,10 +1148,10 @@ static int qemudSaveConfig(struct qemud_
return -1;
}
- if ((err = qemudEnsureDir(!vm->autostart ? server->configDir :
server->autostartConfigDir))) {
+ if ((err = qemudEnsureDir(configDir))) {
qemudReportError(server, VIR_ERR_INTERNAL_ERROR,
"cannot create config directory %s: %s",
- server->configDir, strerror(err));
+ configDir, strerror(err));
goto cleanup;
}
@@ -1247,7 +1248,7 @@ struct qemud_vm *qemudLoadConfigXML(stru
vm->configFile[PATH_MAX-1] = '\0';
} else {
if (save) {
- if (qemudMakeConfigPath(!vm->autostart ? server->configDir :
server->autostartConfigDir,
+ if (qemudMakeConfigPath(!vm->autostart ? server->domainsDir :
server->autoDomainsDir,
vm->def->name, ".xml",
vm->configFile, PATH_MAX) < 0) {
qemudReportError(server, VIR_ERR_INTERNAL_ERROR,
"cannot construct config file path");
@@ -1256,7 +1257,8 @@ struct qemud_vm *qemudLoadConfigXML(stru
return NULL;
}
- if (qemudSaveConfig(server, vm) < 0) {
+ if (qemudSaveConfig(server, vm,
+ !vm->autostart ? server->domainsDir :
server->autoDomainsDir) < 0) {
if (newVM)
qemudFreeVM(vm);
return NULL;
@@ -1277,7 +1279,8 @@ struct qemud_vm *qemudLoadConfigXML(stru
static int qemudSaveNetworkConfig(struct qemud_server *server,
- struct qemud_network *network) {
+ struct qemud_network *network,
+ const char *configDir) {
char *xml;
int fd, ret = -1;
int towrite;
@@ -1287,10 +1290,10 @@ static int qemudSaveNetworkConfig(struct
return -1;
}
- if ((err = qemudEnsureDir(!network->autostart ? server->networkConfigDir :
server->autostartNetworkConfigDir))) {
+ if ((err = qemudEnsureDir(configDir))) {
qemudReportError(server, VIR_ERR_INTERNAL_ERROR,
"cannot create config directory %s: %s",
- server->networkConfigDir, strerror(err));
+ configDir, strerror(err));
goto cleanup;
}
@@ -1600,7 +1603,7 @@ struct qemud_network *qemudLoadNetworkCo
network->configFile[PATH_MAX-1] = '\0';
} else {
if (save) {
- if (qemudMakeConfigPath(!network->autostart ? server->networkConfigDir
: server->autostartNetworkConfigDir,
+ if (qemudMakeConfigPath(!network->autostart ? server->networksDir :
server->autoNetworksDir,
network->def->name, ".xml",
network->configFile, PATH_MAX) < 0) {
qemudReportError(server, VIR_ERR_INTERNAL_ERROR, "cannot construct
config file path");
if (newNetwork)
@@ -1608,7 +1611,8 @@ struct qemud_network *qemudLoadNetworkCo
return NULL;
}
- if (qemudSaveNetworkConfig(server, network) < 0) {
+ if (qemudSaveNetworkConfig(server, network,
+ !network->autostart ? server->networksDir :
server->autoNetworksDir) < 0) {
if (newNetwork)
qemudFreeNetwork(network);
return NULL;
@@ -1703,12 +1707,20 @@ int qemudScanConfigDir(struct qemud_serv
/* Scan for all guest and network config files */
int qemudScanConfigs(struct qemud_server *server) {
- if (qemudScanConfigDir(server, server->configDir, 1, 0) < 0 ||
- qemudScanConfigDir(server, server->autostartConfigDir, 1, 1) < 0)
- return -1;
- if (qemudScanConfigDir(server, server->networkConfigDir, 0, 0) < 0 ||
- qemudScanConfigDir(server, server->autostartNetworkConfigDir, 0, 1) < 0)
- return -1;
+ int i;
+
+ for (i = 0; i < QEMUD_N_CONFIG_DIRS; i++) {
+ int isGuest = 0, isAutostart = 0;
+
+ if (i == QEMUD_DIR_DOMAINS || i == QEMUD_DIR_AUTO_DOMAINS)
+ isGuest = 1;
+ if (i == QEMUD_DIR_AUTO_DOMAINS || i == QEMUD_DIR_AUTO_NETWORKS)
+ isAutostart = 1;
+
+ if (qemudScanConfigDir(server, server->configDirs[i], isGuest, isAutostart)
< 0)
+ return -1;
+ }
+
return 0;
}
--