summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdevinfo/devinfo_devperm.c
diff options
context:
space:
mode:
authorfrits <none@none>2006-01-11 17:58:29 -0800
committerfrits <none@none>2006-01-11 17:58:29 -0800
commitc4ca7dc0818cca322cfe0ed29355568d6deff0b0 (patch)
tree220aef194701ecdb87c2d14577275273566d298e /usr/src/lib/libdevinfo/devinfo_devperm.c
parent8a552b2db9c23aa11e42a38ff4a3a9558e186b8d (diff)
downloadillumos-joyent-c4ca7dc0818cca322cfe0ed29355568d6deff0b0.tar.gz
Contributed by Juergen Keil jk@tools.de
6350389 /etc/logindevperm processing is incomplete when there are stale /dev links 6350499 stale usb device link confuses login's /etc/logindevperm code 6350501 libdevinfo/setdevaccess() prints error message from uninitialized errno variable
Diffstat (limited to 'usr/src/lib/libdevinfo/devinfo_devperm.c')
-rw-r--r--usr/src/lib/libdevinfo/devinfo_devperm.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo_devperm.c b/usr/src/lib/libdevinfo/devinfo_devperm.c
index b89544510a..b4fb3fb217 100644
--- a/usr/src/lib/libdevinfo/devinfo_devperm.c
+++ b/usr/src/lib/libdevinfo/devinfo_devperm.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -89,6 +89,7 @@ setdevaccess(char *dev, uid_t uid, gid_t gid, mode_t mode,
if (errno == ENOENT) /* no such file */
return (0);
err = -1;
+ local_errno = errno;
}
while (fdetach(dev) == 0) {
@@ -375,9 +376,23 @@ dir_dev_acc(char *path, char *left_to_do, uid_t uid, gid_t gid, mode_t mode,
int err = 0;
DIR *dirp;
struct dirent *direntp;
+ char errstring[MAX_LINELEN];
/* path must be a valid name */
if (stat(path, &stat_buf) == -1) {
+ /*
+ * ENOENT errors are expected errors when there are
+ * dangling /dev device links. Ignore them silently
+ */
+ if (errno == ENOENT) {
+ return (0);
+ }
+ if (errmsg) {
+ (void) snprintf(errstring, MAX_LINELEN,
+ "failed to stat %s: %s\n", path,
+ strerror(errno));
+ (*errmsg)(errstring);
+ }
return (-1);
} else {
if (!S_ISDIR(stat_buf.st_mode)) {
@@ -457,7 +472,6 @@ dir_dev_acc(char *path, char *left_to_do, uid_t uid, gid_t gid, mode_t mode,
if (dir_dev_acc(newpath, remainder_path,
uid, gid, mode, line, errmsg)) {
err = -1;
- break;
}
}
}