diff options
author | vikram <none@none> | 2006-10-11 14:44:45 -0700 |
---|---|---|
committer | vikram <none@none> | 2006-10-11 14:44:45 -0700 |
commit | a64c0160002ba48c2707ff28ee92ddbfde142ca1 (patch) | |
tree | 432727c75e963b4dfb43d35e6ac4d5500859fa38 /usr/src | |
parent | 663e0ec42bfb36b8229612d123c040959af7a201 (diff) | |
download | illumos-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.c | 23 |
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); |