• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src/router/netatalk-3.0.5/libatalk/compat/
1/*
2 *
3 * Copyright (c) 1985 Regents of the University of California.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms are permitted
7 * provided that: (1) source distributions retain this entire copyright
8 * notice and comment, and (2) distributions including binaries display
9 * the following acknowledgement:  ``This product includes software
10 * developed by the University of California, Berkeley and its contributors''
11 * in the documentation or other materials provided with the distribution
12 * and in all advertising materials mentioning features or use of this
13 * software. Neither the name of the University nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 */
20
21#ifdef HAVE_CONFIG_H
22#include "config.h"
23#endif /* HAVE_CONFIG_H */
24
25#if defined(LIBC_SCCS) && !defined(lint)
26static char sccsid[] = "@(#)getusershell.c	5.6 (Berkeley) 6/1/90";
27#endif /* LIBC_SCCS and not lint */
28
29#if defined(ultrix) || defined(_IBMR2) || defined(NEED_GETUSERSHELL)
30
31#include <sys/param.h>
32#include <sys/file.h>
33#include <sys/stat.h>
34#include <ctype.h>
35#include <stdio.h>
36
37#define SHELLS "/etc/shells"
38
39/*
40 * Do not add local shells here.  They should be added in /etc/shells
41 */
42static char *okshells[] = {
43    "/bin/sh", "/bin/csh",
44#ifdef _IBMR2
45    "/bin/ksh",
46#endif /* _IBMR2 */
47    0
48};
49
50static char **shells, *strings;
51static char **curshell = NULL;
52extern char **initshells();
53
54/*
55 * Get a list of shells from SHELLS, if it exists.
56 */
57char *
58getusershell()
59{
60	char *ret;
61
62	if (curshell == NULL)
63		curshell = initshells();
64	ret = *curshell;
65	if (ret != NULL)
66		curshell++;
67	return (ret);
68}
69
70endusershell()
71{
72
73	if (shells != NULL)
74		free((char *)shells);
75	shells = NULL;
76	if (strings != NULL)
77		free(strings);
78	strings = NULL;
79	curshell = NULL;
80}
81
82setusershell()
83{
84
85	curshell = initshells();
86}
87
88static char **
89initshells()
90{
91	register char **sp, *cp;
92	register FILE *fp;
93	struct stat statb;
94	extern char *malloc(), *calloc();
95
96	if (shells != NULL)
97		free((char *)shells);
98	shells = NULL;
99	if (strings != NULL)
100		free(strings);
101	strings = NULL;
102	if ((fp = fopen(SHELLS, "r")) == (FILE *)0)
103		return(okshells);
104	if (fstat(fileno(fp), &statb) == -1) {
105		(void)fclose(fp);
106		return(okshells);
107	}
108	if ((strings = malloc((unsigned)statb.st_size)) == NULL) {
109		(void)fclose(fp);
110		return(okshells);
111	}
112	shells = (char **)calloc((unsigned)statb.st_size / 3, sizeof (char *));
113	if (shells == NULL) {
114		(void)fclose(fp);
115		free(strings);
116		strings = NULL;
117		return(okshells);
118	}
119	sp = shells;
120	cp = strings;
121	while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
122		while (*cp != '#' && *cp != '/' && *cp != '\0')
123			cp++;
124		if (*cp == '#' || *cp == '\0')
125			continue;
126		*sp++ = cp;
127		while (!isspace(*cp) && *cp != '#' && *cp != '\0')
128			cp++;
129		*cp++ = '\0';
130	}
131	*sp = (char *)0;
132	(void)fclose(fp);
133	return (shells);
134}
135
136# endif /* ultrix */
137