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@xxxxxxxxxx>