Files
inetutils/libinetutils/getusershell.c
Sergey Poznyakoff 5ddf123bac ChangeLog configure.in ftp/Makefile.am ftpd/Makefile.am
ftpd/ftpcmd.y ftpd/ftpd.c ftpd/logwtmp.c ftpd/popen.c
 	glob/Makefile.am headers/config.h.in inetd/ChangeLog
 	inetd/Makefile.am inetd/inetd.c libinetutils/ChangeLog
 	libinetutils/Makefile.am libinetutils/cleansess.c
 	libinetutils/daemon.c libinetutils/des_rw.c
 	libinetutils/forkpty.c libinetutils/getusershell.c
 	libinetutils/herror.c libinetutils/hstrerror.c
 	libinetutils/iruserok.c libinetutils/localhost.c
 	libinetutils/login_tty.c libinetutils/logout.c
 	libinetutils/logwtmp.c libinetutils/openpty.c
 	libinetutils/readstream.c libinetutils/revoke.c
 	libinetutils/setenv.c libinetutils/setsig.c
 	libinetutils/strdup.c libinetutils/stub_tgetent.c
 	libinetutils/tftpsubs.c libinetutils/ttymsg.c
 	libinetutils/utmp_init.c libinetutils/utmp_logout.c
 	libinetutils/xgetcwd.c libinetutils/xstrdup.c
 	libls/Makefile.am libtelnet/Makefile.am libtelnet/genget.c
 	libtelnet/getent.c libtelnet/misc.c ping/Makefile.am
 	rcp/Makefile.am rcp/rcp.c rcp/util.c rexecd/ChangeLog
 	rexecd/Makefile.am rexecd/rexecd.c rlogin/Makefile.am
 	rlogin/rlogin.c rlogind/Makefile.am rlogind/rlogind.c
 	rsh/Makefile.am rsh/rsh.c rshd/Makefile.am rshd/rshd.c
 	syslog/Makefile.am syslog/syslog.c syslogd/Makefile.am
 	syslogd/syslogd.c talk/Makefile.am talk/ctl.c
 	talk/ctl_transact.c talk/display.c talk/get_addrs.c
 	talk/get_names.c talk/init_disp.c talk/invite.c talk/io.c
 	talk/look_up.c talk/msgs.c talk/talk.c talkd/Makefile.am
 	talkd/announce.c talkd/print.c talkd/process.c talkd/table.c
 	talkd/talkd.c telnet/Makefile.am telnet/authenc.c
 	telnet/commands.c telnet/externs.h telnet/main.c
 	telnet/network.c telnet/ring.c telnet/ring.h telnet/sys_bsd.c
 	telnet/telnet.c telnet/terminal.c telnet/tn3270.c
 	telnet/utilities.c telnetd/Makefile.am telnetd/authenc.c
 	telnetd/slc.c telnetd/state.c telnetd/sys_term.c
 	telnetd/telnetd.c telnetd/termstat.c telnetd/utility.c
 	tftp/Makefile.am tftp/tftp.c tftpd/Makefile.am tftpd/tftpd.c
 	uucpd/Makefile.am uucpd/uucpd.c whois/Makefile.am whois/net.c

In a bold move, bring all the functions prototype to ANSI C.
2000-07-19 04:08:39 +00:00

169 lines
3.9 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* getusershell.c -- Return names of valid user shells.
Copyright (C) 1991, 2000 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Written by David MacKenzie <djm@gnu.ai.mit.edu> */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifndef SHELLS_FILE
/* File containing a list of nonrestricted shells, one per line. */
#define SHELLS_FILE "/etc/shells"
#endif
#include <stdio.h>
#include <ctype.h>
#ifdef STDC_HEADERS
#include <stdlib.h>
#else
char *malloc __P (());
char *realloc __P (());
#endif
char *xstrdup __P ((const char *));
static int readname __P ((char **name, int *size, FILE *stream));
/* List of shells to use if the shells file is missing. */
static char const* const default_shells[] =
{
"/bin/sh", "/bin/csh", "/usr/bin/sh", "/usr/bin/csh", NULL
};
/* Index of the next shell in `default_shells' to return.
0 means we are not using `default_shells'. */
static int default_index = 0;
/* Input stream from the shells file. */
static FILE *shellstream = NULL;
/* Line of input from the shells file. */
static char *line = NULL;
/* Number of bytes allocated for `line'. */
static int line_size = 0;
/* Return an entry from the shells file, ignoring comment lines.
If the file doesn't exist, use the list in DEFAULT_SHELLS (above).
In any case, the returned string is in memory allocated through malloc.
Return NULL if there are no more entries. */
char *
getusershell ()
{
if (default_index > 0)
{
if (default_shells[default_index])
/* Not at the end of the list yet. */
return xstrdup (default_shells[default_index++]);
return NULL;
}
if (shellstream == NULL)
{
shellstream = fopen (SHELLS_FILE, "r");
if (shellstream == NULL)
{
/* No shells file. Use the default list. */
default_index = 1;
return xstrdup (default_shells[0]);
}
}
while (readname (&line, &line_size, shellstream))
{
if (*line != '#')
return line;
}
return NULL; /* End of file. */
}
/* Rewind the shells file. */
void
setusershell ()
{
default_index = 0;
if (shellstream == NULL)
shellstream = fopen (SHELLS_FILE, "r");
else
fseek (shellstream, 0L, 0);
}
/* Close the shells file. */
void
endusershell ()
{
if (shellstream)
{
fclose (shellstream);
shellstream = NULL;
}
}
/* Read a line from STREAM, removing any newline at the end.
Place the result in *NAME, which is malloc'd
and/or realloc'd as necessary and can start out NULL,
and whose size is passed and returned in *SIZE.
Return the number of characters placed in *NAME
if some nonempty sequence was found, otherwise 0. */
static int
readname (char **name, int *size, FILE *stream)
{
int c;
int name_index = 0;
if (*name == NULL)
{
*size = 10;
*name = (char *) xmalloc (*size);
}
/* Skip blank space. */
while ((c = getc (stream)) != EOF && isspace (c))
/* Do nothing. */ ;
while (c != EOF && !isspace (c))
{
(*name)[name_index++] = c;
while (name_index >= *size)
{
*size *= 2;
*name = (char *) xrealloc (*name, *size);
}
c = getc (stream);
}
(*name)[name_index] = '\0';
return name_index;
}
#ifdef TEST
main ()
{
char *s;
while (s = getusershell ())
puts (s);
exit (0);
}
#endif