Metropoli BBS
VIEWER: changi.c MODE: TEXT (ASCII)
/*
 * This OS/2 port was hacked by Harald Kipp from the
 *
 *      Network News Transfer Protocol server
 *
 *      Phil Lapsley
 *      University of California, Berkeley
 *      Stan Barber
 *      Baylor College of Medicine
 *
 * Bug reports related to THIS modified version should be sent to
 *
 *  harald@os2point.ping.de
 *  harald@sesam.com
 *  Fido: 2:2448/434
 *
 * You may freely copy or redistribute this software. However,
 * this may not apply to any part of changi.
 */

#define OS2
#define INCL_DOSPROCESS
#include <os2.h>

#include <types.h>
#include <netinet\in.h>
#include <sys\socket.h>
#include <netlib.h>

#undef min
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <direct.h>
#include <process.h>

#include <version.h>
#include <tcpconn.h>
#include <chanlib.h>
#include <lprintf.h>
#include <readcfg.h>
#include <getopt.h>

#include "config.h"
#include "globals.h"
#include "changi.h"

int num_groups;
char historyfile[255];

/*
 * Locals
 */
static CFGITEM cfgitm[] = {
    { "access"    , 0, 4, cfg.accessfile     },
    { "actimes"   , 0, 4, cfg.active_times   },
    { "active"    , 0, 4, cfg.activefile     },
    { "control"   , 0, 4, NULL               },
    { "dupegroup" , 0, 4, NULL               },
    { "gunzip"    , 0, 4, NULL               },
    { "history"   , 0, 4, cfg.historyfile    },
    { "inews"     , 0, 4, cfg.inewscall      },
    { "junkgroup" , 0, 4, NULL               },
    { "mydomain"  , 0, 4, NULL               },
    { "mynode"    , 0, 4, NULL               },
    { "newsdir"   , 0, 4, cfg.newsdir        },
    { "newsserver", 0, 4, NULL               },
    { "rnews"     , 0, 4, cfg.rnewscall      },
    { "spooldir"  , 0, 4, NULL               },
    { "uncompress", 0, 4, NULL               }
};

static void usage(void);

/************************************************************************/
/*                                                                      */
/*                                                                      */
/************************************************************************/
int main(int argc, char **argv)
{
    unsigned short port = 119;		/* port server binds to                  */
    struct sockaddr_in server;		/* server address information            */
    int s;				/* socket for accepting connections      */
    int option;

    printf("\n        Changi NNTP Server version %s\n", version);
    printf("                       OS/2 nntpd port\n");
    printf("    written %s by Harald Kipp\n", __DATE__);
    printf("report bugs to harald@os2point.ping.de\n");
    printf("                      harald@sesam.com\n");
    printf("                       fido 2:2448/434\n\n");

    init_cfg();

    initexit();

    lopen(cfg.logfile);
    lprintf("Changi %s - %s", version, __TIMESTAMP__);

    while((option = getopt(argc,argv,"?a:c:d:i:n:r:y:")) != EOF) {
        char *cp;
        switch(option) {
        case 'a':
            strcpy(cfg.activefile, optarg);
            break;
        case 'c':
            strcpy(cfg.configfile, optarg);
            break;
        case 'd':
            cp = optarg;
            while(*cp) {
                switch(*cp) {
                case 'a':
                    cfg.logflg |= LOG_ACTIVE;
                    break;
                case 'd':
                    cfg.logflg |= LOG_DBM;
                    break;
                /*
                 * -df enables logfile flushing
                 */
                case 'f':
                    cfg.logflg |= LOG_FLUSH;
                    lflush(1);
                    break;
                /*
                 * Log received telegrams
                 */
                case 'r':
                    cfg.logflg |= LOG_RECV;
                    so_setlog(ENABLE_RLOG);
                    break;
                /*
                 * Log sent telegrams
                 */
                case 's':
                    cfg.logflg |= LOG_SEND;
                    so_setlog(ENABLE_SLOG);
                    break;

                default:
                    lprintf("Unknown option -d%c ignored", *cp);
                    break;
                }
                cp++;
            }
            break;
        case 'i':
            strcpy(cfg.inewscall, optarg);
            break;
        case 'n':
            strcpy(cfg.newsdir, optarg);
            break;
        case 'r':   /* ihave needs this */
            strcpy(cfg.rnewscall, optarg);
            break;
        case 'y':
            strcpy(cfg.historyfile, optarg);
            break;
        default:
            usage();
            return(1);
        }
    }

    ReadCfg(cfg.configfile, cfgitm, sizeof(cfgitm) / sizeof(CFGITEM));
    if(!validate_cfg())
	return (3);

    strcpy(historyfile, cfg.historyfile);

    sock_init();

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        lprintf("socket(): Error %d", errno);
	return (3);
    }

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;
    if (bind(s, (struct sockaddr *) & server, sizeof(server)) < 0) {
        lprintf("bind(): Error %d", errno);
	return (3);
    }

    if (listen(s, 5) != 0) {
        lprintf("listen(): Error %d", errno);
	return (3);
    }

    ClientThread(&s);
    for (;;)
	if (DosSleep(5000L))
	    break;

    soclose(s);
    lclose();

    return (0);
}

/************************************************************************/
/*                                                                      */
/*                                                                      */
/************************************************************************/
static void usage(void)
{
    puts("usage: changi [options]\n\n"
         "options:\n"
         "  -a<activefile>    active file (active)\n"
         "  -c<configfile>    configuration file (changi.cfg)\n"
         "  -d<log-flags>     logfile flags\n"
         "  -i<inewsprogram>  inews program call (inews)\n"
         "  -n<newsdir>       news home directory (news)\n"
         "  -r<rnewsprogram>  rnews program call (rnews)\n"
         "  -y<historyfile>   history file (history)\n\n"
         "logfile flags:\n"
         "  a  log active file processing\n"
         "  d  history file processing\n"
         "  f  flush logfile after each line\n"
         "  r  telegrams received\n"
         "  s  telegrams sent\n");
}
[ RETURN TO DIRECTORY ]