exit (EXIT_FAILURE);
}
drv->type = drv_N;
+ drv->device = NULL;
+ drv->nr_drives = -1;
if (asprintf (&drv->N.filename, "test%d.img",
next_prepared_drive++) == -1) {
perror ("asprintf");
}
drv->N.data = create_prepared_file (optarg, drv->N.filename);
drv->N.data_free = free_prep_data;
- drv->N.device = NULL; /* filled in by add_drives */
drv->next = drvs;
drvs = drv;
break;
if (drv) {
prepare_drives (drv->next);
if (drv->type == drv_N)
- prepare_drive (drv->N.filename, drv->N.data, drv->N.device);
+ prepare_drive (drv->N.filename, drv->N.data, drv->device);
}
}
if (drv) {
next_drive = add_drives (drv->next, next_drive);
+ if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) {
+ perror ("asprintf");
+ exit (EXIT_FAILURE);
+ }
+
switch (drv->type) {
case drv_a:
ad_optargs.bitmask = 0;
if (r == -1)
exit (EXIT_FAILURE);
+ drv->nr_drives = 1;
next_drive++;
break;
if (r == -1)
exit (EXIT_FAILURE);
+ drv->nr_drives = r;
next_drive += r;
break;
if (r == -1)
exit (EXIT_FAILURE);
- if (asprintf (&drv->N.device, "/dev/sd%c", next_drive) == -1) {
- perror ("asprintf");
- exit (EXIT_FAILURE);
- }
-
+ drv->nr_drives = 1;
next_drive++;
break;
if (!drv) return;
free_drives (drv->next);
+ free (drv->device);
+
switch (drv->type) {
case drv_a: /* a.filename and a.format are optargs, don't free them */ break;
case drv_d: /* d.filename is optarg, don't free it */ break;
case drv_N:
free (drv->N.filename);
- free (drv->N.device);
drv->N.data_free (drv->N.data);
break;
default: ; /* keep GCC happy */
/* List of drives added via -a, -d or -N options. */
struct drv {
struct drv *next;
+
+ char *device; /* Device name inside the appliance (eg. /dev/sda).
+ * This is filled in when we add the drives in
+ * add_drives. Note that guests (-d option) may
+ * have multiple drives, in which case this is the
+ * first drive, and nr_drives is the number of
+ * drives used.
+ */
+ int nr_drives; /* number of drives for this guest */
+
enum { drv_a, drv_d, drv_N } type;
union {
struct {
char *filename; /* disk filename (testX.img) */
void *data; /* prepared type */
void (*data_free)(void*); /* function to free 'data' */
- char *device; /* device inside the appliance */
} N;
};
};
exit (EXIT_FAILURE); \
} \
drv->type = drv_a; \
+ drv->device = NULL; \
+ drv->nr_drives = -1; \
drv->a.filename = optarg; \
drv->a.format = format; \
drv->next = drvs; \
exit (EXIT_FAILURE); \
} \
drv->type = drv_d; \
+ drv->device = NULL; \
+ drv->nr_drives = -1; \
drv->d.guest = optarg; \
drv->next = drvs; \
drvs = drv