Annotation of researchv10no/cmd/netnews/src/fullname.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * fullname.c - this file is made separate so that different local
        !             3:  * conventions can be applied.  The stock version understands two
        !             4:  * conventions:
        !             5:  *
        !             6:  * (a) Berkeley finger: the gecos field in /etc/passwd begins with
        !             7:  *     the full name, terminated with comma, semicolon, or end of
        !             8:  *     field.  & expands to the login name.
        !             9:  * (b) BTL RJE: the gecos field looks like
        !            10:  *     : junk - full name ( junk :
        !            11:  *     where the "junk -" is optional.
        !            12:  *
        !            13:  * If you have a different local convention, modify this file accordingly.
        !            14:  */
        !            15: 
        !            16: static char *sccsid = "@(#)fullname.c  1.4     5/3/83";
        !            17: 
        !            18: #include <stdio.h>
        !            19: #include <ctype.h>
        !            20: #include <pwd.h>
        !            21: #include "defs.h"
        !            22: 
        !            23: #ifndef LOCALNAME
        !            24: /*
        !            25:  * Figure out who is sending the message and sign it.
        !            26:  * We attempt to look up the user in the gecos field of /etc/passwd.
        !            27:  */
        !            28: char *
        !            29: fullname(un)
        !            30: char *un;
        !            31: {
        !            32:        static char inbuf[100];
        !            33:        struct passwd *pw, *getpwnam();
        !            34: 
        !            35:        pw = getpwnam(un);
        !            36:        if (pw == NULL)
        !            37:                return un;
        !            38:        buildfname(pw->pw_gecos, un, inbuf);
        !            39:        if (inbuf[0] == 0)
        !            40:                return un;
        !            41:        return inbuf;
        !            42: }
        !            43: 
        !            44: #else
        !            45: 
        !            46: /*
        !            47:  * Alternative version of fullname which asks the user for his full name.
        !            48:  * This is mainly suitable for systems that don't have a full name
        !            49:  * database somewhere.  It puts the answer in $HOME/.name
        !            50:  */
        !            51: char *
        !            52: fullname(un)
        !            53: char *un;
        !            54: {
        !            55:        static char inbuf[100];
        !            56:        char fbuf[100];
        !            57:        FILE *fd;
        !            58:        char *p, *index(), *getenv();
        !            59:        int pid;
        !            60: 
        !            61:        if (!isatty(2))
        !            62:                return un;
        !            63:        printf("What is your full name (for news article signatures): ");
        !            64:        fflush(stdout);
        !            65:        read(2, inbuf, sizeof inbuf);
        !            66:        if (inbuf[0] == 0)
        !            67:                return un;
        !            68:        p = index(inbuf, '\n');
        !            69:        if (p)
        !            70:                *p = 0;
        !            71:        if ((p = getenv("HOME")) == NULL) {
        !            72:                fprintf(stderr,
        !            73:                "inews: no HOME environment variable - .name not written\n");
        !            74:                return inbuf;
        !            75:        }
        !            76:        sprintf(fbuf, "%s/%s", p, ".name");
        !            77:        if ((pid = fork()) < 0) {
        !            78:                perror("inews");
        !            79:                return inbuf;
        !            80:        }
        !            81:        else if (pid != 0)
        !            82:                while (wait((int *)0) != pid)
        !            83:                        ;
        !            84:        else {
        !            85:                setuid(getuid());       /* become the user */
        !            86:                if ((fd = fopen(fbuf, "w")) == NULL)
        !            87:                        fprintf(stderr, "inews: can't create %s\n", fbuf);
        !            88:                else {
        !            89:                        fprintf(fd, "%s\n", inbuf);
        !            90:                        fclose(fd);
        !            91:                }
        !            92:                exit(0);
        !            93:        }
        !            94:        return inbuf;
        !            95: }
        !            96: #endif
        !            97: 
        !            98: #ifndef LOCALNAME
        !            99: /*
        !           100: **  BUILDFNAME -- build full name from gecos style entry.
        !           101: **     (routine lifted from sendmail)
        !           102: **
        !           103: **     This routine interprets the strange entry that would appear
        !           104: **     in the GECOS field of the password file.
        !           105: **
        !           106: **     Parameters:
        !           107: **             p -- name to build.
        !           108: **             login -- the login name of this user (for &).
        !           109: **             buf -- place to put the result.
        !           110: **
        !           111: **     Returns:
        !           112: **             none.
        !           113: **
        !           114: **     Side Effects:
        !           115: **             none.
        !           116: */
        !           117: 
        !           118: buildfname(p, login, buf)
        !           119:        register char *p;
        !           120:        char *login;
        !           121:        char *buf;
        !           122: {
        !           123:        register char *bp = buf;
        !           124: 
        !           125:        if (*p == '*')
        !           126:                p++;
        !           127:        while (*p != '\0' && *p != ',' && *p != ';' && *p != ':' && *p != '(')
        !           128:        {
        !           129:                if (*p == '-') {
        !           130:                        bp = buf;
        !           131:                        p++;
        !           132:                }
        !           133:                else if (*p == '&')
        !           134:                {
        !           135:                        (void) strcpy(bp, login);
        !           136:                        if (islower(*bp))
        !           137:                                *bp = toupper(*bp);
        !           138:                        while (*bp != '\0')
        !           139:                                bp++;
        !           140:                        p++;
        !           141:                }
        !           142:                else
        !           143:                        *bp++ = *p++;
        !           144:        }
        !           145:        *bp = '\0';
        !           146: }
        !           147: #endif

unix.superglobalmegacorp.com

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