changeset 2905:e124014129bc

6479440 di_devlink_init() does not work in miniroot starting with snv_48
author vikram
date Wed, 11 Oct 2006 14:44:45 -0700
parents 6c8662f98a22
children 35a42bd3dce9
files usr/src/lib/libdevinfo/devinfo_devlink.c
diffstat 1 files changed, 18 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/libdevinfo/devinfo_devlink.c	Wed Oct 11 10:26:08 2006 -0700
+++ b/usr/src/lib/libdevinfo/devinfo_devlink.c	Wed Oct 11 14:44:45 2006 -0700
@@ -3245,6 +3245,7 @@
 
 
 #define	DAEMON_STARTUP_TIME	1 /* 1 second. This may need to be adjusted */
+#define	DEVNAME_CHECK_FILE	"/etc/devname_check_RDONLY"
 
 static void
 daemon_call(const char *root, struct dca_off *dcp)
@@ -3253,15 +3254,27 @@
 	int		fd, door_error;
 	sigset_t	oset, nset;
 	char		synch_door[PATH_MAX];
-	struct statvfs	svf;
+	struct stat	sb;
 	char		*prefix;
+	int		rofd;
 
 	/*
-	 * If readonly root, assume we are in install
+	 * If /etc/dev missing and readonly root, assume we are in install.
+	 * Don't use statvfs() since it doesn't always report the truth.
 	 */
-	prefix =
-	    (statvfs("/etc/dev", &svf) == 0 && (svf.f_flag & ST_RDONLY)) ?
-		"/tmp" : (char *)root;
+	rofd = -1;
+	if (stat("/etc/dev", &sb) == -1 &&
+	    (rofd = open(DEVNAME_CHECK_FILE,
+	    O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1 && errno == EROFS)
+		prefix = "/tmp";
+	else {
+		if (rofd != -1) {
+			(void) close(rofd);
+			(void) unlink(DEVNAME_CHECK_FILE);
+		}
+		prefix = (char *)root;
+	}
+
 	(void) snprintf(synch_door, sizeof (synch_door),
 	    "%s/etc/dev/%s", prefix, DEVFSADM_SYNCH_DOOR);