X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fdevsparts.c;h=1970e7d00f0d1322ccebd2091288e3a2c587c8e5;hp=21854b5c3a532b84ac042589c03ecb8ef3ec20b5;hb=8ae7e1057f43e9b79260cdf191f39d657fdf0293;hpb=5cd39c83e23eb300d1bdfa806902a31b409ff420 diff --git a/daemon/devsparts.c b/daemon/devsparts.c index 21854b5..1970e7d 100644 --- a/daemon/devsparts.c +++ b/daemon/devsparts.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -46,11 +46,24 @@ do_list_devices (void) while ((d = readdir (dir)) != NULL) { if (strncmp (d->d_name, "sd", 2) == 0 || - strncmp (d->d_name, "hd", 2) == 0) { + strncmp (d->d_name, "hd", 2) == 0 || + strncmp (d->d_name, "vd", 2) == 0) { snprintf (buf, sizeof buf, "/dev/%s", d->d_name); + + /* RHBZ#514505: Some versions of qemu <= 0.10 add a + * CD-ROM device even though we didn't request it. Try to + * detect this by seeing if the device contains media. + */ + int fd = open (buf, O_RDONLY); + if (fd == -1) { + perror (buf); + continue; + } + close (fd); + if (add_string (&r, &size, &alloc, buf) == -1) { - closedir (dir); - return NULL; + closedir (dir); + return NULL; } } } @@ -87,7 +100,21 @@ do_list_partitions (void) while ((d = readdir (dir)) != NULL) { if (strncmp (d->d_name, "sd", 2) == 0 || - strncmp (d->d_name, "hd", 2) == 0) { + strncmp (d->d_name, "hd", 2) == 0 || + strncmp (d->d_name, "vd", 2) == 0) { + snprintf (buf, sizeof buf, "/dev/%s", d->d_name); + + /* RHBZ#514505: Some versions of qemu <= 0.10 add a + * CD-ROM device even though we didn't request it. Try to + * detect this by seeing if the device contains media. + */ + int fd = open (buf, O_RDONLY); + if (fd == -1) { + perror (buf); + continue; + } + close (fd); + strncpy (devname, d->d_name, sizeof devname); devname[sizeof devname - 1] = '\0'; @@ -95,26 +122,26 @@ do_list_partitions (void) dir2 = opendir (buf); if (!dir2) { - reply_with_perror ("opendir: %s", buf); - free_stringslen (r, size); - return NULL; + reply_with_perror ("opendir: %s", buf); + free_stringslen (r, size); + return NULL; } while ((d = readdir (dir2)) != NULL) { - if (strncmp (d->d_name, devname, strlen (devname)) == 0) { - snprintf (buf, sizeof buf, "/dev/%s", d->d_name); - - if (add_string (&r, &size, &alloc, buf) == -1) { - closedir (dir2); - closedir (dir); - return NULL; - } - } + if (strncmp (d->d_name, devname, strlen (devname)) == 0) { + snprintf (buf, sizeof buf, "/dev/%s", d->d_name); + + if (add_string (&r, &size, &alloc, buf) == -1) { + closedir (dir2); + closedir (dir); + return NULL; + } + } } if (closedir (dir2) == -1) { - reply_with_perror ("closedir: /sys/block/%s", devname); - free_stringslen (r, size); - return NULL; + reply_with_perror ("closedir: /sys/block/%s", devname); + free_stringslen (r, size); + return NULL; } } } @@ -135,7 +162,7 @@ do_list_partitions (void) } int -do_mkfs (const char *fstype, const char *device) +do_mkfs (char *fstype, char *device) { char *err; int r;