}
+int qemudStartup(struct qemud_server *server) {
+ return qemudScanConfigs(server);
+}
+
+void qemudReload(struct qemud_server *server) {
+ qemudScanConfigs(server);
+
+ if (server->iptables) {
+ qemudLog(QEMUD_INFO, "Reloading iptables rules");
+ iptablesReloadRules(server->iptables);
+ }
+}
+
void qemudShutdown(struct qemud_server *server) {
struct qemud_vm *vm;
struct qemud_network *network;
int qemudStartVMDaemon(struct qemud_server *server,
struct qemud_vm *vm) {
char **argv = NULL, **tmp;
- int i, ret = -1;
+ int i;
char logfile[PATH_MAX];
if (qemudIsActiveVM(vm)) {
server->ninactivevms--;
server->nactivevms++;
-
- virEventAddHandle(vm->stdout,
- POLLIN | POLLERR | POLLHUP,
- qemudDispatchVMEvent,
- server);
- virEventAddHandle(vm->stderr,
- POLLIN | POLLERR | POLLHUP,
- qemudDispatchVMEvent,
- server);
-
- ret = 0;
-
- if (qemudWaitForMonitor(server, vm) < 0) {
- qemudShutdownVMDaemon(server, vm);
- ret = -1;
- }
}
+ for (i = 0 ; argv[i] ; i++)
+ free(argv[i]);
+ free(argv);
+
if (vm->tapfds) {
for (i = 0; vm->tapfds[i] != -1; i++) {
close(vm->tapfds[i]);
vm->tapfds = NULL;
vm->ntapfds = 0;
}
-
- for (i = 0 ; argv[i] ; i++)
- free(argv[i]);
- free(argv);
- return ret;
+ if (virEventAddHandle(vm->stdout,
+ POLLIN | POLLERR | POLLHUP,
+ qemudDispatchVMEvent,
+ server) < 0) {
+ qemudShutdownVMDaemon(server, vm);
+ return -1;
+ }
+
+ if (virEventAddHandle(vm->stderr,
+ POLLIN | POLLERR | POLLHUP,
+ qemudDispatchVMEvent,
+ server) < 0) {
+ qemudShutdownVMDaemon(server, vm);
+ return -1;
+ }
+
+
+ if (qemudWaitForMonitor(server, vm) < 0) {
+ qemudShutdownVMDaemon(server, vm);
+ return -1;
+ }
+
+ return 0;
}
static int qemudVMData(struct qemud_server *server ATTRIBUTE_UNUSED,
server->nactivevms--;
server->ninactivevms++;
+ if (!vm->configFile[0])
+ qemudRemoveInactiveVM(server, vm);
+
return 0;
}
server->nactivenetworks--;
server->ninactivenetworks++;
+ if (!network->configFile[0])
+ qemudRemoveInactiveNetwork(server, network);
+
return 0;
}
if (!vm)
return;
- if (events == POLLIN &&
- qemudDispatchVMLog(server, vm, fd) == 0)
- return;
-
- qemudDispatchVMFailure(server, vm, fd);
+ if (events == POLLIN)
+ qemudDispatchVMLog(server, vm, fd);
+ else
+ qemudDispatchVMFailure(server, vm, fd);
}
int qemudMonitorCommand(struct qemud_server *server ATTRIBUTE_UNUSED,
#include "../src/remote_internal.h"
#include "../src/conf.h"
#include "dispatch.h"
-#include "conf.h"
-#include "iptables.h"
#include "driver.h"
#include "event.h"
case SIGHUP:
qemudLog(QEMUD_INFO, "Reloading configuration on SIGHUP");
if (!remote) {
- ret = qemudScanConfigs(server);
-
- if (server->iptables) {
- qemudLog(QEMUD_INFO, "Reloading iptables rules");
- iptablesReloadRules(server->iptables);
- }
+ qemudReload(server);
}
break;
goto cleanup;
if (!remote) /* qemud only */ {
- if (qemudScanConfigs(server) < 0) {
+ if (qemudStartup(server) < 0) {
goto cleanup;
}
} else /* remote only */ {
}
-static void qemudCleanupInactive(struct qemud_server *server) {
- struct qemud_vm *vm = server->vms;
- struct qemud_network *network = server->networks;
-
- /* Cleanup any VMs which shutdown & dont have an associated
- config file */
- while (vm) {
- struct qemud_vm *next = vm->next;
-
- if (!qemudIsActiveVM(vm) && !vm->configFile[0])
- qemudRemoveInactiveVM(server, vm);
-
- vm = next;
- }
-
- /* Cleanup any networks too */
- while (network) {
- struct qemud_network *next = network->next;
-
- if (!qemudIsActiveNetwork(network) && !network->configFile[0])
- qemudRemoveInactiveNetwork(server, network);
-
- network = next;
- }
-
- return;
-}
-
-
-
-static int qemudOneLoop(struct qemud_server *server) {
+static int qemudOneLoop(struct qemud_server *server ATTRIBUTE_UNUSED) {
sig_atomic_t errors;
if (virEventRunOnce() < 0)
return -1;
}
- qemudCleanupInactive(server);
-
return 0;
}