summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorvikram <none@none>2006-10-11 14:44:45 -0700
committervikram <none@none>2006-10-11 14:44:45 -0700
commita64c0160002ba48c2707ff28ee92ddbfde142ca1 (patch)
tree432727c75e963b4dfb43d35e6ac4d5500859fa38 /usr/src
parent663e0ec42bfb36b8229612d123c040959af7a201 (diff)
downloadillumos-gate-a64c0160002ba48c2707ff28ee92ddbfde142ca1.tar.gz
6479440 di_devlink_init() does not work in miniroot starting with snv_48
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/libdevinfo/devinfo_devlink.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo_devlink.c b/usr/src/lib/libdevinfo/devinfo_devlink.c
index cd259eaee1..33a25b31a5 100644
--- a/usr/src/lib/libdevinfo/devinfo_devlink.c
+++ b/usr/src/lib/libdevinfo/devinfo_devlink.c
@@ -3245,6 +3245,7 @@ dca_init(const char *name, struct dca_off *dcp)
#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 @@ daemon_call(const char *root, struct dca_off *dcp)
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);