Annotation of 43BSDTahoe/new/nntp/inews/inews.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)inews.c     1.12    (Berkeley) 7/13/87";
                      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:  * Print meaningful errors from the server.
                     10:  * Limit .signature files to MAX_SIGNATURE lines.
                     11:  *
                     12:  * Original by Steven Grady <[email protected]>, with thanks from
                     13:  * Phil Lapsley <[email protected]>, who is now responsible for it.
                     14:  */
                     15: 
                     16: #include <stdio.h>
                     17: #include <pwd.h>
                     18: #include <ctype.h>
                     19: #include <strings.h>
                     20: #include "../common/conf.h"
                     21: #include "../common/response_codes.h"
                     22: 
                     23: #define        MAX_SIGNATURE   4
                     24: 
                     25: extern FILE    *ser_wr_fp;
                     26: 
                     27: char   host_name[256];
                     28: 
                     29: main(argc, argv)
                     30: int    argc;
                     31: char   *argv[];
                     32: {
                     33:        char    line[256], s[256];
                     34:        int     seen_fromline, in_header;
                     35:        int     response;
                     36:        char    *server;
                     37:        char    *getserverbyfile();
                     38:        register char   *cp;
                     39: 
                     40:        ++argv;
                     41:        while (argc > 1)
                     42:                if (*argv[0] == '-') {
                     43:                        ++argv;
                     44:                        --argc;
                     45:                } else
                     46:                        break;
                     47: 
                     48:        if (argc > 1) {
                     49:                if (freopen(*argv, "r", stdin) == NULL) {
                     50:                        perror(*argv);
                     51:                        exit(1);
                     52:                }
                     53:        }
                     54: 
                     55:        uname(host_name);
                     56: 
                     57:        server = getserverbyfile(SERVER_FILE);
                     58:        if (server == NULL) {
                     59:                fprintf(stderr,
                     60:                        "Can't get the name of the news server from %s.\n",
                     61:                        SERVER_FILE);
                     62:                fprintf(stderr,
                     63:               "Either fix this file, or put NNTPSERVER in your enviroment.\n");
                     64:                exit(1);
                     65:        }
                     66: 
                     67:        response = server_init(server);
                     68:        if (response < 0) {
                     69:                printf("Couldn't connect to %s news server, try again later.\n",
                     70:                        server);
                     71:                exit(1);
                     72:        }
                     73: 
                     74:        if (handle_server_response(response, server) < 0
                     75:            || response == OK_NOPOST) {
                     76:                close_server();
                     77:                exit(1);
                     78:        }
                     79: 
                     80:        put_server("POST");
                     81:        (void) get_server(line, sizeof(line));
                     82:        if (*line != CHAR_CONT) {
                     83:                if (atoi(line) == ERR_NOPOST) {
                     84:                        close_server();
                     85:                        fprintf(stderr,
                     86:                                "Sorry, you can't post from this machine.\n");
                     87:                        exit(1);
                     88:                } else {
                     89:                        close_server();
                     90:                        fprintf(stderr, "Remote error: %s\n", line);
                     91:                        exit(1);
                     92:                }
                     93:        }
                     94: 
                     95:        in_header = 1;
                     96:        seen_fromline = 0;
                     97: 
                     98:        while (gets(s) != NULL) {
                     99:                if (s[0] == '.')    /* Single . is eof, so put in extra one */
                    100:                        (void) fputc('.', ser_wr_fp);
                    101:                if (in_header && strneql(s, "From:", sizeof("From:")-1))
                    102:                        seen_fromline = 1;
                    103:                if (in_header && s[0] == '\0') {
                    104:                        in_header = 0;
                    105:                        if (!seen_fromline)
                    106:                                gen_frompath();
                    107:                }
                    108:                fprintf(ser_wr_fp, "%s\r\n", s);
                    109:        }
                    110: 
                    111:        append_signature();
                    112: 
                    113:        fprintf(ser_wr_fp, ".\r\n");
                    114:        (void) fflush(ser_wr_fp);
                    115:        (void) get_server(line, sizeof(line));
                    116:        if (*line != CHAR_OK) {
                    117:                if (atoi(line) == ERR_POSTFAIL) {
                    118:                        close_server();
                    119:                        printf("Article not accepted by server; not posted.\n");
                    120:                        for (cp = line + 4; *cp && *cp != '\r'; cp++)
                    121:                                if (*cp == '\\')
                    122:                                        putchar('\n');
                    123:                                else
                    124:                                        putchar(*cp);
                    125:                        exit(1);
                    126:                } else {
                    127:                        close_server();
                    128:                        fprintf(stderr, "Remote error: %s\n", line);
                    129:                        exit(1);
                    130:                }
                    131:        }
                    132: 
                    133:        /*
                    134:         * Close server sends the server a
                    135:         * "quit" command for us, which is why we don't send it.
                    136:         */
                    137: 
                    138:        close_server();
                    139: 
                    140:        exit(0);
                    141: }
                    142: 
                    143: /*
                    144:  * append_signature -- append the person's .signature file if
                    145:  * they have one.  Limit .signature to MAX_SIGNATURE lines.
                    146:  */
                    147: 
                    148: append_signature()
                    149: {
                    150:        char    line[256], sigfile[256];
                    151:        char    *cp;
                    152:        struct  passwd  *passwd;
                    153:        FILE    *fp;
                    154:        char    *index();
                    155:        int     count = 0;
                    156: 
                    157:        passwd = getpwuid(getuid());
                    158:        if (passwd == NULL)
                    159:                return;
                    160: 
                    161:        (void) strcpy(sigfile, passwd->pw_dir);
                    162:        (void) strcat(sigfile, "/");
                    163:        (void) strcat(sigfile, ".signature");
                    164: 
                    165:        fp = fopen(sigfile, "r");
                    166:        if (fp == NULL)
                    167:                return;
                    168: 
                    169:        while (fgets(line, sizeof (line), fp)) {
                    170:                count++;
                    171:                if (count > MAX_SIGNATURE) {
                    172:                        fprintf(stderr,
                    173:              "Warning: .signature files should be no longer than %d lines.\n",
                    174:                        MAX_SIGNATURE);
                    175:                        fprintf(stderr,
                    176:                        "(Only %d lines of your .signature were posted.)\n",
                    177:                        MAX_SIGNATURE);
                    178:                        break;
                    179:                }
                    180:                if (cp = index(line, '\n'))
                    181:                        *cp = '\0';
                    182:                fprintf(ser_wr_fp, "%s\r\n", line);
                    183:        }
                    184:        (void) fclose(fp);
                    185: }
                    186: 
                    187: 
                    188: /*
                    189:  * gen_frompath -- generate From: and Path: lines, in the form
                    190:  *
                    191:  *     From: [email protected] (full_name)
                    192:  *     Path: host!user
                    193:  *
                    194:  * This routine should only be called if the message doesn't have
                    195:  * a From: line in it.
                    196:  */
                    197: 
                    198: gen_frompath()
                    199: {
                    200:        char    *full_name;
                    201:        char    *cp;
                    202:        struct  passwd *passwd;
                    203:        char    *index(), *getenv();
                    204: 
                    205:        passwd = getpwuid(getuid());
                    206: 
                    207:        full_name = getenv("NAME");
                    208:        if (full_name == NULL) {
                    209:                full_name = passwd->pw_gecos;
                    210:                if ((cp = index(full_name, ',')))
                    211:                        *cp = '\0';
                    212:        }
                    213: 
                    214: #ifdef DOMAIN
                    215: 
                    216:        /* A heuristic to see if we should tack on a domain */
                    217: 
                    218:        cp = index(host_name, '.');
                    219:        if (cp)
                    220:                fprintf(ser_wr_fp, "From: %s@%s (",
                    221:                        passwd->pw_name,
                    222:                        host_name);
                    223:        else
                    224:                fprintf(ser_wr_fp, "From: %s@%s.%s (",
                    225:                        passwd->pw_name,
                    226:                        host_name,
                    227:                        DOMAIN);
                    228: #else
                    229:        fprintf(ser_wr_fp, "From: %s@%s (",
                    230:                passwd->pw_name,
                    231:                host_name);
                    232: #endif
                    233: 
                    234:        for (cp = full_name; *cp != '\0'; ++cp)
                    235:                if (*cp != '&')
                    236:                        putc(*cp, ser_wr_fp);
                    237:                else {          /* Stupid & hack.  God damn it. */
                    238:                        putc(toupper(passwd->pw_name[0]), ser_wr_fp);
                    239:                        fprintf(ser_wr_fp, passwd->pw_name+1);
                    240:                }
                    241: 
                    242:        fprintf(ser_wr_fp, ")\r\n");
                    243: 
                    244:        fprintf(ser_wr_fp, "Path: %s!%s\r\n", host_name, passwd->pw_name);
                    245: }
                    246: 
                    247: 
                    248: /*
                    249:  * strneql -- determine if two strings are equal in the first n
                    250:  * characters, ignoring case.
                    251:  *
                    252:  *     Parameters:     "a" and "b" are the pointers
                    253:  *                     to characters to be compared.
                    254:  *                     "n" is the number of characters to compare.
                    255:  *
                    256:  *     Returns:        1 if the strings are equal, 0 otherwise.
                    257:  *
                    258:  *     Side effects:   None.
                    259:  */
                    260: 
                    261: strneql(a, b, n)
                    262: register char *a, *b;
                    263: int    n;
                    264: {
                    265:        char    lower();
                    266: 
                    267:        while (n && lower(*a) == lower(*b)) {
                    268:                if (*a == '\0')
                    269:                        return (1);
                    270:                a++;
                    271:                b++;
                    272:                n--;
                    273:        }
                    274:        if (n)
                    275:                return (0);
                    276:        else
                    277:                return (1);
                    278: }
                    279: 
                    280: /*
                    281:  * lower -- convert a character to lower case, if it's
                    282:  *     upper case.
                    283:  *
                    284:  *     Parameters:     "c" is the character to be
                    285:  *                     converted.
                    286:  *
                    287:  *     Returns:        "c" if the character is not
                    288:  *                     upper case, otherwise the lower
                    289:  *                     case eqivalent of "c".
                    290:  *
                    291:  *     Side effects:   None.
                    292:  */
                    293: 
                    294: char lower(c)
                    295: register char c;
                    296: {
                    297:        if (isascii(c) && isupper(c))
                    298:                c = c - 'A' + 'a';
                    299:        return(c);
                    300: }

unix.superglobalmegacorp.com

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