|
|
1.1 root 1: /*
2: * Copyright (c) 1985 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #if defined(LIBC_SCCS) && !defined(lint)
8: static char sccsid[] = "@(#)getusershell.c 5.4 (Berkeley) 7/25/86";
9: #endif LIBC_SCCS and not lint
10:
11: #include <sys/param.h>
12: #include <sys/file.h>
13: #include <sys/stat.h>
14: #include <ctype.h>
15: #include <stdio.h>
16:
17: #define SHELLS "/etc/shells"
18:
19: /*
20: * Do not add local shells here. They should be added in /etc/shells
21: */
22: static char *okshells[] =
23: { "/bin/sh", "/bin/csh", 0 };
24:
25: static char **shells, *strings;
26: static char **curshell = NULL;
27: extern char **initshells();
28:
29: /*
30: * Get a list of shells from SHELLS, if it exists.
31: */
32: char *
33: getusershell()
34: {
35: char *ret;
36:
37: if (curshell == NULL)
38: curshell = initshells();
39: ret = *curshell;
40: if (ret != NULL)
41: curshell++;
42: return (ret);
43: }
44:
45: endusershell()
46: {
47:
48: if (shells != NULL)
49: free((char *)shells);
50: shells = NULL;
51: if (strings != NULL)
52: free(strings);
53: strings = NULL;
54: curshell = NULL;
55: }
56:
57: setusershell()
58: {
59:
60: curshell = initshells();
61: }
62:
63: static char **
64: initshells()
65: {
66: register char **sp, *cp;
67: register FILE *fp;
68: struct stat statb;
69: extern char *malloc(), *calloc();
70:
71: if (shells != NULL)
72: free((char *)shells);
73: shells = NULL;
74: if (strings != NULL)
75: free(strings);
76: strings = NULL;
77: if ((fp = fopen(SHELLS, "r")) == (FILE *)0)
78: return(okshells);
79: if (fstat(fileno(fp), &statb) == -1) {
80: (void)fclose(fp);
81: return(okshells);
82: }
83: if ((strings = malloc((unsigned)statb.st_size)) == NULL) {
84: (void)fclose(fp);
85: return(okshells);
86: }
87: shells = (char **)calloc((unsigned)statb.st_size / 3, sizeof (char *));
88: if (shells == NULL) {
89: (void)fclose(fp);
90: free(strings);
91: strings = NULL;
92: return(okshells);
93: }
94: sp = shells;
95: cp = strings;
96: while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
97: while (*cp != '#' && *cp != '/' && *cp != '\0')
98: cp++;
99: if (*cp == '#' || *cp == '\0')
100: continue;
101: *sp++ = cp;
102: while (!isspace(*cp) && *cp != '#' && *cp != '\0')
103: cp++;
104: *cp++ = '\0';
105: }
106: *sp = (char *)0;
107: (void)fclose(fp);
108: return (shells);
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.