|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)getname.c 2.2 (Berkeley) 8/11/83";
3: #endif
4:
5: /*
6: * Getname / getuserid for those with no
7: * hashed passwd data base).
8: * Do not compile this module in if you DO have hashed
9: * passwd's -- this is slower.
10: *
11: * Also provided here is a getpw routine which can share
12: * the open file. This is used for the Version 6 getenv
13: * implementation.
14: */
15:
16: #include "rcv.h"
17:
18: static FILE *pwfile = NULL; /* Pw file held open */
19: static char *pwname = "/etc/passwd"; /* Name of passwd file */
20:
21: /*
22: * Search the passwd file for a uid. Return name through ref parameter
23: * if found, indicating success with 0 return. Return -1 on error.
24: * If -1 is passed as the user id, close the passwd file.
25: */
26:
27: getname(uid, namebuf)
28: char namebuf[];
29: {
30: register char *cp, *cp2;
31: char linebuf[BUFSIZ];
32:
33: if (uid == -1) {
34: if (pwfile != NULL)
35: fclose(pwfile);
36: pwfile = NULL;
37: return(0);
38: }
39: if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL)
40: return(-1);
41: rewind(pwfile);
42: while (fgets(linebuf, BUFSIZ, pwfile) != NULL)
43: if (pweval(linebuf) == uid) {
44: for (cp = linebuf, cp2 = namebuf; *cp != ':';
45: *cp2++ = *cp++)
46: ;
47: *cp2 = '\0';
48: return(0);
49: }
50: return(-1);
51: }
52:
53: /*
54: * Read the users password file line into the passed line
55: * buffer.
56: */
57:
58: getpw(uid, linebuf)
59: char linebuf[];
60: {
61: register char *cp, *cp2;
62:
63: if (uid == -1) {
64: if (pwfile != NULL)
65: fclose(pwfile);
66: pwfile = NULL;
67: return(0);
68: }
69: if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL)
70: return(-1);
71: rewind(pwfile);
72: while (fgets(linebuf, BUFSIZ, pwfile) != NULL)
73: if (pweval(linebuf) == uid) {
74: if (linebuf[0] != '\0')
75: linebuf[strlen(linebuf)-1] = '\0';
76: return(0);
77: }
78: return(-1);
79: }
80:
81: /*
82: * Look for passwd line belonging to 'name'
83: */
84:
85: getpwnam(name, linebuf)
86: char name[], linebuf[];
87: {
88: register char *cp, *cp2;
89:
90: if (name == NOSTR) {
91: if (pwfile != NULL)
92: fclose(pwfile);
93: pwfile = NULL;
94: return(0);
95: }
96: if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL) {
97: perror(pwname);
98: return(-1);
99: }
100: rewind(pwfile);
101: while (fgets(linebuf, BUFSIZ, pwfile) != NULL) {
102: cp = linebuf;
103: cp2 = name;
104: while (*cp2++ == *cp++)
105: ;
106: if (*--cp == ':' && *--cp2 == 0)
107: return(0);
108: }
109: return(-1);
110: }
111:
112: /*
113: * Convert the passed name to a user id and return it. Return -1
114: * on error. Iff the name passed is -1 (yech) close the pwfile.
115: */
116:
117: getuserid(name)
118: char name[];
119: {
120: register char *cp, *cp2;
121: char linebuf[BUFSIZ];
122:
123: if (name == (char *) -1) {
124: if (pwfile != NULL)
125: fclose(pwfile);
126: pwfile = NULL;
127: return(0);
128: }
129: if (pwfile == NULL && (pwfile = fopen(pwname, "r")) == NULL)
130: return(-1);
131: rewind(pwfile);
132: while (fgets(linebuf, BUFSIZ, pwfile) != NULL) {
133: for (cp = name, cp2 = linebuf; *cp++ == *cp2++;)
134: ;
135: if (*--cp == '\0' && *--cp2 == ':')
136: return(pweval(linebuf));
137: }
138: return(-1);
139: }
140:
141: /*
142: * Evaluate the user id of the passed passwd line and return it.
143: */
144:
145: static
146: pweval(line)
147: char line[];
148: {
149: register char *cp;
150: register int i;
151: register int uid;
152:
153: for (cp = line, i = 0; i < 2; i += (*cp++ == ':'))
154: ;
155: uid = atoi(cp);
156:
157: #ifdef UIDGID
158: while (*cp && *cp != ':')
159: cp++;
160: cp++;
161: uid |= atoi(cp) << 8;
162: #endif
163:
164: return(uid);
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.