On 08/08/07, Jorge Lucángeli Obes <[EMAIL PROTECTED]> wrote: > This patch makes QEMU check for command line options stored in qcow2 images. > > Signed-off-by: Laurent Vivier <[EMAIL PROTECTED]> > Signed-off-by: Jorge Lucángeli Obes <[EMAIL PROTECTED]> > --- > diff --git a/qemu/vl.c b/qemu/vl.c > index 4ad39f1..1d28794 100644 > --- a/qemu/vl.c > +++ b/qemu/vl.c > @@ -184,6 +184,11 @@ int time_drift_fix = 0; > const char *cpu_vendor_string; > > /***********************************************************/ > +/* Image annotation support */ > + > +char *img_get_annot(char *filename); > + > +/***********************************************************/ > /* x86 ISA bus support */ > > target_phys_addr_t isa_mem_base = 0; > @@ -6917,6 +6922,13 @@ int main(int argc, char **argv) > char usb_devices[MAX_USB_CMDLINE][128]; > int usb_devices_index; > int fds[2]; > + char *tmpannot; > + char annot[1024]; > + int done = 0; > + unsigned int nbtoks = 0; > + char *tok; > + BlockDriver *drv; > + BlockDriverState *bs; > > saved_argc = argc; > saved_argv = argv; > @@ -7000,6 +7012,58 @@ int main(int argc, char **argv) > nb_nics = 0; > /* default mac address of the first network interface */ > > + bdrv_init(); > + > + drv = bdrv_find_format("qcow2"); > + > + if (argc > 1 && argv[1][0] != '-') { > + bs = bdrv_new(""); > + if (!bs) { > + fprintf(stderr, "Not enough memory"); > + exit(1); > + } > + if (bdrv_open2(bs, argv[1], 0, drv) < 0) { > + fprintf(stderr, "Could not open '%s'", argv[1]); > + bdrv_delete(bs); > + exit(1); > + } > + > + tmpannot = bdrv_get_annot(bs, "commandline_args"); > + if (tmpannot) { > + pstrcpy(annot, 1024, tmpannot);
I thought one of the arguments for storing config options was the commandline length limit, which is 32k or so characters on most systems. > + > + do { > + tok = strtok(nbtoks == 0? tmpannot : NULL, " "); > + > + if (tok != NULL) > + nbtoks++; > + else > + done = 1; > + } while (!done); > + > + free(tmpannot); > + > + if (nbtoks > 0) { > + char **argvprime = malloc((nbtoks + argc) * sizeof(char*)); > + > + for (i = 0; i < argc; i++) > + argvprime[i] = argv[i]; > + > + for (i = 0; i < nbtoks; i++) > + argvprime[i + argc] = strtok(i == 0? annot : NULL, " "); > + > + argv = argvprime; > + argc = argc + nbtoks; > + > + for (i = 0; i < nbtoks + 2; i++) > + printf("argv[%d] = %s\n", i, argv[i]); > + > + } > + } > + > + bdrv_delete(bs); > + } > + > optind = 1; > for(;;) { > if (optind >= argc) > @@ -7558,7 +7622,6 @@ int main(int argc, char **argv) > #endif > > /* we always create the cdrom drive, even if no disk is there */ > - bdrv_init(); > if (cdrom_index >= 0) { > bs_table[cdrom_index] = bdrv_new("cdrom"); > bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM); > @@ -7764,5 +7827,8 @@ int main(int argc, char **argv) > > main_loop(); > quit_timers(); > + > + /* was reassigned above so it needs free()ing */ > + free(argv); > return 0; > } > > Yes, the file format starting with "#! /path/to/qemu" is a much better idea, but the commandline length limitation has to be taken care of separately, perhaps the switches should follow on next lines in the file while the #! line shouldn't specify the switches. Regards, Andrzej (away until mid-September(?))