mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-26 18:41:17 +00:00
Split up struct qemud_server to move qemu stuff into conf.c
This commit is contained in:
parent
498cc57835
commit
b63f8cc9f9
@ -1,3 +1,11 @@
|
||||
Tue Jun 26 18:10:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* qemud/conf.c, qemud/conf.h, qemud/dispatch.c, qemud/driver.c,
|
||||
qemud/driver.h, qemud/internal.h, qemud/qemud.c: Split the
|
||||
struct qemud_server into two parts, moving QEMU stuff out into
|
||||
struct qemud_driver. Move all QEMU related data structures
|
||||
and manipulation code into conf.c file
|
||||
|
||||
Tue Jun 26 16:50:00 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* qemud/Makefile.am, qemud/conf.c, qemud/dispatch.c, qemud/driver.c,
|
||||
|
239
qemud/conf.c
239
qemud/conf.c
@ -44,10 +44,41 @@
|
||||
|
||||
#include "internal.h"
|
||||
#include "conf.h"
|
||||
#include "driver.h"
|
||||
#include "uuid.h"
|
||||
#include "buf.h"
|
||||
|
||||
extern void __virRaiseError(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
virNetworkPtr net,
|
||||
int domain,
|
||||
int code,
|
||||
virErrorLevel level,
|
||||
const char *str1,
|
||||
const char *str2,
|
||||
const char *str3,
|
||||
int int1, int int2, const char *msg, ...)
|
||||
ATTRIBUTE_FORMAT(printf, 12, 13);
|
||||
|
||||
void qemudReportError(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
virNetworkPtr net,
|
||||
int code, const char *fmt, ...) {
|
||||
va_list args;
|
||||
char errorMessage[QEMUD_MAX_ERROR_LEN];
|
||||
|
||||
if (fmt) {
|
||||
va_start(args, fmt);
|
||||
vsnprintf(errorMessage, QEMUD_MAX_ERROR_LEN-1, fmt, args);
|
||||
va_end(args);
|
||||
} else {
|
||||
errorMessage[0] = '\0';
|
||||
}
|
||||
|
||||
__virRaiseError(conn, dom, net, VIR_FROM_QEMU, code, VIR_ERR_ERROR,
|
||||
NULL, NULL, NULL, -1, -1, errorMessage);
|
||||
}
|
||||
|
||||
|
||||
/* Free all memory associated with a struct qemud_vm object */
|
||||
void qemudFreeVMDef(struct qemud_vm_def *def) {
|
||||
struct qemud_vm_disk_def *disk = def->disks;
|
||||
@ -183,7 +214,7 @@ static const char *qemudDefaultBinaryForArch(const char *arch) {
|
||||
}
|
||||
|
||||
/* Find the fully qualified path to the binary for an architecture */
|
||||
static char *qemudLocateBinaryForArch(struct qemud_server *server,
|
||||
static char *qemudLocateBinaryForArch(struct qemud_driver *driver,
|
||||
int virtType, const char *arch) {
|
||||
const char *name;
|
||||
char *path;
|
||||
@ -303,14 +334,14 @@ static int qemudExtractVersionInfo(const char *qemu, int *version, int *flags) {
|
||||
}
|
||||
}
|
||||
|
||||
int qemudExtractVersion(struct qemud_server *server) {
|
||||
int qemudExtractVersion(struct qemud_driver *driver) {
|
||||
char *binary = NULL;
|
||||
struct stat sb;
|
||||
|
||||
if (server->qemuVersion > 0)
|
||||
if (driver->qemuVersion > 0)
|
||||
return 0;
|
||||
|
||||
if (!(binary = qemudLocateBinaryForArch(server, QEMUD_VIRT_QEMU, "i686")))
|
||||
if (!(binary = qemudLocateBinaryForArch(driver, QEMUD_VIRT_QEMU, "i686")))
|
||||
return -1;
|
||||
|
||||
if (stat(binary, &sb) < 0) {
|
||||
@ -321,7 +352,7 @@ int qemudExtractVersion(struct qemud_server *server) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qemudExtractVersionInfo(binary, &server->qemuVersion, &server->qemuCmdFlags) < 0) {
|
||||
if (qemudExtractVersionInfo(binary, &driver->qemuVersion, &driver->qemuCmdFlags) < 0) {
|
||||
free(binary);
|
||||
return -1;
|
||||
}
|
||||
@ -332,7 +363,7 @@ int qemudExtractVersion(struct qemud_server *server) {
|
||||
|
||||
|
||||
/* Parse the XML definition for a disk */
|
||||
static struct qemud_vm_disk_def *qemudParseDiskXML(struct qemud_server *server,
|
||||
static struct qemud_vm_disk_def *qemudParseDiskXML(struct qemud_driver *driver,
|
||||
xmlNodePtr node) {
|
||||
struct qemud_vm_disk_def *disk = calloc(1, sizeof(struct qemud_vm_disk_def));
|
||||
xmlNodePtr cur;
|
||||
@ -469,7 +500,7 @@ static void qemudRandomMAC(struct qemud_vm_net_def *net) {
|
||||
|
||||
|
||||
/* Parse the XML definition for a network interface */
|
||||
static struct qemud_vm_net_def *qemudParseInterfaceXML(struct qemud_server *server,
|
||||
static struct qemud_vm_net_def *qemudParseInterfaceXML(struct qemud_driver *driver,
|
||||
xmlNodePtr node) {
|
||||
struct qemud_vm_net_def *net = calloc(1, sizeof(struct qemud_vm_net_def));
|
||||
xmlNodePtr cur;
|
||||
@ -723,7 +754,7 @@ static struct qemud_vm_net_def *qemudParseInterfaceXML(struct qemud_server *serv
|
||||
* Parses a libvirt XML definition of a guest, and populates the
|
||||
* the qemud_vm struct with matching data about the guests config
|
||||
*/
|
||||
static struct qemud_vm_def *qemudParseXML(struct qemud_server *server,
|
||||
static struct qemud_vm_def *qemudParseXML(struct qemud_driver *driver,
|
||||
xmlDocPtr xml) {
|
||||
xmlNodePtr root = NULL;
|
||||
xmlChar *prop = NULL;
|
||||
@ -1006,7 +1037,7 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server,
|
||||
obj = xmlXPathEval(BAD_CAST "string(/domain/devices/emulator[1])", ctxt);
|
||||
if ((obj == NULL) || (obj->type != XPATH_STRING) ||
|
||||
(obj->stringval == NULL) || (obj->stringval[0] == 0)) {
|
||||
char *tmp = qemudLocateBinaryForArch(server, def->virtType, def->os.arch);
|
||||
char *tmp = qemudLocateBinaryForArch(driver, def->virtType, def->os.arch);
|
||||
if (!tmp) {
|
||||
goto error;
|
||||
}
|
||||
@ -1054,7 +1085,7 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server,
|
||||
struct qemud_vm_disk_def *prev = NULL;
|
||||
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
|
||||
struct qemud_vm_disk_def *disk;
|
||||
if (!(disk = qemudParseDiskXML(server, obj->nodesetval->nodeTab[i]))) {
|
||||
if (!(disk = qemudParseDiskXML(driver, obj->nodesetval->nodeTab[i]))) {
|
||||
goto error;
|
||||
}
|
||||
def->ndisks++;
|
||||
@ -1077,7 +1108,7 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server,
|
||||
struct qemud_vm_net_def *prev = NULL;
|
||||
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
|
||||
struct qemud_vm_net_def *net;
|
||||
if (!(net = qemudParseInterfaceXML(server, obj->nodesetval->nodeTab[i]))) {
|
||||
if (!(net = qemudParseInterfaceXML(driver, obj->nodesetval->nodeTab[i]))) {
|
||||
goto error;
|
||||
}
|
||||
def->nnets++;
|
||||
@ -1108,7 +1139,7 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server,
|
||||
|
||||
|
||||
static char *
|
||||
qemudNetworkIfaceConnect(struct qemud_server *server,
|
||||
qemudNetworkIfaceConnect(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
struct qemud_vm_net_def *net,
|
||||
int vlan)
|
||||
@ -1123,7 +1154,7 @@ qemudNetworkIfaceConnect(struct qemud_server *server,
|
||||
int *tapfds;
|
||||
|
||||
if (net->type == QEMUD_NET_NETWORK) {
|
||||
if (!(network = qemudFindNetworkByName(server, net->dst.network.name))) {
|
||||
if (!(network = qemudFindNetworkByName(driver, net->dst.network.name))) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"Network '%s' not found", net->dst.network.name);
|
||||
goto error;
|
||||
@ -1151,13 +1182,13 @@ qemudNetworkIfaceConnect(struct qemud_server *server,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!server->brctl && (err = brInit(&server->brctl))) {
|
||||
if (!driver->brctl && (err = brInit(&driver->brctl))) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot initialize bridge support: %s", strerror(err));
|
||||
goto error;
|
||||
}
|
||||
|
||||
if ((err = brAddTap(server->brctl, brname,
|
||||
if ((err = brAddTap(driver->brctl, brname,
|
||||
ifname, BR_IFNAME_MAXLEN, &tapfd))) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"Failed to add tap interface '%s' to bridge '%s' : %s",
|
||||
@ -1193,7 +1224,7 @@ qemudNetworkIfaceConnect(struct qemud_server *server,
|
||||
* Constructs a argv suitable for launching qemu with config defined
|
||||
* for a given virtual machine.
|
||||
*/
|
||||
int qemudBuildCommandLine(struct qemud_server *server,
|
||||
int qemudBuildCommandLine(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
char ***argv) {
|
||||
int len, n = -1, i;
|
||||
@ -1206,7 +1237,7 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
struct utsname ut;
|
||||
int disableKQEMU = 0;
|
||||
|
||||
if (qemudExtractVersion(server) < 0)
|
||||
if (qemudExtractVersion(driver) < 0)
|
||||
return -1;
|
||||
|
||||
uname(&ut);
|
||||
@ -1223,7 +1254,7 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
* 2. Guest is 'qemu'
|
||||
* 3. The qemu binary has the -no-kqemu flag
|
||||
*/
|
||||
if ((server->qemuCmdFlags & QEMUD_CMD_FLAG_KQEMU) &&
|
||||
if ((driver->qemuCmdFlags & QEMUD_CMD_FLAG_KQEMU) &&
|
||||
!strcmp(ut.machine, vm->def->os.arch) &&
|
||||
vm->def->virtType == QEMUD_VIRT_QEMU)
|
||||
disableKQEMU = 1;
|
||||
@ -1248,7 +1279,7 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
2 + /* cpus */
|
||||
2 + /* boot device */
|
||||
2 + /* monitor */
|
||||
(server->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
(driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
vm->def->noReboot ? 1 : 0) + /* no-reboot */
|
||||
(vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */
|
||||
(vm->def->os.kernel[0] ? 2 : 0) + /* kernel */
|
||||
@ -1286,7 +1317,7 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
if (!((*argv)[++n] = strdup("pty")))
|
||||
goto no_memory;
|
||||
|
||||
if (server->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
if (driver->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
|
||||
vm->def->noReboot) {
|
||||
if (!((*argv)[++n] = strdup("-no-reboot")))
|
||||
goto no_memory;
|
||||
@ -1387,7 +1418,7 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
switch (net->type) {
|
||||
case QEMUD_NET_NETWORK:
|
||||
case QEMUD_NET_BRIDGE:
|
||||
if (!((*argv)[++n] = qemudNetworkIfaceConnect(server, vm, net, vlan)))
|
||||
if (!((*argv)[++n] = qemudNetworkIfaceConnect(driver, vm, net, vlan)))
|
||||
goto error;
|
||||
break;
|
||||
|
||||
@ -1455,7 +1486,7 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
char port[10];
|
||||
int ret;
|
||||
ret = snprintf(port, sizeof(port),
|
||||
((server->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) ?
|
||||
((driver->qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) ?
|
||||
":%d" : "%d"),
|
||||
vm->def->vncActivePort - 5900);
|
||||
if (ret < 0 || ret >= (int)sizeof(port))
|
||||
@ -1496,14 +1527,14 @@ int qemudBuildCommandLine(struct qemud_server *server,
|
||||
|
||||
|
||||
/* Save a guest's config data into a persistent file */
|
||||
static int qemudSaveConfig(struct qemud_server *server,
|
||||
static int qemudSaveConfig(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
struct qemud_vm_def *def) {
|
||||
char *xml;
|
||||
int fd = -1, ret = -1;
|
||||
int towrite;
|
||||
|
||||
if (!(xml = qemudGenerateXML(server, vm, def, 0)))
|
||||
if (!(xml = qemudGenerateXML(driver, vm, def, 0)))
|
||||
return -1;
|
||||
|
||||
if ((fd = open(vm->configFile,
|
||||
@ -1542,7 +1573,7 @@ static int qemudSaveConfig(struct qemud_server *server,
|
||||
}
|
||||
|
||||
struct qemud_vm_def *
|
||||
qemudParseVMDef(struct qemud_server *server,
|
||||
qemudParseVMDef(struct qemud_driver *driver,
|
||||
const char *xmlStr,
|
||||
const char *displayName) {
|
||||
xmlDocPtr xml;
|
||||
@ -1555,7 +1586,7 @@ qemudParseVMDef(struct qemud_server *server,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
def = qemudParseXML(server, xml);
|
||||
def = qemudParseXML(driver, xml);
|
||||
|
||||
xmlFreeDoc(xml);
|
||||
|
||||
@ -1563,12 +1594,12 @@ qemudParseVMDef(struct qemud_server *server,
|
||||
}
|
||||
|
||||
struct qemud_vm *
|
||||
qemudAssignVMDef(struct qemud_server *server,
|
||||
qemudAssignVMDef(struct qemud_driver *driver,
|
||||
struct qemud_vm_def *def)
|
||||
{
|
||||
struct qemud_vm *vm = NULL;
|
||||
|
||||
if ((vm = qemudFindVMByName(server, def->name))) {
|
||||
if ((vm = qemudFindVMByName(driver, def->name))) {
|
||||
if (!qemudIsActiveVM(vm)) {
|
||||
qemudFreeVMDef(vm->def);
|
||||
vm->def = def;
|
||||
@ -1593,21 +1624,21 @@ qemudAssignVMDef(struct qemud_server *server,
|
||||
vm->id = -1;
|
||||
vm->state = QEMUD_STATE_STOPPED;
|
||||
vm->def = def;
|
||||
vm->next = server->vms;
|
||||
vm->next = driver->vms;
|
||||
|
||||
server->vms = vm;
|
||||
server->ninactivevms++;
|
||||
driver->vms = vm;
|
||||
driver->ninactivevms++;
|
||||
|
||||
return vm;
|
||||
}
|
||||
|
||||
void
|
||||
qemudRemoveInactiveVM(struct qemud_server *server,
|
||||
qemudRemoveInactiveVM(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm)
|
||||
{
|
||||
struct qemud_vm *prev = NULL, *curr;
|
||||
|
||||
curr = server->vms;
|
||||
curr = driver->vms;
|
||||
while (curr != vm) {
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
@ -1617,36 +1648,36 @@ qemudRemoveInactiveVM(struct qemud_server *server,
|
||||
if (prev)
|
||||
prev->next = curr->next;
|
||||
else
|
||||
server->vms = curr->next;
|
||||
driver->vms = curr->next;
|
||||
|
||||
server->ninactivevms--;
|
||||
driver->ninactivevms--;
|
||||
}
|
||||
|
||||
qemudFreeVM(vm);
|
||||
}
|
||||
|
||||
int
|
||||
qemudSaveVMDef(struct qemud_server *server,
|
||||
qemudSaveVMDef(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
struct qemud_vm_def *def) {
|
||||
if (vm->configFile[0] == '\0') {
|
||||
int err;
|
||||
|
||||
if ((err = qemudEnsureDir(server->configDir))) {
|
||||
if ((err = qemudEnsureDir(driver->configDir))) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot create config directory %s: %s",
|
||||
server->configDir, strerror(err));
|
||||
driver->configDir, strerror(err));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qemudMakeConfigPath(server->configDir, def->name, ".xml",
|
||||
if (qemudMakeConfigPath(driver->configDir, def->name, ".xml",
|
||||
vm->configFile, PATH_MAX) < 0) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot construct config file path");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qemudMakeConfigPath(server->autostartDir, def->name, ".xml",
|
||||
if (qemudMakeConfigPath(driver->autostartDir, def->name, ".xml",
|
||||
vm->autostartLink, PATH_MAX) < 0) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot construct autostart link path");
|
||||
@ -1655,10 +1686,10 @@ qemudSaveVMDef(struct qemud_server *server,
|
||||
}
|
||||
}
|
||||
|
||||
return qemudSaveConfig(server, vm, def);
|
||||
return qemudSaveConfig(driver, vm, def);
|
||||
}
|
||||
|
||||
static int qemudSaveNetworkConfig(struct qemud_server *server,
|
||||
static int qemudSaveNetworkConfig(struct qemud_driver *driver,
|
||||
struct qemud_network *network,
|
||||
struct qemud_network_def *def) {
|
||||
char *xml;
|
||||
@ -1666,14 +1697,14 @@ static int qemudSaveNetworkConfig(struct qemud_server *server,
|
||||
int towrite;
|
||||
int err;
|
||||
|
||||
if (!(xml = qemudGenerateNetworkXML(server, network, def))) {
|
||||
if (!(xml = qemudGenerateNetworkXML(driver, network, def))) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((err = qemudEnsureDir(server->networkConfigDir))) {
|
||||
if ((err = qemudEnsureDir(driver->networkConfigDir))) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot create config directory %s: %s",
|
||||
server->networkConfigDir, strerror(err));
|
||||
driver->networkConfigDir, strerror(err));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@ -1727,7 +1758,7 @@ void qemudFreeNetwork(struct qemud_network *network) {
|
||||
free(network);
|
||||
}
|
||||
|
||||
static int qemudParseBridgeXML(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
static int qemudParseBridgeXML(struct qemud_driver *driver ATTRIBUTE_UNUSED,
|
||||
struct qemud_network_def *def,
|
||||
xmlNodePtr node) {
|
||||
xmlChar *name, *stp, *delay;
|
||||
@ -1759,7 +1790,7 @@ static int qemudParseBridgeXML(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int qemudParseDhcpRangesXML(struct qemud_server *server,
|
||||
static int qemudParseDhcpRangesXML(struct qemud_driver *driver,
|
||||
struct qemud_network_def *def,
|
||||
xmlNodePtr node) {
|
||||
|
||||
@ -1809,7 +1840,7 @@ static int qemudParseDhcpRangesXML(struct qemud_server *server,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int qemudParseInetXML(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
static int qemudParseInetXML(struct qemud_driver *driver ATTRIBUTE_UNUSED,
|
||||
struct qemud_network_def *def,
|
||||
xmlNodePtr node) {
|
||||
xmlChar *address, *netmask;
|
||||
@ -1850,7 +1881,7 @@ static int qemudParseInetXML(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
while (cur != NULL) {
|
||||
if (cur->type == XML_ELEMENT_NODE &&
|
||||
xmlStrEqual(cur->name, BAD_CAST "dhcp") &&
|
||||
!qemudParseDhcpRangesXML(server, def, cur))
|
||||
!qemudParseDhcpRangesXML(driver, def, cur))
|
||||
return 0;
|
||||
cur = cur->next;
|
||||
}
|
||||
@ -1859,7 +1890,7 @@ static int qemudParseInetXML(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
|
||||
static struct qemud_network_def *qemudParseNetworkXML(struct qemud_server *server,
|
||||
static struct qemud_network_def *qemudParseNetworkXML(struct qemud_driver *driver,
|
||||
xmlDocPtr xml) {
|
||||
xmlNodePtr root = NULL;
|
||||
xmlXPathContextPtr ctxt = NULL;
|
||||
@ -1920,7 +1951,7 @@ static struct qemud_network_def *qemudParseNetworkXML(struct qemud_server *serve
|
||||
obj = xmlXPathEval(BAD_CAST "/network/bridge[1]", ctxt);
|
||||
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
|
||||
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) {
|
||||
if (!qemudParseBridgeXML(server, def, obj->nodesetval->nodeTab[0])) {
|
||||
if (!qemudParseBridgeXML(driver, def, obj->nodesetval->nodeTab[0])) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@ -1930,7 +1961,7 @@ static struct qemud_network_def *qemudParseNetworkXML(struct qemud_server *serve
|
||||
obj = xmlXPathEval(BAD_CAST "/network/ip[1]", ctxt);
|
||||
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
|
||||
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr > 0)) {
|
||||
if (!qemudParseInetXML(server, def, obj->nodesetval->nodeTab[0])) {
|
||||
if (!qemudParseInetXML(driver, def, obj->nodesetval->nodeTab[0])) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@ -1987,7 +2018,7 @@ static struct qemud_network_def *qemudParseNetworkXML(struct qemud_server *serve
|
||||
}
|
||||
|
||||
struct qemud_network_def *
|
||||
qemudParseNetworkDef(struct qemud_server *server,
|
||||
qemudParseNetworkDef(struct qemud_driver *driver,
|
||||
const char *xmlStr,
|
||||
const char *displayName) {
|
||||
xmlDocPtr xml;
|
||||
@ -2000,7 +2031,7 @@ qemudParseNetworkDef(struct qemud_server *server,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
def = qemudParseNetworkXML(server, xml);
|
||||
def = qemudParseNetworkXML(driver, xml);
|
||||
|
||||
xmlFreeDoc(xml);
|
||||
|
||||
@ -2008,11 +2039,11 @@ qemudParseNetworkDef(struct qemud_server *server,
|
||||
}
|
||||
|
||||
struct qemud_network *
|
||||
qemudAssignNetworkDef(struct qemud_server *server,
|
||||
qemudAssignNetworkDef(struct qemud_driver *driver,
|
||||
struct qemud_network_def *def) {
|
||||
struct qemud_network *network;
|
||||
|
||||
if ((network = qemudFindNetworkByName(server, def->name))) {
|
||||
if ((network = qemudFindNetworkByName(driver, def->name))) {
|
||||
if (!qemudIsActiveNetwork(network)) {
|
||||
qemudFreeNetworkDef(network->def);
|
||||
network->def = def;
|
||||
@ -2031,21 +2062,21 @@ qemudAssignNetworkDef(struct qemud_server *server,
|
||||
}
|
||||
|
||||
network->def = def;
|
||||
network->next = server->networks;
|
||||
network->next = driver->networks;
|
||||
|
||||
server->networks = network;
|
||||
server->ninactivenetworks++;
|
||||
driver->networks = network;
|
||||
driver->ninactivenetworks++;
|
||||
|
||||
return network;
|
||||
}
|
||||
|
||||
void
|
||||
qemudRemoveInactiveNetwork(struct qemud_server *server,
|
||||
qemudRemoveInactiveNetwork(struct qemud_driver *driver,
|
||||
struct qemud_network *network)
|
||||
{
|
||||
struct qemud_network *prev = NULL, *curr;
|
||||
|
||||
curr = server->networks;
|
||||
curr = driver->networks;
|
||||
while (curr != network) {
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
@ -2055,37 +2086,37 @@ qemudRemoveInactiveNetwork(struct qemud_server *server,
|
||||
if (prev)
|
||||
prev->next = curr->next;
|
||||
else
|
||||
server->networks = curr->next;
|
||||
driver->networks = curr->next;
|
||||
|
||||
server->ninactivenetworks--;
|
||||
driver->ninactivenetworks--;
|
||||
}
|
||||
|
||||
qemudFreeNetwork(network);
|
||||
}
|
||||
|
||||
int
|
||||
qemudSaveNetworkDef(struct qemud_server *server,
|
||||
qemudSaveNetworkDef(struct qemud_driver *driver,
|
||||
struct qemud_network *network,
|
||||
struct qemud_network_def *def) {
|
||||
|
||||
if (network->configFile[0] == '\0') {
|
||||
int err;
|
||||
|
||||
if ((err = qemudEnsureDir(server->networkConfigDir))) {
|
||||
if ((err = qemudEnsureDir(driver->networkConfigDir))) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot create config directory %s: %s",
|
||||
server->networkConfigDir, strerror(err));
|
||||
driver->networkConfigDir, strerror(err));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qemudMakeConfigPath(server->networkConfigDir, def->name, ".xml",
|
||||
if (qemudMakeConfigPath(driver->networkConfigDir, def->name, ".xml",
|
||||
network->configFile, PATH_MAX) < 0) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot construct config file path");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qemudMakeConfigPath(server->networkAutostartDir, def->name, ".xml",
|
||||
if (qemudMakeConfigPath(driver->networkAutostartDir, def->name, ".xml",
|
||||
network->autostartLink, PATH_MAX) < 0) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"cannot construct autostart link path");
|
||||
@ -2094,7 +2125,7 @@ qemudSaveNetworkDef(struct qemud_server *server,
|
||||
}
|
||||
}
|
||||
|
||||
return qemudSaveNetworkConfig(server, network, def);
|
||||
return qemudSaveNetworkConfig(driver, network, def);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2267,7 +2298,7 @@ checkLinkPointsTo(const char *checkLink,
|
||||
}
|
||||
|
||||
static struct qemud_vm *
|
||||
qemudLoadConfig(struct qemud_server *server,
|
||||
qemudLoadConfig(struct qemud_driver *driver,
|
||||
const char *file,
|
||||
const char *path,
|
||||
const char *xml,
|
||||
@ -2275,7 +2306,7 @@ qemudLoadConfig(struct qemud_server *server,
|
||||
struct qemud_vm_def *def;
|
||||
struct qemud_vm *vm;
|
||||
|
||||
if (!(def = qemudParseVMDef(server, xml, file))) {
|
||||
if (!(def = qemudParseVMDef(driver, xml, file))) {
|
||||
virErrorPtr err = virGetLastError();
|
||||
qemudLog(QEMUD_WARN, "Error parsing QEMU guest config '%s' : %s",
|
||||
path, err->message);
|
||||
@ -2289,7 +2320,7 @@ qemudLoadConfig(struct qemud_server *server,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(vm = qemudAssignVMDef(server, def))) {
|
||||
if (!(vm = qemudAssignVMDef(driver, def))) {
|
||||
qemudLog(QEMUD_WARN, "Failed to load QEMU guest config '%s': out of memory", path);
|
||||
qemudFreeVMDef(def);
|
||||
return NULL;
|
||||
@ -2307,7 +2338,7 @@ qemudLoadConfig(struct qemud_server *server,
|
||||
}
|
||||
|
||||
static struct qemud_network *
|
||||
qemudLoadNetworkConfig(struct qemud_server *server,
|
||||
qemudLoadNetworkConfig(struct qemud_driver *driver,
|
||||
const char *file,
|
||||
const char *path,
|
||||
const char *xml,
|
||||
@ -2315,7 +2346,7 @@ qemudLoadNetworkConfig(struct qemud_server *server,
|
||||
struct qemud_network_def *def;
|
||||
struct qemud_network *network;
|
||||
|
||||
if (!(def = qemudParseNetworkDef(server, xml, file))) {
|
||||
if (!(def = qemudParseNetworkDef(driver, xml, file))) {
|
||||
virErrorPtr err = virGetLastError();
|
||||
qemudLog(QEMUD_WARN, "Error parsing network config '%s' : %s",
|
||||
path, err->message);
|
||||
@ -2329,7 +2360,7 @@ qemudLoadNetworkConfig(struct qemud_server *server,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(network = qemudAssignNetworkDef(server, def))) {
|
||||
if (!(network = qemudAssignNetworkDef(driver, def))) {
|
||||
qemudLog(QEMUD_WARN, "Failed to load network config '%s': out of memory", path);
|
||||
qemudFreeNetworkDef(def);
|
||||
return NULL;
|
||||
@ -2347,7 +2378,7 @@ qemudLoadNetworkConfig(struct qemud_server *server,
|
||||
}
|
||||
|
||||
static
|
||||
int qemudScanConfigDir(struct qemud_server *server,
|
||||
int qemudScanConfigDir(struct qemud_driver *driver,
|
||||
const char *configDir,
|
||||
const char *autostartDir,
|
||||
int isGuest) {
|
||||
@ -2389,9 +2420,9 @@ int qemudScanConfigDir(struct qemud_server *server,
|
||||
continue;
|
||||
|
||||
if (isGuest)
|
||||
qemudLoadConfig(server, entry->d_name, path, xml, autostartLink);
|
||||
qemudLoadConfig(driver, entry->d_name, path, xml, autostartLink);
|
||||
else
|
||||
qemudLoadNetworkConfig(server, entry->d_name, path, xml, autostartLink);
|
||||
qemudLoadNetworkConfig(driver, entry->d_name, path, xml, autostartLink);
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
@ -2399,57 +2430,19 @@ int qemudScanConfigDir(struct qemud_server *server,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
void qemudAutostartConfigs(struct qemud_server *server) {
|
||||
struct qemud_network *network;
|
||||
struct qemud_vm *vm;
|
||||
|
||||
network = server->networks;
|
||||
while (network != NULL) {
|
||||
struct qemud_network *next = network->next;
|
||||
|
||||
if (network->autostart &&
|
||||
!qemudIsActiveNetwork(network) &&
|
||||
qemudStartNetworkDaemon(server, network) < 0) {
|
||||
virErrorPtr err = virGetLastError();
|
||||
qemudLog(QEMUD_ERR, "Failed to autostart network '%s': %s",
|
||||
network->def->name, err->message);
|
||||
}
|
||||
|
||||
network = next;
|
||||
}
|
||||
|
||||
vm = server->vms;
|
||||
while (vm != NULL) {
|
||||
struct qemud_vm *next = vm->next;
|
||||
|
||||
if (vm->autostart &&
|
||||
!qemudIsActiveVM(vm) &&
|
||||
qemudStartVMDaemon(server, vm) < 0) {
|
||||
virErrorPtr err = virGetLastError();
|
||||
qemudLog(QEMUD_ERR, "Failed to autostart VM '%s': %s",
|
||||
vm->def->name, err->message);
|
||||
}
|
||||
|
||||
vm = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan for all guest and network config files */
|
||||
int qemudScanConfigs(struct qemud_server *server) {
|
||||
if (qemudScanConfigDir(server, server->configDir, server->autostartDir, 1) < 0)
|
||||
int qemudScanConfigs(struct qemud_driver *driver) {
|
||||
if (qemudScanConfigDir(driver, driver->configDir, driver->autostartDir, 1) < 0)
|
||||
return -1;
|
||||
|
||||
if (qemudScanConfigDir(server, server->networkConfigDir, server->networkAutostartDir, 0) < 0)
|
||||
if (qemudScanConfigDir(driver, driver->networkConfigDir, driver->networkAutostartDir, 0) < 0)
|
||||
return -1;
|
||||
|
||||
qemudAutostartConfigs(server);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Generate an XML document describing the guest's configuration */
|
||||
char *qemudGenerateXML(struct qemud_server *server,
|
||||
char *qemudGenerateXML(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
struct qemud_vm_def *def,
|
||||
int live) {
|
||||
@ -2727,7 +2720,7 @@ char *qemudGenerateXML(struct qemud_server *server,
|
||||
}
|
||||
|
||||
|
||||
char *qemudGenerateNetworkXML(struct qemud_server *server,
|
||||
char *qemudGenerateNetworkXML(struct qemud_driver *driver,
|
||||
struct qemud_network *network,
|
||||
struct qemud_network_def *def) {
|
||||
bufferPtr buf = 0;
|
||||
@ -2818,7 +2811,7 @@ char *qemudGenerateNetworkXML(struct qemud_server *server,
|
||||
}
|
||||
|
||||
|
||||
int qemudDeleteConfig(struct qemud_server *server,
|
||||
int qemudDeleteConfig(struct qemud_driver *driver,
|
||||
const char *configFile,
|
||||
const char *name) {
|
||||
if (!configFile[0]) {
|
||||
|
292
qemud/conf.h
292
qemud/conf.h
@ -24,15 +24,277 @@
|
||||
#ifndef __QEMUD_CONF_H
|
||||
#define __QEMUD_CONF_H
|
||||
|
||||
#include "internal.h"
|
||||
/* Different types of QEMU acceleration possible */
|
||||
enum qemud_vm_virt_type {
|
||||
QEMUD_VIRT_QEMU,
|
||||
QEMUD_VIRT_KQEMU,
|
||||
QEMUD_VIRT_KVM,
|
||||
};
|
||||
|
||||
int qemudExtractVersion (struct qemud_server *server);
|
||||
int qemudBuildCommandLine (struct qemud_server *server,
|
||||
|
||||
/* Two types of disk backends */
|
||||
enum qemud_vm_disk_type {
|
||||
QEMUD_DISK_BLOCK,
|
||||
QEMUD_DISK_FILE
|
||||
};
|
||||
|
||||
/* Three types of disk frontend */
|
||||
enum qemud_vm_disk_device {
|
||||
QEMUD_DISK_DISK,
|
||||
QEMUD_DISK_CDROM,
|
||||
QEMUD_DISK_FLOPPY,
|
||||
};
|
||||
|
||||
/* Stores the virtual disk configuration */
|
||||
struct qemud_vm_disk_def {
|
||||
int type;
|
||||
int device;
|
||||
char src[PATH_MAX];
|
||||
char dst[NAME_MAX];
|
||||
int readonly;
|
||||
|
||||
struct qemud_vm_disk_def *next;
|
||||
};
|
||||
|
||||
#define QEMUD_MAC_ADDRESS_LEN 6
|
||||
#define QEMUD_OS_TYPE_MAX_LEN 10
|
||||
#define QEMUD_OS_ARCH_MAX_LEN 10
|
||||
#define QEMUD_OS_MACHINE_MAX_LEN 10
|
||||
|
||||
/* 5 different types of networking config */
|
||||
enum qemud_vm_net_type {
|
||||
QEMUD_NET_USER,
|
||||
QEMUD_NET_ETHERNET,
|
||||
QEMUD_NET_SERVER,
|
||||
QEMUD_NET_CLIENT,
|
||||
QEMUD_NET_MCAST,
|
||||
QEMUD_NET_NETWORK,
|
||||
QEMUD_NET_BRIDGE,
|
||||
};
|
||||
|
||||
/* Stores the virtual network interface configuration */
|
||||
struct qemud_vm_net_def {
|
||||
int type;
|
||||
unsigned char mac[QEMUD_MAC_ADDRESS_LEN];
|
||||
union {
|
||||
struct {
|
||||
char ifname[BR_IFNAME_MAXLEN];
|
||||
char script[PATH_MAX];
|
||||
} ethernet;
|
||||
struct {
|
||||
char address[BR_INET_ADDR_MAXLEN];
|
||||
int port;
|
||||
} socket; /* any of NET_CLIENT or NET_SERVER or NET_MCAST */
|
||||
struct {
|
||||
char name[QEMUD_MAX_NAME_LEN];
|
||||
char ifname[BR_IFNAME_MAXLEN];
|
||||
} network;
|
||||
struct {
|
||||
char brname[BR_IFNAME_MAXLEN];
|
||||
char ifname[BR_IFNAME_MAXLEN];
|
||||
} bridge;
|
||||
} dst;
|
||||
|
||||
struct qemud_vm_net_def *next;
|
||||
};
|
||||
|
||||
#define QEMUD_MAX_BOOT_DEVS 4
|
||||
|
||||
/* 3 possible boot devices */
|
||||
enum qemud_vm_boot_order {
|
||||
QEMUD_BOOT_FLOPPY,
|
||||
QEMUD_BOOT_CDROM,
|
||||
QEMUD_BOOT_DISK,
|
||||
QEMUD_BOOT_NET,
|
||||
};
|
||||
/* 3 possible graphics console modes */
|
||||
enum qemud_vm_grapics_type {
|
||||
QEMUD_GRAPHICS_NONE,
|
||||
QEMUD_GRAPHICS_SDL,
|
||||
QEMUD_GRAPHICS_VNC,
|
||||
};
|
||||
|
||||
/* Internal flags to keep track of qemu command line capabilities */
|
||||
enum qemud_cmd_flags {
|
||||
QEMUD_CMD_FLAG_KQEMU = 1,
|
||||
QEMUD_CMD_FLAG_VNC_COLON = 2,
|
||||
QEMUD_CMD_FLAG_NO_REBOOT = 4,
|
||||
};
|
||||
|
||||
|
||||
enum qemud_vm_features {
|
||||
QEMUD_FEATURE_ACPI = 1,
|
||||
};
|
||||
|
||||
/* Operating system configuration data & machine / arch */
|
||||
struct qemud_vm_os_def {
|
||||
char type[QEMUD_OS_TYPE_MAX_LEN];
|
||||
char arch[QEMUD_OS_ARCH_MAX_LEN];
|
||||
char machine[QEMUD_OS_MACHINE_MAX_LEN];
|
||||
int nBootDevs;
|
||||
int bootDevs[QEMUD_MAX_BOOT_DEVS];
|
||||
char kernel[PATH_MAX];
|
||||
char initrd[PATH_MAX];
|
||||
char cmdline[PATH_MAX];
|
||||
char binary[PATH_MAX];
|
||||
};
|
||||
|
||||
/* Guest VM main configuration */
|
||||
struct qemud_vm_def {
|
||||
int virtType;
|
||||
unsigned char uuid[QEMUD_UUID_RAW_LEN];
|
||||
char name[QEMUD_MAX_NAME_LEN];
|
||||
|
||||
int memory;
|
||||
int maxmem;
|
||||
int vcpus;
|
||||
|
||||
int noReboot;
|
||||
|
||||
struct qemud_vm_os_def os;
|
||||
|
||||
int features;
|
||||
int graphicsType;
|
||||
int vncPort;
|
||||
int vncActivePort;
|
||||
|
||||
int ndisks;
|
||||
struct qemud_vm_disk_def *disks;
|
||||
|
||||
int nnets;
|
||||
struct qemud_vm_net_def *nets;
|
||||
};
|
||||
|
||||
/* Guest VM runtime state */
|
||||
struct qemud_vm {
|
||||
int stdout;
|
||||
int stderr;
|
||||
int monitor;
|
||||
int logfile;
|
||||
int pid;
|
||||
int id;
|
||||
int state;
|
||||
|
||||
int *tapfds;
|
||||
int ntapfds;
|
||||
|
||||
char configFile[PATH_MAX];
|
||||
char autostartLink[PATH_MAX];
|
||||
|
||||
struct qemud_vm_def *def; /* The current definition */
|
||||
struct qemud_vm_def *newDef; /* New definition to activate at shutdown */
|
||||
|
||||
unsigned int autostart : 1;
|
||||
|
||||
struct qemud_vm *next;
|
||||
};
|
||||
|
||||
/* Store start and end addresses of a dhcp range */
|
||||
struct qemud_dhcp_range_def {
|
||||
char start[BR_INET_ADDR_MAXLEN];
|
||||
char end[BR_INET_ADDR_MAXLEN];
|
||||
|
||||
struct qemud_dhcp_range_def *next;
|
||||
};
|
||||
|
||||
/* Virtual Network main configuration */
|
||||
struct qemud_network_def {
|
||||
unsigned char uuid[QEMUD_UUID_RAW_LEN];
|
||||
char name[QEMUD_MAX_NAME_LEN];
|
||||
|
||||
char bridge[BR_IFNAME_MAXLEN];
|
||||
int disableSTP;
|
||||
int forwardDelay;
|
||||
|
||||
int forward;
|
||||
char forwardDev[BR_IFNAME_MAXLEN];
|
||||
|
||||
char ipAddress[BR_INET_ADDR_MAXLEN];
|
||||
char netmask[BR_INET_ADDR_MAXLEN];
|
||||
char network[BR_INET_ADDR_MAXLEN+BR_INET_ADDR_MAXLEN+1];
|
||||
|
||||
int nranges;
|
||||
struct qemud_dhcp_range_def *ranges;
|
||||
};
|
||||
|
||||
/* Virtual Network runtime state */
|
||||
struct qemud_network {
|
||||
char configFile[PATH_MAX];
|
||||
char autostartLink[PATH_MAX];
|
||||
|
||||
struct qemud_network_def *def; /* The current definition */
|
||||
struct qemud_network_def *newDef; /* New definition to activate at shutdown */
|
||||
|
||||
char bridge[BR_IFNAME_MAXLEN];
|
||||
int dnsmasqPid;
|
||||
|
||||
unsigned int active : 1;
|
||||
unsigned int autostart : 1;
|
||||
|
||||
struct qemud_network *next;
|
||||
};
|
||||
|
||||
|
||||
/* Main driver state */
|
||||
struct qemud_driver {
|
||||
int qemuVersion;
|
||||
int qemuCmdFlags; /* values from enum qemud_cmd_flags */
|
||||
int nactivevms;
|
||||
int ninactivevms;
|
||||
struct qemud_vm *vms;
|
||||
int nextvmid;
|
||||
int nactivenetworks;
|
||||
int ninactivenetworks;
|
||||
struct qemud_network *networks;
|
||||
brControl *brctl;
|
||||
iptablesContext *iptables;
|
||||
char *configDir;
|
||||
char *autostartDir;
|
||||
char *networkConfigDir;
|
||||
char *networkAutostartDir;
|
||||
char logDir[PATH_MAX];
|
||||
};
|
||||
|
||||
|
||||
static inline int
|
||||
qemudIsActiveVM(struct qemud_vm *vm)
|
||||
{
|
||||
return vm->id != -1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
qemudIsActiveNetwork(struct qemud_network *network)
|
||||
{
|
||||
return network->active;
|
||||
}
|
||||
|
||||
void qemudReportError(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
virNetworkPtr net,
|
||||
int code, const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf,5,6);
|
||||
|
||||
|
||||
|
||||
struct qemud_vm *qemudFindVMByID(const struct qemud_driver *driver,
|
||||
int id);
|
||||
struct qemud_vm *qemudFindVMByUUID(const struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
struct qemud_vm *qemudFindVMByName(const struct qemud_driver *driver,
|
||||
const char *name);
|
||||
|
||||
struct qemud_network *qemudFindNetworkByUUID(const struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
struct qemud_network *qemudFindNetworkByName(const struct qemud_driver *driver,
|
||||
const char *name);
|
||||
|
||||
int qemudExtractVersion (struct qemud_driver *driver);
|
||||
int qemudBuildCommandLine (struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
char ***argv);
|
||||
|
||||
int qemudScanConfigs (struct qemud_server *server);
|
||||
int qemudDeleteConfig (struct qemud_server *server,
|
||||
int qemudScanConfigs (struct qemud_driver *driver);
|
||||
int qemudDeleteConfig (struct qemud_driver *driver,
|
||||
const char *configFile,
|
||||
const char *name);
|
||||
int qemudEnsureDir (const char *path);
|
||||
@ -41,19 +303,19 @@ void qemudFreeVMDef (struct qemud_vm_def *vm);
|
||||
void qemudFreeVM (struct qemud_vm *vm);
|
||||
|
||||
struct qemud_vm *
|
||||
qemudAssignVMDef (struct qemud_server *server,
|
||||
qemudAssignVMDef (struct qemud_driver *driver,
|
||||
struct qemud_vm_def *def);
|
||||
void qemudRemoveInactiveVM (struct qemud_server *server,
|
||||
void qemudRemoveInactiveVM (struct qemud_driver *driver,
|
||||
struct qemud_vm *vm);
|
||||
|
||||
struct qemud_vm_def *
|
||||
qemudParseVMDef (struct qemud_server *server,
|
||||
qemudParseVMDef (struct qemud_driver *driver,
|
||||
const char *xmlStr,
|
||||
const char *displayName);
|
||||
int qemudSaveVMDef (struct qemud_server *server,
|
||||
int qemudSaveVMDef (struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
struct qemud_vm_def *def);
|
||||
char * qemudGenerateXML (struct qemud_server *server,
|
||||
char * qemudGenerateXML (struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
struct qemud_vm_def *def,
|
||||
int live);
|
||||
@ -62,19 +324,19 @@ void qemudFreeNetworkDef (struct qemud_network_def *def);
|
||||
void qemudFreeNetwork (struct qemud_network *network);
|
||||
|
||||
struct qemud_network *
|
||||
qemudAssignNetworkDef (struct qemud_server *server,
|
||||
qemudAssignNetworkDef (struct qemud_driver *driver,
|
||||
struct qemud_network_def *def);
|
||||
void qemudRemoveInactiveNetwork (struct qemud_server *server,
|
||||
void qemudRemoveInactiveNetwork (struct qemud_driver *driver,
|
||||
struct qemud_network *network);
|
||||
|
||||
struct qemud_network_def *
|
||||
qemudParseNetworkDef (struct qemud_server *server,
|
||||
qemudParseNetworkDef (struct qemud_driver *driver,
|
||||
const char *xmlStr,
|
||||
const char *displayName);
|
||||
int qemudSaveNetworkDef (struct qemud_server *server,
|
||||
int qemudSaveNetworkDef (struct qemud_driver *driver,
|
||||
struct qemud_network *network,
|
||||
struct qemud_network_def *def);
|
||||
char * qemudGenerateNetworkXML (struct qemud_server *server,
|
||||
char * qemudGenerateNetworkXML (struct qemud_driver *driver,
|
||||
struct qemud_network *network,
|
||||
struct qemud_network_def *def);
|
||||
|
||||
|
281
qemud/dispatch.c
281
qemud/dispatch.c
@ -34,11 +34,10 @@
|
||||
#include "driver.h"
|
||||
#include "dispatch.h"
|
||||
#include "conf.h"
|
||||
extern struct qemud_driver *qemu_driver;
|
||||
|
||||
|
||||
static int qemudDispatchFailure(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||
struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchFailure(struct qemud_packet_server_data *out) {
|
||||
virErrorPtr err = virGetLastError();
|
||||
|
||||
out->type = QEMUD_SERVER_PKT_FAILURE;
|
||||
@ -51,11 +50,10 @@ static int qemudDispatchFailure(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
|
||||
static int qemudDispatchGetVersion(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int version = qemudGetVersion(server);
|
||||
static int qemudDispatchGetVersion(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int version = qemudGetVersion(qemu_driver);
|
||||
if (version < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_GET_VERSION;
|
||||
@ -64,8 +62,7 @@ static int qemudDispatchGetVersion(struct qemud_server *server, struct qemud_cli
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchGetNodeInfo(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchGetNodeInfo(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
if (qemudGetNodeInfo(&out->qemud_packet_server_data_u.getNodeInfoReply.memory,
|
||||
out->qemud_packet_server_data_u.getNodeInfoReply.model,
|
||||
sizeof(out->qemud_packet_server_data_u.getNodeInfoReply.model),
|
||||
@ -75,7 +72,7 @@ static int qemudDispatchGetNodeInfo(struct qemud_server *server, struct qemud_cl
|
||||
&out->qemud_packet_server_data_u.getNodeInfoReply.sockets,
|
||||
&out->qemud_packet_server_data_u.getNodeInfoReply.cores,
|
||||
&out->qemud_packet_server_data_u.getNodeInfoReply.threads) < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
@ -87,16 +84,14 @@ static int qemudDispatchGetNodeInfo(struct qemud_server *server, struct qemud_cl
|
||||
}
|
||||
|
||||
static int
|
||||
qemudDispatchGetCapabilities (struct qemud_server *server,
|
||||
struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED,
|
||||
qemudDispatchGetCapabilities (struct qemud_packet_client_data *in ATTRIBUTE_UNUSED,
|
||||
struct qemud_packet_server_data *out)
|
||||
{
|
||||
char *xml = qemudGetCapabilities(server);
|
||||
char *xml = qemudGetCapabilities(qemu_driver);
|
||||
|
||||
if (strlen(xml) > QEMUD_MAX_XML_LEN) {
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_XML_ERROR, NULL);
|
||||
qemudDispatchFailure (server, client, out);
|
||||
qemudDispatchFailure(out);
|
||||
free(xml);
|
||||
return 0;
|
||||
}
|
||||
@ -107,15 +102,14 @@ qemudDispatchGetCapabilities (struct qemud_server *server,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchListDomains(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchListDomains(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int i, ndomains, domains[QEMUD_MAX_NUM_DOMAINS];
|
||||
|
||||
ndomains = qemudListDomains(server,
|
||||
ndomains = qemudListDomains(qemu_driver,
|
||||
domains,
|
||||
QEMUD_MAX_NUM_DOMAINS);
|
||||
if (ndomains < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_LIST_DOMAINS;
|
||||
@ -127,11 +121,10 @@ static int qemudDispatchListDomains(struct qemud_server *server, struct qemud_cl
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNumDomains(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int ndomains = qemudNumDomains(server);
|
||||
static int qemudDispatchNumDomains(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int ndomains = qemudNumDomains(qemu_driver);
|
||||
if (ndomains < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NUM_DOMAINS;
|
||||
@ -140,13 +133,12 @@ static int qemudDispatchNumDomains(struct qemud_server *server, struct qemud_cli
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainCreate(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainCreate(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
in->qemud_packet_client_data_u.domainCreateRequest.xml[QEMUD_MAX_XML_LEN-1] ='\0';
|
||||
|
||||
struct qemud_vm *vm = qemudDomainCreate(server, in->qemud_packet_client_data_u.domainCreateRequest.xml);
|
||||
struct qemud_vm *vm = qemudDomainCreate(qemu_driver, in->qemud_packet_client_data_u.domainCreateRequest.xml);
|
||||
if (!vm) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_CREATE;
|
||||
@ -158,11 +150,10 @@ static int qemudDispatchDomainCreate(struct qemud_server *server, struct qemud_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainLookupByID(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_vm *vm = qemudFindVMByID(server, in->qemud_packet_client_data_u.domainLookupByIDRequest.id);
|
||||
static int qemudDispatchDomainLookupByID(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_vm *vm = qemudFindVMByID(qemu_driver, in->qemud_packet_client_data_u.domainLookupByIDRequest.id);
|
||||
if (!vm) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_LOOKUP_BY_ID;
|
||||
@ -173,11 +164,10 @@ static int qemudDispatchDomainLookupByID(struct qemud_server *server, struct qem
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainLookupByUUID(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_vm *vm = qemudFindVMByUUID(server, in->qemud_packet_client_data_u.domainLookupByUUIDRequest.uuid);
|
||||
static int qemudDispatchDomainLookupByUUID(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_vm *vm = qemudFindVMByUUID(qemu_driver, in->qemud_packet_client_data_u.domainLookupByUUIDRequest.uuid);
|
||||
if (!vm) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_LOOKUP_BY_UUID;
|
||||
@ -188,13 +178,12 @@ static int qemudDispatchDomainLookupByUUID(struct qemud_server *server, struct q
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainLookupByName(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainLookupByName(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
/* Paranoia NULL termination */
|
||||
in->qemud_packet_client_data_u.domainLookupByNameRequest.name[QEMUD_MAX_NAME_LEN-1] = '\0';
|
||||
struct qemud_vm *vm = qemudFindVMByName(server, in->qemud_packet_client_data_u.domainLookupByNameRequest.name);
|
||||
struct qemud_vm *vm = qemudFindVMByName(qemu_driver, in->qemud_packet_client_data_u.domainLookupByNameRequest.name);
|
||||
if (!vm) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_LOOKUP_BY_NAME;
|
||||
@ -204,11 +193,10 @@ static int qemudDispatchDomainLookupByName(struct qemud_server *server, struct q
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainSuspend(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudDomainSuspend(server, in->qemud_packet_client_data_u.domainSuspendRequest.id);
|
||||
static int qemudDispatchDomainSuspend(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudDomainSuspend(qemu_driver, in->qemud_packet_client_data_u.domainSuspendRequest.id);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_SUSPEND;
|
||||
@ -216,11 +204,10 @@ static int qemudDispatchDomainSuspend(struct qemud_server *server, struct qemud_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainResume(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudDomainResume(server, in->qemud_packet_client_data_u.domainResumeRequest.id);
|
||||
static int qemudDispatchDomainResume(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudDomainResume(qemu_driver, in->qemud_packet_client_data_u.domainResumeRequest.id);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_RESUME;
|
||||
@ -228,10 +215,9 @@ static int qemudDispatchDomainResume(struct qemud_server *server, struct qemud_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainDestroy(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
if (qemudDomainDestroy(server, in->qemud_packet_client_data_u.domainDestroyRequest.id) < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
static int qemudDispatchDomainDestroy(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
if (qemudDomainDestroy(qemu_driver, in->qemud_packet_client_data_u.domainDestroyRequest.id) < 0) {
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_DESTROY;
|
||||
@ -239,22 +225,21 @@ static int qemudDispatchDomainDestroy(struct qemud_server *server, struct qemud_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainGetInfo(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainGetInfo(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int runstate;
|
||||
unsigned long long cpuTime;
|
||||
unsigned long memory;
|
||||
unsigned long maxmem;
|
||||
unsigned int nrVirtCpu;
|
||||
|
||||
int ret = qemudDomainGetInfo(server, in->qemud_packet_client_data_u.domainGetInfoRequest.uuid,
|
||||
int ret = qemudDomainGetInfo(qemu_driver, in->qemud_packet_client_data_u.domainGetInfoRequest.uuid,
|
||||
&runstate,
|
||||
&cpuTime,
|
||||
&maxmem,
|
||||
&memory,
|
||||
&nrVirtCpu);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_GET_INFO;
|
||||
@ -267,16 +252,15 @@ static int qemudDispatchDomainGetInfo(struct qemud_server *server, struct qemud_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainSave(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainSave(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
/* Paranoia NULL termination */
|
||||
in->qemud_packet_client_data_u.domainSaveRequest.file[PATH_MAX-1] ='\0';
|
||||
|
||||
int ret = qemudDomainSave(server,
|
||||
int ret = qemudDomainSave(qemu_driver,
|
||||
in->qemud_packet_client_data_u.domainSaveRequest.id,
|
||||
in->qemud_packet_client_data_u.domainSaveRequest.file);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_SAVE;
|
||||
@ -284,16 +268,15 @@ static int qemudDispatchDomainSave(struct qemud_server *server, struct qemud_cli
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainRestore(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainRestore(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int id;
|
||||
|
||||
/* Paranoia null termination */
|
||||
in->qemud_packet_client_data_u.domainRestoreRequest.file[PATH_MAX-1] ='\0';
|
||||
|
||||
id = qemudDomainRestore(server, in->qemud_packet_client_data_u.domainRestoreRequest.file);
|
||||
id = qemudDomainRestore(qemu_driver, in->qemud_packet_client_data_u.domainRestoreRequest.file);
|
||||
if (id < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_RESTORE;
|
||||
@ -302,15 +285,14 @@ static int qemudDispatchDomainRestore(struct qemud_server *server, struct qemud_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDumpXML(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDumpXML(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret;
|
||||
ret = qemudDomainDumpXML(server,
|
||||
ret = qemudDomainDumpXML(qemu_driver,
|
||||
in->qemud_packet_client_data_u.domainDumpXMLRequest.uuid,
|
||||
out->qemud_packet_server_data_u.domainDumpXMLReply.xml,
|
||||
QEMUD_MAX_XML_LEN);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DUMP_XML;
|
||||
@ -318,8 +300,7 @@ static int qemudDispatchDumpXML(struct qemud_server *server, struct qemud_client
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchListDefinedDomains(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchListDefinedDomains(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
char **names;
|
||||
int i, ndomains;
|
||||
|
||||
@ -330,12 +311,12 @@ static int qemudDispatchListDefinedDomains(struct qemud_server *server, struct q
|
||||
names[i] = &out->qemud_packet_server_data_u.listDefinedDomainsReply.domains[i*QEMUD_MAX_NAME_LEN];
|
||||
}
|
||||
|
||||
ndomains = qemudListDefinedDomains(server,
|
||||
ndomains = qemudListDefinedDomains(qemu_driver,
|
||||
names,
|
||||
QEMUD_MAX_NUM_DOMAINS);
|
||||
free(names);
|
||||
if (ndomains < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_LIST_DEFINED_DOMAINS;
|
||||
@ -348,11 +329,10 @@ static int qemudDispatchListDefinedDomains(struct qemud_server *server, struct q
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNumDefinedDomains(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int ndomains = qemudNumDefinedDomains(server);
|
||||
static int qemudDispatchNumDefinedDomains(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int ndomains = qemudNumDefinedDomains(qemu_driver);
|
||||
if (ndomains < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NUM_DEFINED_DOMAINS;
|
||||
@ -361,12 +341,11 @@ static int qemudDispatchNumDefinedDomains(struct qemud_server *server, struct qe
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainStart(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainStart(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_vm *vm;
|
||||
|
||||
if (!(vm = qemudDomainStart(server, in->qemud_packet_client_data_u.domainStartRequest.uuid))) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (!(vm = qemudDomainStart(qemu_driver, in->qemud_packet_client_data_u.domainStartRequest.uuid))) {
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_START;
|
||||
@ -375,13 +354,12 @@ static int qemudDispatchDomainStart(struct qemud_server *server, struct qemud_cl
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainDefine(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchDomainDefine(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
in->qemud_packet_client_data_u.domainDefineRequest.xml[QEMUD_MAX_XML_LEN-1] ='\0';
|
||||
|
||||
struct qemud_vm *vm = qemudDomainDefine(server, in->qemud_packet_client_data_u.domainDefineRequest.xml);
|
||||
struct qemud_vm *vm = qemudDomainDefine(qemu_driver, in->qemud_packet_client_data_u.domainDefineRequest.xml);
|
||||
if (!vm) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_DEFINE;
|
||||
@ -392,11 +370,10 @@ static int qemudDispatchDomainDefine(struct qemud_server *server, struct qemud_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainUndefine(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudDomainUndefine(server, in->qemud_packet_client_data_u.domainUndefineRequest.uuid);
|
||||
static int qemudDispatchDomainUndefine(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudDomainUndefine(qemu_driver, in->qemud_packet_client_data_u.domainUndefineRequest.uuid);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_UNDEFINE;
|
||||
@ -404,11 +381,10 @@ static int qemudDispatchDomainUndefine(struct qemud_server *server, struct qemud
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNumNetworks(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int nnetworks = qemudNumNetworks(server);
|
||||
static int qemudDispatchNumNetworks(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int nnetworks = qemudNumNetworks(qemu_driver);
|
||||
if (nnetworks < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NUM_NETWORKS;
|
||||
@ -417,8 +393,7 @@ static int qemudDispatchNumNetworks(struct qemud_server *server, struct qemud_cl
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchListNetworks(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchListNetworks(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
char **names;
|
||||
int i;
|
||||
|
||||
@ -429,12 +404,12 @@ static int qemudDispatchListNetworks(struct qemud_server *server, struct qemud_c
|
||||
names[i] = &out->qemud_packet_server_data_u.listNetworksReply.networks[i*QEMUD_MAX_NAME_LEN];
|
||||
}
|
||||
|
||||
int nnetworks = qemudListNetworks(server,
|
||||
int nnetworks = qemudListNetworks(qemu_driver,
|
||||
names,
|
||||
QEMUD_MAX_NUM_NETWORKS);
|
||||
free(names);
|
||||
if (nnetworks < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_LIST_NETWORKS;
|
||||
@ -443,11 +418,10 @@ static int qemudDispatchListNetworks(struct qemud_server *server, struct qemud_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNumDefinedNetworks(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int nnetworks = qemudNumDefinedNetworks(server);
|
||||
static int qemudDispatchNumDefinedNetworks(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
int nnetworks = qemudNumDefinedNetworks(qemu_driver);
|
||||
if (nnetworks < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NUM_DEFINED_NETWORKS;
|
||||
@ -456,8 +430,7 @@ static int qemudDispatchNumDefinedNetworks(struct qemud_server *server, struct q
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchListDefinedNetworks(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchListDefinedNetworks(struct qemud_packet_client_data *in ATTRIBUTE_UNUSED, struct qemud_packet_server_data *out) {
|
||||
char **names;
|
||||
int i;
|
||||
|
||||
@ -468,12 +441,12 @@ static int qemudDispatchListDefinedNetworks(struct qemud_server *server, struct
|
||||
names[i] = &out->qemud_packet_server_data_u.listDefinedNetworksReply.networks[i*QEMUD_MAX_NAME_LEN];
|
||||
}
|
||||
|
||||
int nnetworks = qemudListDefinedNetworks(server,
|
||||
int nnetworks = qemudListDefinedNetworks(qemu_driver,
|
||||
names,
|
||||
QEMUD_MAX_NUM_NETWORKS);
|
||||
free(names);
|
||||
if (nnetworks < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_LIST_DEFINED_NETWORKS;
|
||||
@ -482,13 +455,12 @@ static int qemudDispatchListDefinedNetworks(struct qemud_server *server, struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkLookupByName(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchNetworkLookupByName(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
/* Paranoia NULL termination */
|
||||
in->qemud_packet_client_data_u.networkLookupByNameRequest.name[QEMUD_MAX_NAME_LEN-1] = '\0';
|
||||
struct qemud_network *network = qemudFindNetworkByName(server, in->qemud_packet_client_data_u.networkLookupByNameRequest.name);
|
||||
struct qemud_network *network = qemudFindNetworkByName(qemu_driver, in->qemud_packet_client_data_u.networkLookupByNameRequest.name);
|
||||
if (!network) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_LOOKUP_BY_NAME;
|
||||
@ -497,11 +469,10 @@ static int qemudDispatchNetworkLookupByName(struct qemud_server *server, struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkLookupByUUID(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_network *network = qemudFindNetworkByUUID(server, in->qemud_packet_client_data_u.networkLookupByUUIDRequest.uuid);
|
||||
static int qemudDispatchNetworkLookupByUUID(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_network *network = qemudFindNetworkByUUID(qemu_driver, in->qemud_packet_client_data_u.networkLookupByUUIDRequest.uuid);
|
||||
if (!network) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_LOOKUP_BY_UUID;
|
||||
@ -511,13 +482,12 @@ static int qemudDispatchNetworkLookupByUUID(struct qemud_server *server, struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkCreate(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchNetworkCreate(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
in->qemud_packet_client_data_u.networkCreateRequest.xml[QEMUD_MAX_XML_LEN-1] ='\0';
|
||||
|
||||
struct qemud_network *network = qemudNetworkCreate(server, in->qemud_packet_client_data_u.networkCreateRequest.xml);
|
||||
struct qemud_network *network = qemudNetworkCreate(qemu_driver, in->qemud_packet_client_data_u.networkCreateRequest.xml);
|
||||
if (!network) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_CREATE;
|
||||
@ -528,13 +498,12 @@ static int qemudDispatchNetworkCreate(struct qemud_server *server, struct qemud_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkDefine(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchNetworkDefine(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
in->qemud_packet_client_data_u.networkDefineRequest.xml[QEMUD_MAX_XML_LEN-1] ='\0';
|
||||
|
||||
struct qemud_network *network = qemudNetworkDefine(server, in->qemud_packet_client_data_u.networkDefineRequest.xml);
|
||||
struct qemud_network *network = qemudNetworkDefine(qemu_driver, in->qemud_packet_client_data_u.networkDefineRequest.xml);
|
||||
if (!network) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_DEFINE;
|
||||
@ -545,11 +514,10 @@ static int qemudDispatchNetworkDefine(struct qemud_server *server, struct qemud_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkUndefine(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudNetworkUndefine(server, in->qemud_packet_client_data_u.networkUndefineRequest.uuid);
|
||||
static int qemudDispatchNetworkUndefine(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudNetworkUndefine(qemu_driver, in->qemud_packet_client_data_u.networkUndefineRequest.uuid);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_UNDEFINE;
|
||||
@ -557,12 +525,11 @@ static int qemudDispatchNetworkUndefine(struct qemud_server *server, struct qemu
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkStart(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
static int qemudDispatchNetworkStart(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
struct qemud_network *network;
|
||||
|
||||
if (!(network = qemudNetworkStart(server, in->qemud_packet_client_data_u.networkStartRequest.uuid))) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (!(network = qemudNetworkStart(qemu_driver, in->qemud_packet_client_data_u.networkStartRequest.uuid))) {
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_START;
|
||||
@ -570,10 +537,9 @@ static int qemudDispatchNetworkStart(struct qemud_server *server, struct qemud_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkDestroy(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
if (qemudNetworkDestroy(server, in->qemud_packet_client_data_u.networkDestroyRequest.uuid) < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
static int qemudDispatchNetworkDestroy(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
if (qemudNetworkDestroy(qemu_driver, in->qemud_packet_client_data_u.networkDestroyRequest.uuid) < 0) {
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_DESTROY;
|
||||
@ -581,13 +547,12 @@ static int qemudDispatchNetworkDestroy(struct qemud_server *server, struct qemud
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkDumpXML(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudNetworkDumpXML(server,
|
||||
static int qemudDispatchNetworkDumpXML(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudNetworkDumpXML(qemu_driver,
|
||||
in->qemud_packet_client_data_u.networkDumpXMLRequest.uuid,
|
||||
out->qemud_packet_server_data_u.networkDumpXMLReply.xml, QEMUD_MAX_XML_LEN);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_DUMP_XML;
|
||||
@ -595,13 +560,12 @@ static int qemudDispatchNetworkDumpXML(struct qemud_server *server, struct qemud
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkGetBridgeName(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudNetworkGetBridgeName(server,
|
||||
static int qemudDispatchNetworkGetBridgeName(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out) {
|
||||
int ret = qemudNetworkGetBridgeName(qemu_driver,
|
||||
in->qemud_packet_client_data_u.networkDumpXMLRequest.uuid,
|
||||
out->qemud_packet_server_data_u.networkGetBridgeNameReply.ifname, QEMUD_MAX_IFNAME_LEN);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_GET_BRIDGE_NAME;
|
||||
@ -609,19 +573,18 @@ static int qemudDispatchNetworkGetBridgeName(struct qemud_server *server, struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainGetAutostart(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
static int qemudDispatchDomainGetAutostart(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
{
|
||||
int ret;
|
||||
int autostart;
|
||||
|
||||
autostart = 0;
|
||||
|
||||
ret = qemudDomainGetAutostart(server,
|
||||
ret = qemudDomainGetAutostart(qemu_driver,
|
||||
in->qemud_packet_client_data_u.domainGetAutostartRequest.uuid,
|
||||
&autostart);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_GET_AUTOSTART;
|
||||
@ -630,16 +593,15 @@ static int qemudDispatchDomainGetAutostart(struct qemud_server *server, struct q
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchDomainSetAutostart(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
static int qemudDispatchDomainSetAutostart(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = qemudDomainSetAutostart(server,
|
||||
ret = qemudDomainSetAutostart(qemu_driver,
|
||||
in->qemud_packet_client_data_u.domainGetAutostartRequest.uuid,
|
||||
in->qemud_packet_client_data_u.domainSetAutostartRequest.autostart);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_DOMAIN_SET_AUTOSTART;
|
||||
@ -647,19 +609,18 @@ static int qemudDispatchDomainSetAutostart(struct qemud_server *server, struct q
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkGetAutostart(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
static int qemudDispatchNetworkGetAutostart(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
{
|
||||
int ret;
|
||||
int autostart;
|
||||
|
||||
autostart = 0;
|
||||
|
||||
ret = qemudNetworkGetAutostart(server,
|
||||
ret = qemudNetworkGetAutostart(qemu_driver,
|
||||
in->qemud_packet_client_data_u.networkGetAutostartRequest.uuid,
|
||||
&autostart);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_GET_AUTOSTART;
|
||||
@ -668,16 +629,15 @@ static int qemudDispatchNetworkGetAutostart(struct qemud_server *server, struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qemudDispatchNetworkSetAutostart(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
static int qemudDispatchNetworkSetAutostart(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = qemudNetworkSetAutostart(server,
|
||||
ret = qemudNetworkSetAutostart(qemu_driver,
|
||||
in->qemud_packet_client_data_u.networkGetAutostartRequest.uuid,
|
||||
in->qemud_packet_client_data_u.networkSetAutostartRequest.autostart);
|
||||
if (ret < 0) {
|
||||
if (qemudDispatchFailure(server, client, out) < 0)
|
||||
if (qemudDispatchFailure(out) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
out->type = QEMUD_SERVER_PKT_NETWORK_SET_AUTOSTART;
|
||||
@ -685,8 +645,7 @@ static int qemudDispatchNetworkSetAutostart(struct qemud_server *server, struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef int (*clientFunc)(struct qemud_server *server, struct qemud_client *client,
|
||||
struct qemud_packet_client_data *in, struct qemud_packet_server_data *out);
|
||||
typedef int (*clientFunc)(struct qemud_packet_client_data *in, struct qemud_packet_server_data *out);
|
||||
|
||||
|
||||
/* One per message type recorded in qemud_packet_type enum */
|
||||
@ -782,7 +741,9 @@ clientFunc funcsTransmitRO[QEMUD_CLIENT_PKT_MAX] = {
|
||||
* is recorded by the return message type - either it matches the
|
||||
* incoming type, or is QEMUD_PKT_FAILURE
|
||||
*/
|
||||
int qemudDispatch(struct qemud_server *server, struct qemud_client *client,
|
||||
|
||||
int qemudDispatch(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client,
|
||||
qemud_packet_client_data *in, qemud_packet_server_data *out) {
|
||||
clientFunc *funcs;
|
||||
unsigned int type = in->type;
|
||||
@ -806,9 +767,9 @@ int qemudDispatch(struct qemud_server *server, struct qemud_client *client,
|
||||
if (!funcs[type]) {
|
||||
qemudDebug("Illegal operation requested");
|
||||
qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_DENIED, NULL);
|
||||
qemudDispatchFailure(server, client, out);
|
||||
qemudDispatchFailure(out);
|
||||
} else {
|
||||
if ((funcs[type])(server, client, in, out) < 0) {
|
||||
if ((funcs[type])(in, out) < 0) {
|
||||
qemudDebug("Dispatch failed");
|
||||
return -1;
|
||||
}
|
||||
|
621
qemud/driver.c
621
qemud/driver.c
File diff suppressed because it is too large
Load Diff
@ -26,28 +26,23 @@
|
||||
#define QEMUD_DRIVER_H
|
||||
|
||||
#include "internal.h"
|
||||
#include "conf.h"
|
||||
|
||||
int qemudStartVMDaemon(struct qemud_server *server,
|
||||
int qemudStartVMDaemon(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm);
|
||||
|
||||
int qemudShutdownVMDaemon(struct qemud_server *server,
|
||||
int qemudShutdownVMDaemon(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm);
|
||||
|
||||
int qemudStartNetworkDaemon(struct qemud_server *server,
|
||||
int qemudStartNetworkDaemon(struct qemud_driver *driver,
|
||||
struct qemud_network *network);
|
||||
|
||||
int qemudShutdownNetworkDaemon(struct qemud_server *server,
|
||||
int qemudShutdownNetworkDaemon(struct qemud_driver *driver,
|
||||
struct qemud_network *network);
|
||||
|
||||
int qemudStartup(struct qemud_server *server);
|
||||
void qemudReload(struct qemud_server *server);
|
||||
void qemudShutdown(struct qemud_server *server);
|
||||
|
||||
void qemudReportError(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
virNetworkPtr net,
|
||||
int code, const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf,5,6);
|
||||
int qemudStartup(void);
|
||||
void qemudReload(void);
|
||||
void qemudShutdown(void);
|
||||
|
||||
int qemudGetNodeInfo(unsigned int *memory,
|
||||
char *cpuModel, int cpuModelLength,
|
||||
@ -55,100 +50,89 @@ int qemudGetNodeInfo(unsigned int *memory,
|
||||
unsigned int *nodes, unsigned int *sockets,
|
||||
unsigned int *cores, unsigned int *threads);
|
||||
|
||||
char *qemudGetCapabilities(struct qemud_server *server);
|
||||
int qemudMonitorCommand(struct qemud_server *server,
|
||||
char *qemudGetCapabilities(struct qemud_driver *driver);
|
||||
int qemudMonitorCommand(struct qemud_driver *driver,
|
||||
struct qemud_vm *vm,
|
||||
const char *cmd,
|
||||
char **reply);
|
||||
|
||||
struct qemud_vm *qemudFindVMByID(const struct qemud_server *server,
|
||||
int id);
|
||||
struct qemud_vm *qemudFindVMByUUID(const struct qemud_server *server,
|
||||
const unsigned char *uuid);
|
||||
struct qemud_vm *qemudFindVMByName(const struct qemud_server *server,
|
||||
const char *name);
|
||||
|
||||
int qemudGetVersion(struct qemud_server *server);
|
||||
int qemudListDomains(struct qemud_server *server,
|
||||
int qemudGetVersion(struct qemud_driver *driver);
|
||||
int qemudListDomains(struct qemud_driver *driver,
|
||||
int *ids,
|
||||
int nids);
|
||||
int qemudNumDomains(struct qemud_server *server);
|
||||
struct qemud_vm *qemudDomainCreate(struct qemud_server *server,
|
||||
int qemudNumDomains(struct qemud_driver *driver);
|
||||
struct qemud_vm *qemudDomainCreate(struct qemud_driver *driver,
|
||||
const char *xml);
|
||||
int qemudDomainSuspend(struct qemud_server *server,
|
||||
int qemudDomainSuspend(struct qemud_driver *driver,
|
||||
int id);
|
||||
int qemudDomainResume(struct qemud_server *server,
|
||||
int qemudDomainResume(struct qemud_driver *driver,
|
||||
int id);
|
||||
int qemudDomainDestroy(struct qemud_server *server,
|
||||
int qemudDomainDestroy(struct qemud_driver *driver,
|
||||
int id);
|
||||
int qemudDomainGetInfo(struct qemud_server *server,
|
||||
int qemudDomainGetInfo(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
int *runstate,
|
||||
unsigned long long *cputime,
|
||||
unsigned long *maxmem,
|
||||
unsigned long *memory,
|
||||
unsigned int *nrVirtCpu);
|
||||
int qemudDomainSave(struct qemud_server *server,
|
||||
int qemudDomainSave(struct qemud_driver *driver,
|
||||
int id,
|
||||
const char *path);
|
||||
int qemudDomainRestore(struct qemud_server *server,
|
||||
int qemudDomainRestore(struct qemud_driver *driver,
|
||||
const char *path);
|
||||
int qemudDomainDumpXML(struct qemud_server *server,
|
||||
int qemudDomainDumpXML(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
char *xml,
|
||||
int xmllen);
|
||||
int qemudListDefinedDomains(struct qemud_server *server,
|
||||
int qemudListDefinedDomains(struct qemud_driver *driver,
|
||||
char *const*names,
|
||||
int nnames);
|
||||
int qemudNumDefinedDomains(struct qemud_server *server);
|
||||
struct qemud_vm *qemudDomainStart(struct qemud_server *server,
|
||||
int qemudNumDefinedDomains(struct qemud_driver *driver);
|
||||
struct qemud_vm *qemudDomainStart(struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
struct qemud_vm *qemudDomainDefine(struct qemud_server *server,
|
||||
struct qemud_vm *qemudDomainDefine(struct qemud_driver *driver,
|
||||
const char *xml);
|
||||
int qemudDomainUndefine(struct qemud_server *server,
|
||||
int qemudDomainUndefine(struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
int qemudDomainGetAutostart(struct qemud_server *server,
|
||||
int qemudDomainGetAutostart(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
int *autostart);
|
||||
int qemudDomainSetAutostart(struct qemud_server *server,
|
||||
int qemudDomainSetAutostart(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
int autostart);
|
||||
|
||||
struct qemud_network *qemudFindNetworkByUUID(const struct qemud_server *server,
|
||||
const unsigned char *uuid);
|
||||
struct qemud_network *qemudFindNetworkByName(const struct qemud_server *server,
|
||||
const char *name);
|
||||
|
||||
int qemudNumNetworks(struct qemud_server *server);
|
||||
int qemudListNetworks(struct qemud_server *server,
|
||||
int qemudNumNetworks(struct qemud_driver *driver);
|
||||
int qemudListNetworks(struct qemud_driver *driver,
|
||||
char *const*names,
|
||||
int nnames);
|
||||
int qemudNumDefinedNetworks(struct qemud_server *server);
|
||||
int qemudListDefinedNetworks(struct qemud_server *server,
|
||||
int qemudNumDefinedNetworks(struct qemud_driver *driver);
|
||||
int qemudListDefinedNetworks(struct qemud_driver *driver,
|
||||
char *const*names,
|
||||
int nnames);
|
||||
struct qemud_network *qemudNetworkCreate(struct qemud_server *server,
|
||||
struct qemud_network *qemudNetworkCreate(struct qemud_driver *driver,
|
||||
const char *xml);
|
||||
struct qemud_network *qemudNetworkDefine(struct qemud_server *server,
|
||||
struct qemud_network *qemudNetworkDefine(struct qemud_driver *driver,
|
||||
const char *xml);
|
||||
struct qemud_network *qemudNetworkStart(struct qemud_server *server,
|
||||
struct qemud_network *qemudNetworkStart(struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
int qemudNetworkUndefine(struct qemud_server *server,
|
||||
int qemudNetworkUndefine(struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
int qemudNetworkDestroy(struct qemud_server *server,
|
||||
int qemudNetworkDestroy(struct qemud_driver *driver,
|
||||
const unsigned char *uuid);
|
||||
int qemudNetworkDumpXML(struct qemud_server *server,
|
||||
int qemudNetworkDumpXML(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
char *xml,
|
||||
int xmllen);
|
||||
int qemudNetworkGetBridgeName(struct qemud_server *server,
|
||||
int qemudNetworkGetBridgeName(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
char *ifname,
|
||||
int ifnamelen);
|
||||
int qemudNetworkGetAutostart(struct qemud_server *server,
|
||||
int qemudNetworkGetAutostart(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
int *autostart);
|
||||
int qemudNetworkSetAutostart(struct qemud_server *server,
|
||||
int qemudNetworkSetAutostart(struct qemud_driver *driver,
|
||||
const unsigned char *uuid,
|
||||
int autostart);
|
||||
|
||||
|
236
qemud/internal.h
236
qemud/internal.h
@ -61,216 +61,6 @@ typedef enum {
|
||||
#endif
|
||||
} qemudLogPriority;
|
||||
|
||||
/* Different types of QEMU acceleration possible */
|
||||
enum qemud_vm_virt_type {
|
||||
QEMUD_VIRT_QEMU,
|
||||
QEMUD_VIRT_KQEMU,
|
||||
QEMUD_VIRT_KVM,
|
||||
};
|
||||
|
||||
|
||||
/* Two types of disk backends */
|
||||
enum qemud_vm_disk_type {
|
||||
QEMUD_DISK_BLOCK,
|
||||
QEMUD_DISK_FILE
|
||||
};
|
||||
|
||||
/* Three types of disk frontend */
|
||||
enum qemud_vm_disk_device {
|
||||
QEMUD_DISK_DISK,
|
||||
QEMUD_DISK_CDROM,
|
||||
QEMUD_DISK_FLOPPY,
|
||||
};
|
||||
|
||||
/* Stores the virtual disk configuration */
|
||||
struct qemud_vm_disk_def {
|
||||
int type;
|
||||
int device;
|
||||
char src[PATH_MAX];
|
||||
char dst[NAME_MAX];
|
||||
int readonly;
|
||||
|
||||
struct qemud_vm_disk_def *next;
|
||||
};
|
||||
|
||||
#define QEMUD_MAC_ADDRESS_LEN 6
|
||||
#define QEMUD_OS_TYPE_MAX_LEN 10
|
||||
#define QEMUD_OS_ARCH_MAX_LEN 10
|
||||
#define QEMUD_OS_MACHINE_MAX_LEN 10
|
||||
|
||||
/* 5 different types of networking config */
|
||||
enum qemud_vm_net_type {
|
||||
QEMUD_NET_USER,
|
||||
QEMUD_NET_ETHERNET,
|
||||
QEMUD_NET_SERVER,
|
||||
QEMUD_NET_CLIENT,
|
||||
QEMUD_NET_MCAST,
|
||||
QEMUD_NET_NETWORK,
|
||||
QEMUD_NET_BRIDGE,
|
||||
};
|
||||
|
||||
/* Stores the virtual network interface configuration */
|
||||
struct qemud_vm_net_def {
|
||||
int type;
|
||||
unsigned char mac[QEMUD_MAC_ADDRESS_LEN];
|
||||
union {
|
||||
struct {
|
||||
char ifname[BR_IFNAME_MAXLEN];
|
||||
char script[PATH_MAX];
|
||||
} ethernet;
|
||||
struct {
|
||||
char address[BR_INET_ADDR_MAXLEN];
|
||||
int port;
|
||||
} socket; /* any of NET_CLIENT or NET_SERVER or NET_MCAST */
|
||||
struct {
|
||||
char name[QEMUD_MAX_NAME_LEN];
|
||||
char ifname[BR_IFNAME_MAXLEN];
|
||||
} network;
|
||||
struct {
|
||||
char brname[BR_IFNAME_MAXLEN];
|
||||
char ifname[BR_IFNAME_MAXLEN];
|
||||
} bridge;
|
||||
} dst;
|
||||
|
||||
struct qemud_vm_net_def *next;
|
||||
};
|
||||
|
||||
#define QEMUD_MAX_BOOT_DEVS 4
|
||||
|
||||
/* 3 possible boot devices */
|
||||
enum qemud_vm_boot_order {
|
||||
QEMUD_BOOT_FLOPPY,
|
||||
QEMUD_BOOT_CDROM,
|
||||
QEMUD_BOOT_DISK,
|
||||
QEMUD_BOOT_NET,
|
||||
};
|
||||
/* 3 possible graphics console modes */
|
||||
enum qemud_vm_grapics_type {
|
||||
QEMUD_GRAPHICS_NONE,
|
||||
QEMUD_GRAPHICS_SDL,
|
||||
QEMUD_GRAPHICS_VNC,
|
||||
};
|
||||
|
||||
/* Internal flags to keep track of qemu command line capabilities */
|
||||
enum qemud_cmd_flags {
|
||||
QEMUD_CMD_FLAG_KQEMU = 1,
|
||||
QEMUD_CMD_FLAG_VNC_COLON = 2,
|
||||
QEMUD_CMD_FLAG_NO_REBOOT = 4,
|
||||
};
|
||||
|
||||
|
||||
enum qemud_vm_features {
|
||||
QEMUD_FEATURE_ACPI = 1,
|
||||
};
|
||||
|
||||
/* Operating system configuration data & machine / arch */
|
||||
struct qemud_vm_os_def {
|
||||
char type[QEMUD_OS_TYPE_MAX_LEN];
|
||||
char arch[QEMUD_OS_ARCH_MAX_LEN];
|
||||
char machine[QEMUD_OS_MACHINE_MAX_LEN];
|
||||
int nBootDevs;
|
||||
int bootDevs[QEMUD_MAX_BOOT_DEVS];
|
||||
char kernel[PATH_MAX];
|
||||
char initrd[PATH_MAX];
|
||||
char cmdline[PATH_MAX];
|
||||
char binary[PATH_MAX];
|
||||
};
|
||||
|
||||
/* Guest VM main configuration */
|
||||
struct qemud_vm_def {
|
||||
int virtType;
|
||||
unsigned char uuid[QEMUD_UUID_RAW_LEN];
|
||||
char name[QEMUD_MAX_NAME_LEN];
|
||||
|
||||
int memory;
|
||||
int maxmem;
|
||||
int vcpus;
|
||||
|
||||
int noReboot;
|
||||
|
||||
struct qemud_vm_os_def os;
|
||||
|
||||
int features;
|
||||
int graphicsType;
|
||||
int vncPort;
|
||||
int vncActivePort;
|
||||
|
||||
int ndisks;
|
||||
struct qemud_vm_disk_def *disks;
|
||||
|
||||
int nnets;
|
||||
struct qemud_vm_net_def *nets;
|
||||
};
|
||||
|
||||
/* Guest VM runtime state */
|
||||
struct qemud_vm {
|
||||
int stdout;
|
||||
int stderr;
|
||||
int monitor;
|
||||
int logfile;
|
||||
int pid;
|
||||
int id;
|
||||
int state;
|
||||
|
||||
int *tapfds;
|
||||
int ntapfds;
|
||||
|
||||
char configFile[PATH_MAX];
|
||||
char autostartLink[PATH_MAX];
|
||||
|
||||
struct qemud_vm_def *def; /* The current definition */
|
||||
struct qemud_vm_def *newDef; /* New definition to activate at shutdown */
|
||||
|
||||
unsigned int autostart : 1;
|
||||
|
||||
struct qemud_vm *next;
|
||||
};
|
||||
|
||||
/* Store start and end addresses of a dhcp range */
|
||||
struct qemud_dhcp_range_def {
|
||||
char start[BR_INET_ADDR_MAXLEN];
|
||||
char end[BR_INET_ADDR_MAXLEN];
|
||||
|
||||
struct qemud_dhcp_range_def *next;
|
||||
};
|
||||
|
||||
/* Virtual Network main configuration */
|
||||
struct qemud_network_def {
|
||||
unsigned char uuid[QEMUD_UUID_RAW_LEN];
|
||||
char name[QEMUD_MAX_NAME_LEN];
|
||||
|
||||
char bridge[BR_IFNAME_MAXLEN];
|
||||
int disableSTP;
|
||||
int forwardDelay;
|
||||
|
||||
int forward;
|
||||
char forwardDev[BR_IFNAME_MAXLEN];
|
||||
|
||||
char ipAddress[BR_INET_ADDR_MAXLEN];
|
||||
char netmask[BR_INET_ADDR_MAXLEN];
|
||||
char network[BR_INET_ADDR_MAXLEN+BR_INET_ADDR_MAXLEN+1];
|
||||
|
||||
int nranges;
|
||||
struct qemud_dhcp_range_def *ranges;
|
||||
};
|
||||
|
||||
/* Virtual Network runtime state */
|
||||
struct qemud_network {
|
||||
char configFile[PATH_MAX];
|
||||
char autostartLink[PATH_MAX];
|
||||
|
||||
struct qemud_network_def *def; /* The current definition */
|
||||
struct qemud_network_def *newDef; /* New definition to activate at shutdown */
|
||||
|
||||
char bridge[BR_IFNAME_MAXLEN];
|
||||
int dnsmasqPid;
|
||||
|
||||
unsigned int active : 1;
|
||||
unsigned int autostart : 1;
|
||||
|
||||
struct qemud_network *next;
|
||||
};
|
||||
|
||||
|
||||
enum qemud_mode {
|
||||
QEMUD_MODE_RX_HEADER,
|
||||
@ -333,24 +123,9 @@ struct qemud_socket {
|
||||
struct qemud_server {
|
||||
int nsockets;
|
||||
struct qemud_socket *sockets;
|
||||
int qemuVersion;
|
||||
int qemuCmdFlags; /* values from enum qemud_cmd_flags */
|
||||
int nclients;
|
||||
struct qemud_client *clients;
|
||||
int sigread;
|
||||
int nactivevms;
|
||||
int ninactivevms;
|
||||
struct qemud_vm *vms;
|
||||
int nextvmid;
|
||||
int nactivenetworks;
|
||||
int ninactivenetworks;
|
||||
struct qemud_network *networks;
|
||||
brControl *brctl;
|
||||
iptablesContext *iptables;
|
||||
char *configDir;
|
||||
char *autostartDir;
|
||||
char *networkConfigDir;
|
||||
char *networkAutostartDir;
|
||||
char logDir[PATH_MAX];
|
||||
unsigned int shutdown : 1;
|
||||
};
|
||||
@ -367,17 +142,6 @@ void qemudLog(int priority, const char *fmt, ...)
|
||||
void remoteDispatchClientRequest (struct qemud_server *server,
|
||||
struct qemud_client *client);
|
||||
|
||||
static inline int
|
||||
qemudIsActiveVM(struct qemud_vm *vm)
|
||||
{
|
||||
return vm->id != -1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
qemudIsActiveNetwork(struct qemud_network *network)
|
||||
{
|
||||
return network->active;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -207,7 +207,7 @@ static void qemudDispatchSignalEvent(int fd ATTRIBUTE_UNUSED,
|
||||
case SIGHUP:
|
||||
qemudLog(QEMUD_INFO, "Reloading configuration on SIGHUP");
|
||||
if (!remote) {
|
||||
qemudReload(server);
|
||||
qemudReload();
|
||||
}
|
||||
break;
|
||||
|
||||
@ -217,7 +217,7 @@ static void qemudDispatchSignalEvent(int fd ATTRIBUTE_UNUSED,
|
||||
qemudLog(QEMUD_WARN, "Shutting down on signal %d", sigc);
|
||||
|
||||
if (!remote) {
|
||||
qemudShutdown(server);
|
||||
qemudShutdown();
|
||||
}
|
||||
|
||||
server->shutdown = 1;
|
||||
@ -620,11 +620,6 @@ static int qemudInitPaths(struct qemud_server *server,
|
||||
|
||||
unlink(roSockname);
|
||||
|
||||
server->configDir =
|
||||
server->autostartDir =
|
||||
server->networkConfigDir =
|
||||
server->networkAutostartDir = NULL;
|
||||
|
||||
if (snprintf(server->logDir, PATH_MAX, "%s/log/libvirt/qemu", LOCAL_STATE_DIR) >= PATH_MAX)
|
||||
goto snprintf_error;
|
||||
} else {
|
||||
@ -660,30 +655,15 @@ static int qemudInitPaths(struct qemud_server *server,
|
||||
if (snprintf(sockname, maxlen, "@%s/.libvirt/qemud-sock", pw->pw_dir) >= maxlen)
|
||||
goto snprintf_error;
|
||||
|
||||
if (snprintf(server->logDir, PATH_MAX, "%s/.libvirt/qemu/log", pw->pw_dir) >= PATH_MAX)
|
||||
goto snprintf_error;
|
||||
|
||||
if (asprintf (&base, "%s/.libvirt/qemu", pw->pw_dir) == -1) {
|
||||
qemudLog (QEMUD_ERR, "out of memory in asprintf");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Configuration paths are either ~/.libvirt/qemu/... (session) or
|
||||
* /etc/libvirt/qemu/... (system).
|
||||
*/
|
||||
if (asprintf (&server->configDir, "%s", base) == -1)
|
||||
goto out_of_memory;
|
||||
|
||||
if (asprintf (&server->autostartDir, "%s/autostart", base) == -1)
|
||||
goto out_of_memory;
|
||||
|
||||
if (asprintf (&server->networkConfigDir, "%s/networks", base) == -1)
|
||||
goto out_of_memory;
|
||||
|
||||
if (asprintf (&server->networkAutostartDir, "%s/networks/autostart",
|
||||
base) == -1)
|
||||
goto out_of_memory;
|
||||
|
||||
if (snprintf(server->logDir, PATH_MAX, "%s/log", base) >= PATH_MAX)
|
||||
goto snprintf_error;
|
||||
} /* !remote */
|
||||
|
||||
if (base) free (base);
|
||||
@ -711,7 +691,6 @@ static struct qemud_server *qemudInitialize(int sigread) {
|
||||
}
|
||||
|
||||
/* We don't have a dom-0, so start from 1 */
|
||||
server->nextvmid = 1;
|
||||
server->sigread = sigread;
|
||||
|
||||
roSockname[0] = '\0';
|
||||
@ -726,7 +705,7 @@ static struct qemud_server *qemudInitialize(int sigread) {
|
||||
goto cleanup;
|
||||
|
||||
if (!remote) /* qemud only */ {
|
||||
if (qemudStartup(server) < 0) {
|
||||
if (qemudStartup() < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
} else /* remote only */ {
|
||||
@ -745,6 +724,7 @@ static struct qemud_server *qemudInitialize(int sigread) {
|
||||
return server;
|
||||
|
||||
cleanup:
|
||||
qemudShutdown();
|
||||
if (server) {
|
||||
struct qemud_socket *sock = server->sockets;
|
||||
while (sock) {
|
||||
@ -752,11 +732,6 @@ static struct qemud_server *qemudInitialize(int sigread) {
|
||||
sock = sock->next;
|
||||
}
|
||||
|
||||
if (server->configDir) free (server->configDir);
|
||||
if (server->autostartDir) free (server->autostartDir);
|
||||
if (server->networkConfigDir) free (server->networkConfigDir);
|
||||
if (server->networkAutostartDir) free (server->networkAutostartDir);
|
||||
|
||||
free(server);
|
||||
}
|
||||
return NULL;
|
||||
@ -1525,15 +1500,8 @@ static void qemudCleanup(struct qemud_server *server) {
|
||||
sock = next;
|
||||
}
|
||||
|
||||
if (server->brctl)
|
||||
brShutdown(server->brctl);
|
||||
if (server->iptables)
|
||||
iptablesContextFree(server->iptables);
|
||||
|
||||
if (server->configDir) free (server->configDir);
|
||||
if (server->autostartDir) free (server->autostartDir);
|
||||
if (server->networkConfigDir) free (server->networkConfigDir);
|
||||
if (server->networkAutostartDir) free (server->networkAutostartDir);
|
||||
qemudShutdown();
|
||||
|
||||
free(server);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user