Date: Mon, 22 Oct 2001 01:33:38 +0200 (CEST) From: Maxime Henrion <mux@qualys.com> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/31419: [PATCH] Allow device name patterns in fbtab(5) Message-ID: <200110212333.f9LNXcH23043@noos.fr>
next in thread | raw e-mail | index | archive | help
>Number: 31419 >Category: bin >Synopsis: [PATCH] Allow device name patterns in fbtab(5) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sun Oct 21 16:40:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Maxime Henrion >Release: FreeBSD 5.0-CURRENT i386 >Organization: None. >Environment: System: FreeBSD nebula.cybercable.fr 5.0-CURRENT FreeBSD 5.0-CURRENT #132: Sun Oct 21 13:42:49 CEST 2001 root@nebula.cybercable.fr:/usr/src/sys/i386/compile/NEBULA i386 >Description: The handling of the fbtab(5) file in login(1) only allows to put complete device pathnames or pathnames ending with "/*" in which case it will apply the changes to all files in the directory. This patch rewrites the login_protect() routine to use glob(3) so that it's possible to put real device name patterns. This is very useful for all the /dev/dsp* and /dev/audio* devices. >How-To-Repeat: Try to put /dev/dsp* in the list of device names in /etc/fbtab :) >Fix: --- fbtab.patch begins here --- Index: fbtab.5 =================================================================== RCS file: /home/ncvs/src/share/man/man5/fbtab.5,v retrieving revision 1.10 diff -u -r1.10 fbtab.5 --- fbtab.5 14 Jul 2001 19:41:09 -0000 1.10 +++ fbtab.5 21 Oct 2001 23:15:43 -0000 @@ -19,10 +19,8 @@ All other lines consist of three fields delimited by whitespace: a login device (/dev/ttyv0), an octal permission number (0600), and a ":"-delimited list of -devices (/dev/console). All device names are -absolute paths. -A path that ends in "/*" refers to all -directory entries except "." and "..". +device patterns (/dev/console, /dev/dsp*). +All device patterns are absolute paths. .Pp If the tty argument (relative path) matches a login device name (absolute path), the permissions of the devices in the Index: login_fbtab.c =================================================================== RCS file: /home/ncvs/src/usr.bin/login/login_fbtab.c,v retrieving revision 1.9 diff -u -r1.9 login_fbtab.c --- login_fbtab.c 9 Dec 2000 09:35:41 -0000 1.9 +++ login_fbtab.c 21 Oct 2001 23:04:24 -0000 @@ -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 @@ /* 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); } --- fbtab.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200110212333.f9LNXcH23043>