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: }
Defined functions
main
defined in line
7;
never used
next
defined in line
137; used 1 times