summaryrefslogtreecommitdiffstats
path: root/contrib/opie/permsfile.c
diff options
context:
space:
mode:
authorpst <pst@FreeBSD.org>1997-02-06 17:52:29 +0000
committerpst <pst@FreeBSD.org>1997-02-06 17:52:29 +0000
commit2dfcbf193123fd16b26454eeffa4bbd014e52c53 (patch)
treeec9d150c9da4390c2d223a04ac002523cbfd7f36 /contrib/opie/permsfile.c
downloadFreeBSD-src-2dfcbf193123fd16b26454eeffa4bbd014e52c53.zip
FreeBSD-src-2dfcbf193123fd16b26454eeffa4bbd014e52c53.tar.gz
Initial import of OPIE v2.3 from
ftp://ftp.nrl.navy.mil/pub/security/opie/
Diffstat (limited to 'contrib/opie/permsfile.c')
-rw-r--r--contrib/opie/permsfile.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/contrib/opie/permsfile.c b/contrib/opie/permsfile.c
new file mode 100644
index 0000000..10b98c5
--- /dev/null
+++ b/contrib/opie/permsfile.c
@@ -0,0 +1,163 @@
+/* permsfile.c: implement SunOS /etc/fbtab and Solaris /etc/logindevperm
+ functionality to set device permissions on login
+
+%%% portions-copyright-cmetz
+Portions of this software are Copyright 1996 by Craig Metz, All Rights
+Reserved. The Inner Net License Version 2 applies to these portions of
+the software.
+You should have received a copy of the license with this software. If
+you didn't get a copy, you may request one from <license@inner.net>.
+
+Portions of this software are Copyright 1995 by Randall Atkinson and Dan
+McDonald, All Rights Reserved. All Rights under this copyright are assigned
+to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
+License Agreement applies to this software.
+
+ History:
+
+ Modified by cmetz for OPIE 2.3. Check for NULL return from
+ ftpglob(), combine some expressions, fix a typo. Made file
+ selection a bit more generic.
+ Modified by cmetz for OPIE 2.2. Use FUNCTION declaration et al.
+ Add opie.h. Ifdef around a header.
+ Written at NRL for OPIE 2.0.
+*/
+
+#include "opie_cfg.h"
+#ifdef HAVE_LOGIN_PERMFILE
+#include <stdio.h>
+#include <sys/types.h>
+#if HAVE_STRING_H
+#include <string.h>
+#endif /* HAVE_STRING_H */
+#include <syslog.h>
+#include "opie.h"
+
+/* Line buffer size (one more than max line length) */
+#define BUFSIZE 128
+/* Maximum number of list items in a field */
+#define LISTSIZE 10
+
+static char buf[BUFSIZE], buf2[8];
+
+char **ftpglob __P((char *));
+
+VOIDRET opiefatal FUNCTION((x), char *x)
+{
+ fprintf(stderr, x);
+ exit(1);
+}
+
+#include "glob.c"
+
+static int getalist FUNCTION((string, list), char **string AND char **list)
+{
+ char *s = *string;
+ int i = 0;
+
+ while (*s && (*s != '\n') && (*s != ' ') && (*s != '\t'))
+ if ((*s == ':') || (*s == ',')) {
+ *(s++) = 0;
+ list[i++] = *string;
+ *string = s;
+ if (i == LISTSIZE)
+ return i;
+ } else
+ s++;
+
+ if ((int) (s) - (int) (*string)) {
+ *s = 0;
+ list[i++] = *string;
+ }
+ *string = ++s;
+
+ return i;
+}
+
+static VOIDRET doaline FUNCTION((line, name, ttyn, uid, gid), char *line AND char *name AND char *ttyn AND uid_t uid AND gid_t gid)
+{
+ char *ptr;
+ int i;
+ int applies, llen;
+ char *listbuf[LISTSIZE], **globlist;
+
+ if (ptr = strchr(buf, '#'))
+ *ptr = 0;
+
+ /* Skip whitespace */
+ for (ptr = buf; *ptr && ((*ptr == ' ') || (*ptr == '\t'));
+ ptr++);
+
+ if (!*ptr)
+ return;
+
+ /* (Optional) Field 1: user name(s) */
+ if ((*ptr != '/') && (*ptr != '~')) {
+ llen = getalist(&ptr, listbuf);
+ for (applies = i = 0; (i < llen) && !applies; i++)
+ if (!strcmp(listbuf[i], name))
+ applies++;
+ while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
+ ptr++;
+ if (!applies || !*ptr)
+ return;
+ }
+ /* Field 2: terminal(s) */
+ llen = getalist(&ptr, listbuf);
+ for (applies = i = 0; (i < llen) && !applies; i++)
+ if (!strcmp(listbuf[i], ttyn))
+ applies++;
+
+ while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
+ ptr++;
+
+ if (!applies || !*ptr)
+ return;
+
+ /* Field 3: mode */
+ for (applies = 0; *ptr && (*ptr >= '0') && (*ptr <= '7');
+ applies = (applies << 3) | (*(ptr++) - '0'));
+
+ while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
+ ptr++;
+
+ if (!*ptr)
+ return;
+
+ /* Field 4: devices (the fun part...) */
+ llen = getalist(&ptr, listbuf);
+ for (i = 0; i < llen; i++) {
+ if (globlist = ftpglob(listbuf[i]))
+ while (*globlist) {
+#ifdef DEBUG
+ syslog(LOG_DEBUG, "setting %s to %d/%d %o", *globlist, uid, gid, applies);
+#endif /* DEBUG */
+ if ((chown(*globlist, uid, gid) < 0) && (errno != ENOENT))
+ perror("chown");
+ if ((chmod(*(globlist++), applies) < 0) && (errno != ENOENT))
+ perror("chmod");
+ }
+ }
+}
+
+VOIDRET permsfile FUNCTION((name, ttyn, uid, gid), char *name AND char *ttyn AND uid_t uid AND gid_t gid)
+{
+ FILE *fh;
+
+ if (!(fh = fopen(HAVE_LOGIN_PERMFILE, "r"))) {
+ syslog(LOG_ERR, "Can't open %s!", HAVE_LOGIN_PERMFILE);
+ fprintf(stderr, "Warning: Can't set device permissions.\n");
+ return;
+ }
+ do {
+ if (feof(fh))
+ return;
+ if (fgets(buf, BUFSIZE, fh) == NULL)
+ return;
+ buf[BUFSIZE] = 0;
+
+ doaline(buf, name, ttyn, uid, gid);
+ }
+ while (1);
+}
+#endif /* HAVE_LOGIN_PERMFILE */
OpenPOWER on IntegriCloud