Annotation of 43BSD/contrib/nntp/server/serve.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char    *sccsid = "@(#)serve.c  1.6     (Berkeley) 3/12/86";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Main server routine
                      7:  */
                      8: 
                      9: #include "common.h"
                     10: 
                     11: #ifdef LOG
                     12: #include <sys/time.h>
                     13: #include <sys/resource.h>
                     14: #endif
                     15: 
                     16: #ifdef FASTFORK
                     17: #include <signal.h>
                     18: #endif
                     19: 
                     20: struct cmdent {
                     21:        char    *cmd_name;
                     22:        int     (*cmd_fctn)();
                     23: } cmdtbl[] = {
                     24:        "article",      ahbs,
                     25:        "body",         ahbs,
                     26:        "group",        group,
                     27:        "head",         ahbs,
                     28:        "help",         help,
                     29:        "ihave",        ihave,
                     30:        "last",         nextlast,
                     31:        "list",         list,
                     32:        "newgroups",    newgroups,
                     33:        "newnews",      newnews,
                     34:        "next",         nextlast,
                     35:        "post",         post,
                     36:        "slave",        slave,
                     37:        "stat",         ahbs,
                     38: };
                     39: #define NUMCMDS (sizeof(cmdtbl) / sizeof(struct cmdent))
                     40: 
                     41: char   *homedir = SPOOLDIR;
                     42: 
                     43: char   *group_array[MAX_GROUPS];
                     44: int    num_groups;
                     45: int    ingroup = 0;
                     46: int    art_ptr;
                     47: int    num_arts, art_array[MAX_ARTICLES];
                     48: FILE   *art_fp;
                     49: int    uid_poster, gid_poster;
                     50: int    canpost, canread, canxfer;
                     51: extern char *version;
                     52: 
                     53: #ifdef LOG
                     54: int    grps_acsd, arts_acsd;
                     55: #endif
                     56: 
                     57: /*
                     58:  * serve -- given a connection on stdin/stdout, serve
                     59:  *     a client, executing commands until the client
                     60:  *     says goodbye.
                     61:  *
                     62:  *     Parameters:     None.
                     63:  *
                     64:  *     Returns:        Exits.
                     65:  *
                     66:  *     Side effects:   Talks to client, does a lot of
                     67:  *                     stuff.
                     68:  */
                     69: 
                     70: serve()
                     71: {
                     72:        char    line[MAX_STRLEN], host[MAX_STRLEN];
                     73:        char    **argp;
                     74:        char    *timeptr, *cp;
                     75:        int     argnum, i;
                     76:        struct  passwd *pp;
                     77:        long    clock, time();
                     78:        char    *ctime();
                     79: 
                     80: #ifdef LOG
                     81:        struct  rusage  rusagebuf;
                     82: 
                     83:        grps_acsd = arts_acsd = 0;
                     84: #endif
                     85: 
                     86: #ifdef BSD_42
                     87:        openlog("nntpd", LOG_PID);
                     88: #else
                     89:        openlog("nntpd", LOG_PID, LOG_FACILITY);
                     90: #endif
                     91: 
                     92:        /* Get permissions and see if we can talk to this client */
                     93: 
                     94:        host_access(&canread, &canpost, &canxfer);
                     95: 
                     96:        if (gethostname(host, sizeof(host)) < 0)
                     97:                (void) strcpy(host, "Unknown host");
                     98: 
                     99:        if (!canread && !canxfer) {
                    100:                printf("%d %s NNTP server can't talk to you.  Goodbye.\r\n",
                    101:                        ERR_ACCESS, host);
                    102:                (void) fflush(stdout);
                    103: #ifdef LOG
                    104:                syslog(LOG_INFO, "%s refused connection", hostname);
                    105: #endif
                    106:                exit(1);
                    107:        }
                    108: 
                    109:        /* If we can talk, proceed with initialization */
                    110: 
                    111: #ifdef POSTER
                    112:        pp = getpwnam(POSTER);
                    113:        if (pp != NULL) {
                    114:                uid_poster = pp->pw_uid;
                    115:                gid_poster = pp->pw_gid;
                    116:        } else
                    117: #endif
                    118:                uid_poster = gid_poster = 0;
                    119: 
                    120: #ifndef FASTFORK
                    121:        num_groups = 0;
                    122:        num_groups = read_groups();     /* Read in the active file */
                    123: #else
                    124:        signal(SIGALRM, SIG_IGN);       /* Children don't deal with */
                    125:                                        /* these things */
                    126: #endif
                    127: 
                    128:        art_fp = NULL;
                    129:        argp = (char **) NULL;          /* for first time */
                    130: 
                    131:        (void) time(&clock);
                    132:        timeptr = ctime(&clock);
                    133:        if ((cp = index(timeptr, '\n')) != NULL)
                    134:                *cp = '\0';
                    135:        else
                    136:                timeptr = "Unknown date";
                    137: 
                    138:        printf("%d %s NNTP server version %s ready at %s (%s).\r\n",
                    139:                canpost ? OK_CANPOST : OK_NOPOST,
                    140:                host, version,
                    141:                timeptr,
                    142:                canpost ? "posting ok" : "no posting");
                    143:        (void) fflush(stdout);
                    144: 
                    145:        /*
                    146:         * Now get commands one at a time and execute the
                    147:         * appropriate routine to deal with them.
                    148:         */
                    149: 
                    150:        while (fgets(line, sizeof(line), stdin) != NULL) {
                    151: 
                    152:                cp = index(line, '\r');         /* Zap CR-LF */
                    153:                if (cp != NULL)
                    154:                        *cp = '\0';
                    155:                else {
                    156:                        cp = index(line, '\n');
                    157:                        if (cp != NULL)
                    158:                                *cp = '\0';
                    159:                }
                    160: 
                    161:                if ((argnum = parsit(line, &argp)) == 0)
                    162:                        continue;               /* Null command */
                    163:                else {
                    164:                        for (i = 0; i < NUMCMDS; ++i)
                    165:                                if (streql(cmdtbl[i].cmd_name, argp[0]))
                    166:                                        break;
                    167:                        if (i < NUMCMDS)
                    168:                                (*cmdtbl[i].cmd_fctn)(argnum, argp);
                    169:                        else {
                    170:                                if (streql(argp[0], "quit"))
                    171:                                        break;
                    172:                                printf("%d Command unrecognized.\r\n",
                    173:                                        ERR_COMMAND);
                    174:                                (void) fflush(stdout);
                    175:                        }
                    176:                }
                    177:        }
                    178: 
                    179:        printf("%d %s closing connection.  Goodbye.\r\n", OK_GOODBYE, host);
                    180:        (void) fflush(stdout);
                    181: 
                    182: #ifdef LOG
                    183:        if (getrusage(RUSAGE_SELF, &rusagebuf) < 0) {
                    184:                syslog(LOG_ERR, "getrusage RUSAGE_SELF: %m");
                    185:                syslog(LOG_INFO, "%s exit %d articles %d groups", hostname,
                    186:                        arts_acsd, grps_acsd);
                    187:        } else {
                    188:                syslog(LOG_INFO, "%s exit %d articles %d groups",
                    189:                        hostname,
                    190:                        arts_acsd,
                    191:                        grps_acsd);
                    192:                syslog(LOG_INFO, "%s times user %d system %d elapsed %ld",
                    193:                        hostname,
                    194:                        rusagebuf.ru_utime.tv_sec,
                    195:                        rusagebuf.ru_stime.tv_sec,
                    196:                        time((long *) 0) - clock);
                    197:        }
                    198: #endif
                    199:        exit(0);
                    200: }

unix.superglobalmegacorp.com

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