Mercurial > illumos > illumos-gate
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);