Module Name:    src
Committed By:   haad
Date:           Fri Mar 12 16:24:40 UTC 2010

Modified Files:
        src/external/gpl2/lvm2/dist/libdm/ioctl: libdm-nbsd-iface.c

Log Message:
Fix /var/run/dev.db dependency by adding new get_dev_name routine which
converts raw device major:minor number to block device path. By reading
/dev and using stat to find block device major:minor numbers.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
    src/external/gpl2/lvm2/dist/libdm/ioctl/libdm-nbsd-iface.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl2/lvm2/dist/libdm/ioctl/libdm-nbsd-iface.c
diff -u src/external/gpl2/lvm2/dist/libdm/ioctl/libdm-nbsd-iface.c:1.6 src/external/gpl2/lvm2/dist/libdm/ioctl/libdm-nbsd-iface.c:1.7
--- src/external/gpl2/lvm2/dist/libdm/ioctl/libdm-nbsd-iface.c:1.6	Wed Dec  9 00:15:51 2009
+++ src/external/gpl2/lvm2/dist/libdm/ioctl/libdm-nbsd-iface.c	Fri Mar 12 16:24:40 2010
@@ -1,4 +1,4 @@
-/*      $NetBSD: libdm-nbsd-iface.c,v 1.6 2009/12/09 00:15:51 haad Exp $        */
+/*      $NetBSD: libdm-nbsd-iface.c,v 1.7 2010/03/12 16:24:40 haad Exp $        */
 
 /*
  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
@@ -358,6 +358,45 @@
 	return 1;
 }
 
+static char *
+get_dev_name(char *d_name, uint32_t d_major, uint32_t d_minor)
+{
+	static char d_buf[MAXPATHLEN];
+	struct dirent *dire;
+	struct stat st;
+	DIR *dev_dir;
+
+	int err;
+	char *name;
+
+	dev_dir = opendir("/dev");
+
+	while ((dire = readdir(dev_dir)) != NULL) {
+
+		if (strstr(dire->d_name, d_name) == NULL)
+			continue;
+
+		snprintf(d_buf, MAXPATHLEN, "/dev/%s", dire->d_name);
+
+		if ((err = stat(d_buf, &st)) < 0)
+			printf("stat failed with %d", err);
+
+		if (st.st_mode & S_IFBLK){
+			if ((major(st.st_rdev) == d_major) && (minor(st.st_rdev) == d_minor)) {
+				strncpy(d_buf, dire->d_name, strlen(dire->d_name) + 1);
+				name = d_buf;
+				break;
+			}
+		}
+
+		memset(d_buf, '0', sizeof(d_buf));
+	}
+
+	(void)closedir(dev_dir);
+
+	return name;
+}
+
 /*
  * @dev_major is major number of char device
  *
@@ -409,16 +448,17 @@
 	dev = MKDEV(major,dev_minor);
 
 	mode |= S_IFBLK;
-	
-	name = devname(dev,mode);
+
+	if ((name = devname(dev,mode)) == NULL)
+		name = get_dev_name(kd[i].d_name, major, dev_minor);
 
 	r = snprintf(buf, (size_t) bufsize, "/dev/%s",name);
 
 	free(kd);
-	
+
 	if (r < 0 || r > bufsize - 1 || name == NULL)
 		return 0;
-	
+
 	return 1;
 }
 

Reply via email to