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