X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fdevsparts.c;h=a198ccd90771646c8dd1e778ac27174bc6d55329;hp=83e4bb9d520f9357e1ed3a2c1c909964428a0024;hb=25c4b0190c22e3bdc5594aff994c8e8f99db5ab3;hpb=887290e949d54c6ac4c9b787231e588f84f2367c diff --git a/daemon/devsparts.c b/daemon/devsparts.c index 83e4bb9..a198ccd 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 @@ -37,6 +37,7 @@ do_list_devices (void) DIR *dir; struct dirent *d; char buf[256]; + int fd; dir = opendir ("/sys/block"); if (!dir) { @@ -46,8 +47,21 @@ 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 device to add a + * CD-ROM device even though we didn't request it. Try to + * detect this by seeing if the device contains media. + */ + 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; @@ -78,6 +92,7 @@ do_list_partitions (void) DIR *dir, *dir2; struct dirent *d; char buf[256], devname[256]; + int fd; dir = opendir ("/sys/block"); if (!dir) { @@ -87,7 +102,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 device to add a + * CD-ROM device even though we didn't request it. Try to + * detect this by seeing if the device contains media. + */ + 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';