
On Fri, Jan 05, 2007 at 09:16:54PM +0000, Daniel P. Berrange wrote:
+static int qemudParseUUID(const char *uuid, + unsigned char *rawuuid) { + const char *cur; + int i; + + /* + * do a liberal scan allowing '-' and ' ' anywhere between character + * pairs as long as there is 32 of them in the end. + */ + cur = uuid; + for (i = 0;i < 16;) { + rawuuid[i] = 0; + if (*cur == 0) + goto error; + if ((*cur == '-') || (*cur == ' ')) { + cur++; + continue; + } + if ((*cur >= '0') && (*cur <= '9'))
isdigit() ? :-)
+/* Return the default machine type for a given architecture */ +static const char *qemudDefaultMachineForArch(const char *arch) { + int i; + + for (i = 0 ; i < (int)(sizeof(archs) / sizeof(struct qemu_arch_info)) ; i++) {
#define NR_ITEMS(x) (int)(sizeof(x)/ sizeof(*x))
+/* + * Parses a libvirt XML definition of a guest, and populates the + * the qemud_vm struct with matching data about the guests config + */ +static int qemudParseXML(struct qemud_server *server, + xmlDocPtr xml, + struct qemud_vm *vm) { + xmlNodePtr root = NULL; + xmlChar *prop = NULL; + xmlXPathContextPtr ctxt = NULL; + xmlXPathObjectPtr obj = NULL; + char *conv = NULL; + + /* Prepare parser / xpath context */ + root = xmlDocGetRootElement(xml); + if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "domain"))) { + qemudReportError(server, VIR_ERR_INTERNAL_ERROR, "%s", "incorrect root element"); + goto error; + } + + ctxt = xmlXPathNewContext(xml); + if (ctxt == NULL) { + qemudReportError(server, VIR_ERR_NO_MEMORY, "xmlXPathContext"); + goto error; + } + + + /* Find out what type of QEMU virtualization to use */ + if (!(prop = xmlGetProp(root, BAD_CAST "type"))) { + qemudReportError(server, VIR_ERR_INTERNAL_ERROR, "%s", "missing domain type attribute"); + goto error; + }
....
+ + error: + /* XXX free all the stuff in the qemud_vm struct, or leave it upto + the caller ? */ + if (prop) + free(prop); + if (obj) + xmlXPathFreeObject(obj);
if (ctxt) xmlXPathFreeContext(ctxt);
+ return -1; +} + +/* + * Constructs a argv suitable for launching qemu with config defined + * for a given virtual machine. + */ +int qemudBuildCommandLine(struct qemud_server *server, + struct qemud_vm *vm, + char ***argv, + int *argc) { + int n = -1; + char memory[50]; + char vcpus[50]; + struct qemud_vm_disk_def *disk = vm->def.disks; + struct qemud_vm_net_def *net = vm->def.nets; + + *argc = 1 + /* qemu */ + 2 + /* machine type */ + (vm->def.virtType == QEMUD_VIRT_QEMU ? 1 : 0) + /* Disable kqemu */ + 2 * vm->def.ndisks + /* disks*/ + (vm->def.nnets > 0 ? (4 * vm->def.nnets) : 2) + /* networks */ + 2 + /* memory*/ + 2 + /* cpus */ + (vm->def.graphicsType == QEMUD_GRAPHICS_VNC ? 2 : + (vm->def.graphicsType == QEMUD_GRAPHICS_SDL ? 0 : 1)); /* graphics */ + + sprintf(memory, "%d", vm->def.memory/1024);
vm->def.memory >> 10 (professional deformation from BaseOS packages... :-)
+ sprintf(vcpus, "%d", vm->def.vcpus); + + if (!(*argv = malloc(sizeof(char *) * (*argc +1)))) + goto no_memory; + if (!((*argv)[++n] = strdup(vm->def.os.binary))) + goto no_memory; + if (!((*argv)[++n] = strdup("-M"))) + goto no_memory;
Hmm... you reallocate static strings. I think you don't have to care about argv[] if you create it after fork() in a child process. It seems odd allocate and dealocate it in a parent if you need't it the parent process.
+/* Scan for all guest config files */ +int qemudScanConfigs(struct qemud_server *server) { + DIR *dir; + struct dirent *entry; + + if (!(dir = opendir(server->configDir))) { + if (errno == ENOENT) + return 0; + return -1; + } + + while ((entry = readdir(dir))) { + char file[PATH_MAX]; + if (entry->d_name[0] == '.') + continue;
is ".myconfig" forbidden filename? Otherwise: if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
+/* Simple grow-on-demand string buffer */
Hmm... It seems like duplicate code to virBufferAdd() (xml.c)
+/* XXX re-factor to shared library */ +struct qemudBuffer { + char *data; + int len; + int used; +}; + +static +int qemudBufferAdd(struct qemudBuffer *buf, const char *str) { + int need = strlen(str);
It's huge patch. Now (at 2:00 AM) I'm too tired... night! ;-) Karel -- Karel Zak <kzak@redhat.com>