Skip site navigation (1)Skip section navigation (2)
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>