summaryrefslogtreecommitdiffstats
path: root/libexec/getty/fbtab_stuff.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/getty/fbtab_stuff.c')
-rw-r--r--libexec/getty/fbtab_stuff.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/libexec/getty/fbtab_stuff.c b/libexec/getty/fbtab_stuff.c
new file mode 100644
index 0000000..2ae5394
--- /dev/null
+++ b/libexec/getty/fbtab_stuff.c
@@ -0,0 +1,93 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <string.h>
+#include <errno.h>
+#include <dirent.h>
+
+#include "pathnames.h"
+
+#define WSPACE " \t\n"
+
+void reset_fbtab __P((char *tty));
+void reset_protect __P((char *table, char *path, int mask));
+
+/*
+ * reset_fbtab - reset ownership to root/wheel and apply protections
+ * specified in /etc/fbtab or logindevperm
+ */
+
+void
+reset_fbtab(tty)
+char *tty;
+{
+ FILE *fp;
+ char buf[BUFSIZ];
+ char *devname;
+ char *cp;
+ int prot;
+ char *table;
+
+ if ((fp = fopen(table = _PATH_FBTAB, "r")) == 0
+ && (fp = fopen(table = _PATH_LOGINDEVPERM, "r")) == 0)
+ return;
+
+ while (fgets(buf, sizeof(buf), fp)) {
+ if (cp = strchr(buf, '#'))
+ *cp = 0; /* strip comment */
+ if ((cp = devname = strtok(buf, WSPACE)) == 0)
+ continue; /* empty or comment */
+ if (strncmp(devname, "/dev/", 5) != 0
+ || (cp = strtok((char *) 0, WSPACE)) == 0
+ || *cp != '0'
+ || sscanf(cp, "%o", &prot) == 0
+ || prot == 0
+ || (prot & 0777) != prot
+ || (cp = strtok((char *) 0, WSPACE)) == 0) {
+ syslog(LOG_ERR, "%s: bad entry: %s", table, cp ? cp : "(null)");
+ continue;
+ }
+ if (strcmp(devname, tty) == 0) {
+ for (cp = strtok(cp, ":"); cp; cp = strtok((char *) 0, ":")) {
+ reset_protect(table, cp, prot);
+ }
+ }
+ }
+ fclose(fp);
+}
+
+/* reset_protect - protect one device entry */
+
+void
+reset_protect(table, path, mask)
+char *table;
+char *path;
+int mask;
+{
+ char buf[BUFSIZ];
+ int pathlen = strlen(path);
+ struct dirent *ent;
+ DIR *dir;
+
+ if (strcmp("/*", path + pathlen - 2) != 0) {
+ if (chmod(path, mask) && errno != ENOENT)
+ syslog(LOG_ERR, "%s: chmod(%s): %m", table, path);
+ if (chown(path, 0, 0) && 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);
+ reset_protect(table, buf, mask);
+ }
+ }
+ closedir(dir);
+ }
+ }
+}
OpenPOWER on IntegriCloud