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