MFC: An off-by-one malloc size was corrupting the installer's memory,
[dragonfly.git] / contrib / opie / permsfile.c
blobece04b5590b4504671e56bdd9767d642cfcbfc9a
1 /* permsfile.c: implement SunOS /etc/fbtab and Solaris /etc/logindevperm
2 functionality to set device permissions on login
4 %%% portions-copyright-cmetz-96
5 Portions of this software are Copyright 1996-1999 by Craig Metz, All Rights
6 Reserved. The Inner Net License Version 2 applies to these portions of
7 the software.
8 You should have received a copy of the license with this software. If
9 you didn't get a copy, you may request one from <license@inner.net>.
11 Portions of this software are Copyright 1995 by Randall Atkinson and Dan
12 McDonald, All Rights Reserved. All Rights under this copyright are assigned
13 to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
14 License Agreement applies to this software.
16 History:
18 Modified by cmetz for OPIE 2.31. Include unistd.h.
19 Modified by cmetz for OPIE 2.3. Check for NULL return from
20 ftpglob(), combine some expressions, fix a typo. Made file
21 selection a bit more generic.
22 Modified by cmetz for OPIE 2.2. Use FUNCTION declaration et al.
23 Add opie.h. Ifdef around a header.
24 Written at NRL for OPIE 2.0.
27 #include "opie_cfg.h"
28 #ifdef HAVE_LOGIN_PERMFILE
29 #include <stdio.h>
30 #include <sys/types.h>
31 #if HAVE_STRING_H
32 #include <string.h>
33 #endif /* HAVE_STRING_H */
34 #if HAVE_UNISTD_H
35 #include <unistd.h>
36 #endif /* HAVE_UNISTD_H */
37 #include <syslog.h>
38 #include "opie.h"
40 /* Line buffer size (one more than max line length) */
41 #define BUFSIZE 128
42 /* Maximum number of list items in a field */
43 #define LISTSIZE 10
45 static char buf[BUFSIZE], buf2[8];
47 char **ftpglob __P((char *));
49 VOIDRET opiefatal FUNCTION((x), char *x)
51 fprintf(stderr, x);
52 exit(1);
55 #include "glob.c"
57 static int getalist FUNCTION((string, list), char **string AND char **list)
59 char *s = *string;
60 int i = 0;
62 while (*s && (*s != '\n') && (*s != ' ') && (*s != '\t'))
63 if ((*s == ':') || (*s == ',')) {
64 *(s++) = 0;
65 list[i++] = *string;
66 *string = s;
67 if (i == LISTSIZE)
68 return i;
69 } else
70 s++;
72 if ((int) (s) - (int) (*string)) {
73 *s = 0;
74 list[i++] = *string;
76 *string = ++s;
78 return i;
81 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)
83 char *ptr;
84 int i;
85 int applies, llen;
86 char *listbuf[LISTSIZE], **globlist;
88 if (ptr = strchr(buf, '#'))
89 *ptr = 0;
91 /* Skip whitespace */
92 for (ptr = buf; *ptr && ((*ptr == ' ') || (*ptr == '\t'));
93 ptr++);
95 if (!*ptr)
96 return;
98 /* (Optional) Field 1: user name(s) */
99 if ((*ptr != '/') && (*ptr != '~')) {
100 llen = getalist(&ptr, listbuf);
101 for (applies = i = 0; (i < llen) && !applies; i++)
102 if (!strcmp(listbuf[i], name))
103 applies++;
104 while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
105 ptr++;
106 if (!applies || !*ptr)
107 return;
109 /* Field 2: terminal(s) */
110 llen = getalist(&ptr, listbuf);
111 for (applies = i = 0; (i < llen) && !applies; i++)
112 if (!strcmp(listbuf[i], ttyn))
113 applies++;
115 while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
116 ptr++;
118 if (!applies || !*ptr)
119 return;
121 /* Field 3: mode */
122 for (applies = 0; *ptr && (*ptr >= '0') && (*ptr <= '7');
123 applies = (applies << 3) | (*(ptr++) - '0'));
125 while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
126 ptr++;
128 if (!*ptr)
129 return;
131 /* Field 4: devices (the fun part...) */
132 llen = getalist(&ptr, listbuf);
133 for (i = 0; i < llen; i++) {
134 if (globlist = ftpglob(listbuf[i]))
135 while (*globlist) {
136 #ifdef DEBUG
137 syslog(LOG_DEBUG, "setting %s to %d/%d %o", *globlist, uid, gid, applies);
138 #endif /* DEBUG */
139 if ((chown(*globlist, uid, gid) < 0) && (errno != ENOENT))
140 perror("chown");
141 if ((chmod(*(globlist++), applies) < 0) && (errno != ENOENT))
142 perror("chmod");
147 VOIDRET permsfile FUNCTION((name, ttyn, uid, gid), char *name AND char *ttyn AND uid_t uid AND gid_t gid)
149 FILE *fh;
151 if (!(fh = fopen(HAVE_LOGIN_PERMFILE, "r"))) {
152 syslog(LOG_ERR, "Can't open %s!", HAVE_LOGIN_PERMFILE);
153 fprintf(stderr, "Warning: Can't set device permissions.\n");
154 return;
156 do {
157 if (feof(fh))
158 return;
159 if (fgets(buf, BUFSIZE, fh) == NULL)
160 return;
161 buf[BUFSIZE] = 0;
163 doaline(buf, name, ttyn, uid, gid);
165 while (1);
167 #endif /* HAVE_LOGIN_PERMFILE */