123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /* setusershell(), getusershell(), endusershell() for uClibc.
- *
- * Copyright (C) 2010 Bernhard Reutner-Fischer <uclibc@uclibc.org>
- *
- * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in
- * this tarball.
- */
- /* My manpage reads:
- * The getusershell() function returns the next line from the file
- * /etc/shells, opening the file if necessary. The line should contain
- * the pathname of a valid user shell. If /etc/shells does not exist
- * or is unreadable, getusershell() behaves as if /bin/sh and /bin/csh
- * were listed in the file.
- * The getusershell() function returns a NULL pointer on end-of-file.
- */
- #include <unistd.h>
- #include <stdlib.h>
- #include <paths.h>
- #include <string.h>
- #include "internal/parse_config.h"
- #if defined __USE_BSD || (defined __USE_XOPEN && !defined __USE_UNIX98)
- static const char * const defaultsh[] = { _PATH_BSHELL, _PATH_CSHELL, NULL};
- static char *shellb, **shells;
- static parser_t *shellp;
- void endusershell(void)
- {
- if (shellp) {
- shells = (char**) shellb;
- while (shells && *shells) {
- char*xxx = *shells++;
- free(xxx);
- }
- config_close(shellp);
- shellp = NULL;
- }
- free(shellb);
- shellb = NULL;
- shells = NULL;
- }
- libc_hidden_def(endusershell)
- void setusershell(void)
- {
- endusershell();
- shellp = config_open(_PATH_SHELLS);
- if (shellp == NULL)
- shells = (char **)defaultsh;
- else {
- char **shell = NULL;
- int pos = 0;
- while (config_read(shellp, &shell, 1, 1, "# \t", PARSE_NORMAL))
- {
- shellb = realloc(shellb, (pos + 2) * sizeof(char*));
- shells = (char**) shellb + pos++;
- *shells++ = strdup(*shell);
- *shells = NULL;
- }
- shells = (char **)shellb;
- }
- }
- libc_hidden_def(setusershell)
- char *getusershell(void)
- {
- char *sh;
- if (shells == NULL)
- setusershell();
- sh = *shells;
- if (sh)
- shells++;
- return sh;
- }
- #endif
|