permsfile.c revision 73569
1210284Sjmallett/* permsfile.c: implement SunOS /etc/fbtab and Solaris /etc/logindevperm
2232812Sjmallett   functionality to set device permissions on login
3215990Sjmallett
4210284Sjmallett%%% portions-copyright-cmetz-96
5210284SjmallettPortions of this software are Copyright 1996-1998 by Craig Metz, All Rights
6215990SjmallettReserved. The Inner Net License Version 2 applies to these portions of
7215990Sjmallettthe software.
8215990SjmallettYou should have received a copy of the license with this software. If
9210284Sjmallettyou didn't get a copy, you may request one from <license@inner.net>.
10215990Sjmallett
11215990SjmallettPortions of this software are Copyright 1995 by Randall Atkinson and Dan
12210284SjmallettMcDonald, All Rights Reserved. All Rights under this copyright are assigned
13215990Sjmallettto the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
14215990SjmallettLicense Agreement applies to this software.
15215990Sjmallett
16215990Sjmallett	History:
17215990Sjmallett
18232812Sjmallett	Modified by cmetz for OPIE 2.31. Include unistd.h.
19215990Sjmallett	Modified by cmetz for OPIE 2.3. Check for NULL return from
20215990Sjmallett	    ftpglob(), combine some expressions, fix a typo. Made file
21215990Sjmallett	    selection a bit more generic.
22215990Sjmallett	Modified by cmetz for OPIE 2.2. Use FUNCTION declaration et al.
23215990Sjmallett            Add opie.h. Ifdef around a header.
24215990Sjmallett	Written at NRL for OPIE 2.0.
25215990Sjmallett*/
26215990Sjmallett
27215990Sjmallett#include "opie_cfg.h"
28215990Sjmallett#ifdef HAVE_LOGIN_PERMFILE
29232812Sjmallett#include <stdio.h>
30215990Sjmallett#include <sys/types.h>
31215990Sjmallett#if HAVE_STRING_H
32215990Sjmallett#include <string.h>
33215990Sjmallett#endif /* HAVE_STRING_H */
34215990Sjmallett#if HAVE_UNISTD_H
35215990Sjmallett#include <unistd.h>
36215990Sjmallett#endif /* HAVE_UNISTD_H */
37215990Sjmallett#include <syslog.h>
38210284Sjmallett#include "opie.h"
39210284Sjmallett
40210284Sjmallett/* Line buffer size (one more than max line length) */
41210284Sjmallett#define BUFSIZE 128
42210284Sjmallett/* Maximum number of list items in a field */
43210284Sjmallett#define LISTSIZE 10
44210284Sjmallett
45215990Sjmallettstatic char buf[BUFSIZE], buf2[8];
46210284Sjmallett
47210284Sjmallettchar **ftpglob __P((char *));
48210284Sjmallett
49210284SjmallettVOIDRET opiefatal FUNCTION((x), char *x)
50210284Sjmallett{
51232812Sjmallett  fprintf(stderr, "%s", x);
52210284Sjmallett  exit(1);
53210284Sjmallett}
54210284Sjmallett
55210284Sjmallett#include "glob.c"
56210284Sjmallett
57210284Sjmallettstatic int getalist FUNCTION((string, list), char **string AND char **list)
58210284Sjmallett{
59232816Sjmallett  char *s = *string;
60215990Sjmallett  int i = 0;
61232816Sjmallett
62210284Sjmallett  while (*s && (*s != '\n') && (*s != ' ') && (*s != '\t'))
63210284Sjmallett    if ((*s == ':') || (*s == ',')) {
64215990Sjmallett      *(s++) = 0;
65215990Sjmallett      list[i++] = *string;
66215990Sjmallett      *string = s;
67215990Sjmallett      if (i == LISTSIZE)
68215990Sjmallett	return i;
69215990Sjmallett    } else
70215990Sjmallett      s++;
71215990Sjmallett
72215990Sjmallett  if ((int) (s) - (int) (*string)) {
73215990Sjmallett    *s = 0;
74210284Sjmallett    list[i++] = *string;
75210284Sjmallett  }
76210284Sjmallett  *string = ++s;
77210284Sjmallett
78210284Sjmallett  return i;
79210284Sjmallett}
80210284Sjmallett
81210284Sjmallettstatic VOIDRET doaline FUNCTION((line, name, ttyn, uid, gid), char *line AND char *name AND char *ttyn AND uid_t uid AND gid_t gid)
82210284Sjmallett{
83215990Sjmallett  char *ptr;
84215990Sjmallett  int i;
85210284Sjmallett  int applies, llen;
86210284Sjmallett  char *listbuf[LISTSIZE], **globlist;
87210284Sjmallett
88210284Sjmallett  if (ptr = strchr(buf, '#'))
89210284Sjmallett    *ptr = 0;
90210284Sjmallett
91210284Sjmallett  /* Skip whitespace */
92210284Sjmallett  for (ptr = buf; *ptr && ((*ptr == ' ') || (*ptr == '\t'));
93210284Sjmallett       ptr++);
94210284Sjmallett
95210284Sjmallett  if (!*ptr)
96210284Sjmallett    return;
97215990Sjmallett
98210284Sjmallett  /* (Optional) Field 1: user name(s) */
99210284Sjmallett  if ((*ptr != '/') && (*ptr != '~')) {
100210284Sjmallett    llen = getalist(&ptr, listbuf);
101210284Sjmallett    for (applies = i = 0; (i < llen) && !applies; i++)
102210284Sjmallett      if (!strcmp(listbuf[i], name))
103215990Sjmallett	applies++;
104210284Sjmallett    while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
105210284Sjmallett      ptr++;
106210284Sjmallett    if (!applies || !*ptr)
107210284Sjmallett      return;
108210284Sjmallett  }
109210284Sjmallett  /* Field 2: terminal(s) */
110210284Sjmallett  llen = getalist(&ptr, listbuf);
111210284Sjmallett  for (applies = i = 0; (i < llen) && !applies; i++)
112210284Sjmallett    if (!strcmp(listbuf[i], ttyn))
113210284Sjmallett      applies++;
114210284Sjmallett
115210284Sjmallett  while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
116210284Sjmallett    ptr++;
117217214Sjmallett
118210284Sjmallett  if (!applies || !*ptr)
119250428Simp    return;
120250428Simp
121250428Simp  /* Field 3: mode */
122232812Sjmallett  for (applies = 0; *ptr && (*ptr >= '0') && (*ptr <= '7');
123210284Sjmallett       applies = (applies << 3) | (*(ptr++) - '0'));
124232812Sjmallett
125210284Sjmallett  while (*ptr && ((*ptr == ' ') || (*ptr == '\t')))
126210284Sjmallett    ptr++;
127210284Sjmallett
128250428Simp  if (!*ptr)
129210284Sjmallett    return;
130210284Sjmallett
131210284Sjmallett  /* Field 4: devices (the fun part...) */
132210284Sjmallett  llen = getalist(&ptr, listbuf);
133250191Simp  for (i = 0; i < llen; i++) {
134250191Simp    if (globlist = ftpglob(listbuf[i]))
135250191Simp      while (*globlist) {
136250191Simp#ifdef DEBUG
137250191Simp        syslog(LOG_DEBUG, "setting %s to %d/%d %o", *globlist, uid, gid, applies);
138250191Simp#endif /* DEBUG */
139250191Simp        if ((chown(*globlist, uid, gid) < 0) && (errno != ENOENT))
140250191Simp	  perror("chown");
141250191Simp        if ((chmod(*(globlist++), applies) < 0) && (errno != ENOENT))
142250191Simp	  perror("chmod");
143250191Simp    }
144210284Sjmallett  }
145215990Sjmallett}
146210284Sjmallett
147210284SjmallettVOIDRET permsfile FUNCTION((name, ttyn, uid, gid), char *name AND char *ttyn AND uid_t uid AND gid_t gid)
148210284Sjmallett{
149210284Sjmallett  FILE *fh;
150210284Sjmallett
151210284Sjmallett  if (!(fh = fopen(HAVE_LOGIN_PERMFILE, "r"))) {
152210284Sjmallett    syslog(LOG_ERR, "Can't open %s!", HAVE_LOGIN_PERMFILE);
153210284Sjmallett    fprintf(stderr, "Warning: Can't set device permissions.\n");
154210284Sjmallett    return;
155210284Sjmallett  }
156210284Sjmallett  do {
157210284Sjmallett    if (feof(fh))
158210284Sjmallett      return;
159210284Sjmallett    if (fgets(buf, BUFSIZE, fh) == NULL)
160232812Sjmallett      return;
161210284Sjmallett    buf[BUFSIZE] = 0;
162210284Sjmallett
163210284Sjmallett    doaline(buf, name, ttyn, uid, gid);
164210284Sjmallett  }
165210284Sjmallett  while (1);
166210284Sjmallett}
167215990Sjmallett#endif /* HAVE_LOGIN_PERMFILE */
168210284Sjmallett