|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ingres.h> ! 3: # include <aux.h> ! 4: # include <opsys.h> ! 5: # include <sccs.h> ! 6: ! 7: SCCSID(@(#)usersetup.c 8.2 1/18/85) ! 8: ! 9: /* ! 10: ** Initialize Users File From Passwd File ! 11: ** ! 12: ** Everyone in /etc/passwd is entered into the users file. All ! 13: ** users can access all databases. ! 14: ** ! 15: ** User codes are assigned sequentially. This should therefore ! 16: ** probably be run once only, when INGRES is first installed. ! 17: ** Otherwise, usercodes can change mysteriously. ! 18: ** ! 19: ** The optional parameter replaces the root of the INGRES subtree ! 20: ** as found in /etc/passwd. The INGRES user must be installed ! 21: ** (with that name) when usersetup is run. If this parameter ! 22: ** is a minus ("-"), output goes to the standard output. ! 23: ** ! 24: ** The initialization file is initialized to "<home>/.ingres", ! 25: ** where <home> is the home directory in the passwd file. ! 26: */ ! 27: ! 28: main(argc, argv) ! 29: int argc; ! 30: char **argv; ! 31: { ! 32: register int i; ! 33: char buf[MAXLINE + 1]; ! 34: char *pathname; ! 35: register char *code; ! 36: char *field[UF_NFIELDS]; ! 37: register int iop; ! 38: extern char *Proc_name; ! 39: char *stat = "000001"; ! 40: extern int (*ExitFn)(); ! 41: extern int sysexit(); ! 42: ! 43: Proc_name = "USERSETUP"; ! 44: ExitFn = sysexit; ! 45: pathname = NULL; ! 46: if (argc > 1) ! 47: { ! 48: argc--; ! 49: stat = *++argv; ! 50: } ! 51: ! 52: code = "aa"; ! 53: if ((iop = (int) fopen("/etc/passwd", "r")) == NULL) ! 54: syserr(0, "cannot open /etc/passwd for reading"); ! 55: ! 56: /* scan for INGRES in /etc/passwd */ ! 57: while (fgets(buf, MAXLINE, iop)) ! 58: { ! 59: i = decode(buf, field); ! 60: if (!sequal(USERINGRES, field[0])) ! 61: continue; ! 62: pathname = field[i - 1]; ! 63: ! 64: break; ! 65: } ! 66: ! 67: /* test for INGRES entry found */ ! 68: if (!pathname) ! 69: syserr(0, "USERINGRES not installed as UNIX user"); ! 70: ! 71: /* get override pathname */ ! 72: if (argc > 1) ! 73: pathname = argv[1]; ! 74: ! 75: /* rewind passwd file */ ! 76: if (fclose(iop)) ! 77: syserr("fclose"); ! 78: if ((iop = (int) fopen("/etc/passwd", "r")) == NULL) ! 79: syserr("open /etc/passwd 2"); ! 80: ! 81: /* open output file as needed */ ! 82: if (pathname[0] != '-') ! 83: { ! 84: concat(pathname, "/files/users", buf); ! 85: if ((i = open(buf, O_RDONLY)) >= 0) ! 86: syserr(0, "%s already exists", buf); ! 87: if ((i = creat(buf, 0644)) < 0) ! 88: syserr("Cannot create %s", buf); ! 89: close(i); ! 90: if (freopen(buf, "w", stdout) == NULL) ! 91: syserr("cannot open %s", buf); ! 92: } ! 93: ! 94: while (fgets(buf, MAXLINE, iop)) ! 95: { ! 96: i = decode(buf, field); ! 97: /* print username & code */ ! 98: printf("%s:%s:%s:%s:%s:::%s/.ingres::\n", ! 99: field[0], /* user name */ ! 100: code, ! 101: field[2], /* user id */ ! 102: field[3], /* user group */ ! 103: sequal(field[0], USERINGRES) ? "177777" : stat, ! 104: field[i - 1]); /* working directory */ ! 105: next(code); ! 106: } ! 107: fflush(stdout); ! 108: } ! 109: /* ! 110: ** DECODE ! 111: */ ! 112: ! 113: decode(buf, field) ! 114: char *buf; ! 115: char *field[]; ! 116: { ! 117: register char *cp, c; ! 118: register int i; ! 119: ! 120: field[0] = buf; ! 121: for (i = 0, cp = buf; (c = *cp) != '\n' && c != '\0'; cp++) ! 122: { ! 123: if (c == ':') ! 124: { ! 125: *cp = '\0'; ! 126: i++; ! 127: field[i] = cp + 1; ! 128: } ! 129: } ! 130: ! 131: return (i); ! 132: } ! 133: /* ! 134: ** NEXT -- return successor to code. ! 135: */ ! 136: ! 137: next(code) ! 138: char code[2]; ! 139: { ! 140: register char *c; ! 141: register char a, b; ! 142: ! 143: c = code; ! 144: a = c[0]; ! 145: b = c[1]; ! 146: ! 147: if (++b > 'z') ! 148: { ! 149: b = '0'; ! 150: } ! 151: else if (b == '9' + 1) ! 152: { ! 153: b = 'a'; ! 154: if (a == 'Z') ! 155: { ! 156: write(2, "Too many users\n", 15); ! 157: exit(-1); ! 158: } ! 159: if (++a > 'z') ! 160: { ! 161: a = 'A'; ! 162: } ! 163: } ! 164: ! 165: c[0] = a; ! 166: c[1] = b; ! 167: } ! 168: ! 169: /* ! 170: ** sysexit ! 171: ** A simple function that just exits, this is for the benefit ! 172: ** of syserr, so it does not core dump. ! 173: */ ! 174: sysexit(value) ! 175: int value; ! 176: { ! 177: exit(value); ! 178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.