[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH] Add cdroms and other non-partition based devices to blkid database (#485060)



---
 loader2/driverdisk.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/loader2/driverdisk.c b/loader2/driverdisk.c
index eca8605..298c896 100644
--- a/loader2/driverdisk.c
+++ b/loader2/driverdisk.c
@@ -23,6 +23,8 @@
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <dirent.h>
 
 #include <blkid/blkid.h>
 
@@ -591,6 +593,8 @@ struct ddlist* findDriverDiskByLabel(void)
     char *ddLabel = "OEMDRV";
     struct ddlist *ddDevice = NULL;
     blkid_cache bCache;
+    struct dirent *direntry;
+    DIR *sysblock;
     
     int res;
     blkid_dev_iterate bIter;
@@ -600,6 +604,26 @@ struct ddlist* findDriverDiskByLabel(void)
 	logMessage(ERROR, _("Cannot initialize cache instance for blkid"));
 	return NULL;
     }
+
+    /* List all block devices from /sys/block and add them to blkid db
+     * libblkid should be doing that, so lets consider this as a workaround */
+    sysblock = opendir("/sys/block");
+    if(sysblock){
+      while((direntry = readdir(sysblock))!=NULL){
+	/* add only h(d?), s(d?), z(fcp) devices */
+	if(direntry->d_name[0]!='h' &&
+	   direntry->d_name[0]!='s' &&
+	   direntry->d_name[0]!='z') continue;
+
+	char *devname = asprintf("/dev/%s", direntry->d_name);
+	if(devname){
+	  blkid_get_dev(bCache, devname, BLKID_DEV_NORMAL);
+	  free(devname);
+	}
+      }
+      closedir(sysblock);
+    }
+
     if((res = blkid_probe_all(bCache))<0){
 	logMessage(ERROR, _("Cannot probe devices in blkid: %d"), res);
 	return NULL;
-- 
1.6.4.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]