char *format;
char *iface;
char *name;
+ char *abs_path = NULL;
int use_cache_off;
if (strchr (filename, ',') != NULL) {
}
}
+ abs_path = realpath (filename, NULL);
struct drive **i = &(g->drives);
- while (*i != NULL) i = &((*i)->next);
+ while (*i != NULL) {
+ if (STREQ((*i)->path, abs_path)) {
+ error (g, _("drive %s can't be added twice"), abs_path);
+ goto err_out;
+ }
+ i = &((*i)->next);
+ }
*i = safe_malloc (g, sizeof (struct drive));
(*i)->next = NULL;
- (*i)->path = safe_strdup (g, filename);
+ (*i)->path = safe_strdup (g, abs_path);
(*i)->readonly = readonly;
(*i)->format = format;
(*i)->iface = iface;
(*i)->name = name;
(*i)->use_cache_off = use_cache_off;
+ free (abs_path);
return 0;
err_out:
free (format);
free (iface);
free (name);
+ free (abs_path);
return -1;
}
{
guestfs_h *g;
int r;
+ FILE *fp;
+
+ fp = fopen ("test1.img", "w");
+ if (fp == NULL) {
+ perror ("test1.img");
+ exit (EXIT_FAILURE);
+ }
+ fclose (fp);
+
+ fp = fopen ("test2.img", "w");
+ if (fp == NULL) {
+ perror ("test2.img");
+ exit (EXIT_FAILURE);
+ }
+ fclose (fp);
+
+ fp = fopen ("test3.img", "w");
+ if (fp == NULL) {
+ perror ("test3.img");
+ exit (EXIT_FAILURE);
+ }
+ fclose (fp);
g = guestfs_create ();
if (g == NULL) {
exit (EXIT_FAILURE);
}
- r = guestfs_add_drive_opts (g, "/dev/null", -1);
+ r = guestfs_add_drive_opts (g, "test1.img", -1);
if (r == -1)
exit (EXIT_FAILURE);
- r = guestfs_add_drive_opts (g, "/dev/null",
+ r = guestfs_add_drive_opts (g, "test2.img",
GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
-1);
if (r == -1)
exit (EXIT_FAILURE);
- r = guestfs_add_drive_opts (g, "/dev/null",
+ r = guestfs_add_drive_opts (g, "test3.img",
GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
-1);
guestfs_close (g);
+ unlink ("test1.img");
+ unlink ("test2.img");
+ unlink ("test3.img");
+
exit (EXIT_SUCCESS);
}