Annotation of 43BSD/contrib/nntp/inews/inews.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)inews.c     1.4     (Berkeley) 3/20/86";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * Itty-bitty inews for talking to remote server.
        !             7:  * Simply accept input on stdin (or via a named file) and dump this
        !             8:  * to the server; add a From: and Path: line if missing in the original.
        !             9:  *
        !            10:  * Steven Grady ([email protected])
        !            11:  */
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include <pwd.h>
        !            15: #include <ctype.h>
        !            16: #include <strings.h>
        !            17: #include "../common/conf.h"
        !            18: #include "../common/response_codes.h"
        !            19: 
        !            20: extern FILE    *ser_wr_fp;
        !            21: 
        !            22: main(argc, argv)
        !            23: int    argc;
        !            24: char   *argv[];
        !            25: {
        !            26:        char    line[256], s[256];
        !            27:        int     seen_fromline, in_header;
        !            28: 
        !            29:        ++argv;
        !            30:        while (argc > 1)
        !            31:                if (*argv[0] == '-') {
        !            32:                        ++argv;
        !            33:                        --argc;
        !            34:                } else
        !            35:                        break;
        !            36: 
        !            37:        if (argc > 1) {
        !            38:                if (freopen(*argv, "r", stdin) == NULL) {
        !            39:                        perror(*argv);
        !            40:                        exit(1);
        !            41:                }
        !            42:        }
        !            43: 
        !            44:        if (server_init(SERVER_HOST) < 0)
        !            45:                exit(1);                        /* Connect to the server */
        !            46: 
        !            47:        put_server("POST");
        !            48:        (void) get_server(line, sizeof(line));
        !            49:        if (*line != CHAR_CONT) {
        !            50:                if (atoi(line) == ERR_NOPOST) {
        !            51:                        fprintf(stderr,
        !            52:                                "Sorry, you can't post from this machine.\n");
        !            53:                        exit(1);
        !            54:                } else {
        !            55:                        fprintf(stderr, "Remote error: %s\n", line);
        !            56:                        exit(1);
        !            57:                }
        !            58:        }
        !            59: 
        !            60:        in_header = 1;
        !            61:        while (gets(s) != NULL) {
        !            62:                if (s[0] == '.')    /* Single . is eof, so put in extra one */
        !            63:                        (void) fputc('.', ser_wr_fp);
        !            64:                if (in_header && strneql(s, "From:", sizeof("From:")-1))
        !            65:                        seen_fromline = 1;
        !            66:                if (in_header && s[0] == '\0') {
        !            67:                        in_header = 0;
        !            68:                        if (!seen_fromline)
        !            69:                                gen_frompath();
        !            70:                }
        !            71:                fprintf(ser_wr_fp, "%s\r\n", s);
        !            72:        }
        !            73: 
        !            74:        append_signature();
        !            75: 
        !            76:        fprintf(ser_wr_fp, ".\r\n");
        !            77:        (void) fflush(ser_wr_fp);
        !            78:        (void) get_server(line, sizeof(line));
        !            79:        if (*line != CHAR_OK) {
        !            80:                if (atoi(line) == ERR_POSTFAIL) {
        !            81:                        fprintf(stderr,
        !            82:                            "Article not accepted by server; not posted.\n");
        !            83:                        exit(1);
        !            84:                } else {
        !            85:                        fprintf(stderr, "Remote error: %s\n", line);
        !            86:                        exit(1);
        !            87:                }
        !            88:        }
        !            89: 
        !            90:        /*
        !            91:         * Close server sends the server a
        !            92:         * "quit" command for us, which is why we don't send it.
        !            93:         */
        !            94: 
        !            95:        close_server();
        !            96: }
        !            97: 
        !            98: /*
        !            99:  * append_signature -- append the person's .signature file if
        !           100:  * they have one.
        !           101:  */
        !           102: 
        !           103: append_signature()
        !           104: {
        !           105:        char    line[256], sigfile[256];
        !           106:        char    *cp;
        !           107:        struct  passwd  *passwd;
        !           108:        FILE    *fp;
        !           109:        char    *index();
        !           110: 
        !           111:        passwd = getpwuid(getuid());
        !           112:        if (passwd == NULL)
        !           113:                return;
        !           114: 
        !           115:        (void) strcpy(sigfile, passwd->pw_dir);
        !           116:        (void) strcat(sigfile, "/");
        !           117:        (void) strcat(sigfile, ".signature");
        !           118: 
        !           119:        fp = fopen(sigfile, "r");
        !           120:        if (fp != NULL)
        !           121:                while (fgets(line, sizeof(line), fp)) {
        !           122:                        if (cp = index(line, '\n'))
        !           123:                                *cp = '\0';
        !           124:                        fprintf(ser_wr_fp, "%s\r\n", line);
        !           125:                }
        !           126: }
        !           127: 
        !           128: /*
        !           129:  * gen_frompath -- generate From: and Path: lines, in the form
        !           130:  *
        !           131:  *     From: [email protected] (full_name)
        !           132:  *     Path: host!user
        !           133:  *
        !           134:  * This routine should only be called if the message doesn't have
        !           135:  * a From: line in it.
        !           136:  */
        !           137: 
        !           138: gen_frompath()
        !           139: {
        !           140:        char    host_name[256];
        !           141:        char    *full_name;
        !           142:        char    *cp;
        !           143:        struct  passwd *passwd;
        !           144:        char    *index(), *getenv();
        !           145: 
        !           146:        passwd = getpwuid(getuid());
        !           147: 
        !           148:        full_name = getenv("NAME");
        !           149:        if (full_name == NULL) {
        !           150:                full_name = passwd->pw_gecos;
        !           151:                if ((cp = index(full_name, ',')))
        !           152:                        *cp = '\0';
        !           153:        }
        !           154: 
        !           155:        (void) gethostname(host_name, sizeof (host_name));
        !           156:        
        !           157: #ifdef DOMAIN
        !           158:        fprintf(ser_wr_fp, "From: %s@%s.%s (",
        !           159:                passwd->pw_name,
        !           160:                host_name,
        !           161:                DOMAIN);
        !           162: #else
        !           163:        fprintf(ser_wr_fp, "From: %s@%s (",
        !           164:                passwd->pw_name,
        !           165:                host_name);
        !           166: #endif
        !           167: 
        !           168:        for (cp = full_name; *cp != '\0'; ++cp)
        !           169:                if (*cp != '&')
        !           170:                        putc(*cp, ser_wr_fp);
        !           171:                else {          /* Stupid & hack.  God damn it. */
        !           172:                        putc(toupper(passwd->pw_name[0]), ser_wr_fp);
        !           173:                        fprintf(ser_wr_fp, passwd->pw_name+1);
        !           174:                }
        !           175: 
        !           176:        fprintf(ser_wr_fp, ")\r\n");
        !           177: 
        !           178:        fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name, passwd->pw_name);
        !           179: }
        !           180: 
        !           181: 
        !           182: /*
        !           183:  * strneql -- determine if two strings are equal in the first n
        !           184:  * characters, ignoring case.
        !           185:  *
        !           186:  *     Parameters:     "a" and "b" are the pointers
        !           187:  *                     to characters to be compared.
        !           188:  *                     "n" is the number of characters to compare.
        !           189:  *
        !           190:  *     Returns:        1 if the strings are equal, 0 otherwise.
        !           191:  *
        !           192:  *     Side effects:   None.
        !           193:  */
        !           194: 
        !           195: strneql(a, b, n)
        !           196: register char *a, *b;
        !           197: int    n;
        !           198: {
        !           199:        char    lower();
        !           200: 
        !           201:        while (n && lower(*a) == lower(*b)) {
        !           202:                if (*a == '\0')
        !           203:                        return (1);
        !           204:                a++;
        !           205:                b++;
        !           206:                n--;
        !           207:        }
        !           208:        if (n)
        !           209:                return (0);
        !           210:        else
        !           211:                return (1);
        !           212: }
        !           213: 
        !           214: /*
        !           215:  * lower -- convert a character to lower case, if it's
        !           216:  *     upper case.
        !           217:  *
        !           218:  *     Parameters:     "c" is the character to be
        !           219:  *                     converted.
        !           220:  *
        !           221:  *     Returns:        "c" if the character is not
        !           222:  *                     upper case, otherwise the lower
        !           223:  *                     case eqivalent of "c".
        !           224:  *
        !           225:  *     Side effects:   None.
        !           226:  */
        !           227: 
        !           228: char lower(c)
        !           229: register char c;
        !           230: {
        !           231:        if (isascii(c) && isupper(c))
        !           232:                c = c - 'A' + 'a';
        !           233:        return(c);
        !           234: }

unix.superglobalmegacorp.com

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