Annotation of 43BSDTahoe/lib/libc/gen/getusershell.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.