summaryrefslogtreecommitdiffstats
path: root/usr.bin/login
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2001-10-25 20:45:47 +0000
committerrwatson <rwatson@FreeBSD.org>2001-10-25 20:45:47 +0000
commitd319d0a53b4227911f8e7c9711955281e80a5281 (patch)
treea35c0517abf55e70bc28349241a799a766c6de92 /usr.bin/login
parent0857f7bbf90575b592c7770dcef6db0c7d9fc87c (diff)
downloadFreeBSD-src-d319d0a53b4227911f8e7c9711955281e80a5281.zip
FreeBSD-src-d319d0a53b4227911f8e7c9711955281e80a5281.tar.gz
o Modify format of /etc/fbtab to accept glob matching patterns for
target devices, not just individual devices and directories. This permits activities such as: ttyv0 0600 /dev/dsp* Whereas previously that was not supported. This change is backwards-compatible, except where device names included globbing characters, which is not the case for any devices listed in MAKEDEV. Submitted by: Maxime Henrion <mux@qualys.com> MFC after: 3 weeks
Diffstat (limited to 'usr.bin/login')
-rw-r--r--usr.bin/login/login_fbtab.c58
1 files changed, 23 insertions, 35 deletions
diff --git a/usr.bin/login/login_fbtab.c b/usr.bin/login/login_fbtab.c
index e0b99e3..c3ca5ec 100644
--- a/usr.bin/login/login_fbtab.c
+++ b/usr.bin/login/login_fbtab.c
@@ -65,7 +65,7 @@
#include <syslog.h>
#include <string.h>
#include <errno.h>
-#include <dirent.h>
+#include <glob.h>
#include <paths.h>
#include <unistd.h>
#include "pathnames.h"
@@ -121,40 +121,28 @@ gid_t gid;
/* login_protect - protect one device entry */
void
-login_protect(table, path, mask, uid, gid)
-char *table;
-char *path;
-int mask;
-uid_t uid;
-gid_t gid;
+login_protect(table, pattern, mask, uid, gid)
+ char *table;
+ char *pattern;
+ int mask;
+ uid_t uid;
+ gid_t gid;
{
- char buf[BUFSIZ];
- int pathlen = strlen(path);
- struct dirent *ent;
- DIR *dir;
-
- if (strcmp("/*", path + pathlen - 2) != 0) {
- /* clear flags of the device */
- if (chflags(path, 0) && errno != ENOENT && errno != EOPNOTSUPP)
- syslog(LOG_ERR, "%s: chflags(%s): %m", table, path);
- if (chmod(path, mask) && errno != ENOENT)
- syslog(LOG_ERR, "%s: chmod(%s): %m", table, path);
- if (chown(path, uid, gid) && errno != ENOENT)
- syslog(LOG_ERR, "%s: chown(%s): %m", table, path);
- } else {
- strcpy(buf, path);
- buf[pathlen - 1] = 0;
- if ((dir = opendir(buf)) == 0) {
- syslog(LOG_ERR, "%s: opendir(%s): %m", table, path);
- } else {
- while ((ent = readdir(dir)) != 0) {
- if (strcmp(ent->d_name, ".") != 0
- && strcmp(ent->d_name, "..") != 0) {
- strcpy(buf + pathlen - 1, ent->d_name);
- login_protect(table, buf, mask, uid, gid);
- }
- }
- closedir(dir);
+ glob_t gl;
+ char *path;
+ int i;
+
+ if (glob(pattern, GLOB_NOSORT, NULL, &gl) != 0)
+ return;
+ for (i = 0; i < gl.gl_pathc; i++) {
+ path = gl.gl_pathv[i];
+ /* clear flags of the device */
+ if (chflags(path, 0) && errno != ENOENT && errno != EOPNOTSUPP)
+ syslog(LOG_ERR, "%s: chflags(%s): %m", table, path);
+ if (chmod(path, mask) && errno != ENOENT)
+ syslog(LOG_ERR, "%s: chmod(%s): %m", table, path);
+ if (chown(path, uid, gid) && errno != ENOENT)
+ syslog(LOG_ERR, "%s: chown(%s): %m", table, path);
}
- }
+ globfree(&gl);
}
OpenPOWER on IntegriCloud