/* * 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 * */ #define OS2 #include #include #include #include #include #include #undef min #include #include #include #include #include #include #include #include "config.h" #include "globals.h" #include "nntp.h" #include "changi.h" static struct cmdent { char *cmd_name; int authreq; /* 0=none,1=userpass */ void (*cmd_fctn) (PNEWSCLIENT, int, char **); } cmdtbl[]= { #ifdef AUTH "authcap", 0, doauth, "authinfo", 0, doauth, "authsys", 0, doauth, #endif "article", 0, ahbs, "body", 0, ahbs, "date", 0, dodate, "group", 0, group, "head", 0, ahbs, "help", 0, help, "ihave", 1, ihave, "last", 0, nextlast, "list", 0, list, "listgroup", 0, listgroup, "mode", 0, ignore, "newgroups", 0, newgroups, "newnews", 0, newnews, "next", 0, nextlast, "post", 1, post, "slave", 0, slave, "stat", 0, ahbs, "xhdr", 0, xhdr, "xover", 0, doxover, #ifdef XINDEX "xindex", 0, xindex, #endif #ifdef XTHREAD "xthread", 0, xthread, #endif }; #define NUMCMDS (sizeof(cmdtbl) / sizeof(struct cmdent)) /************************************************************************/ /* */ /* */ /************************************************************************/ VOID _cdecl ClientThread(int *ps) { PNEWSCLIENT pnc; char buf[BUFSIZ]; /* buffer for sending and receiving * data */ struct sockaddr_in client; /* client address information */ struct hostent *hp = NULL; /* client host entry */ int ns; /* socket connected to client */ int namelen; /* length of client name */ char **argp = NULL; int argnum, i; namelen = sizeof(client); if ((ns = accept(*ps, (struct sockaddr *) & client, &namelen)) == -1) { lprintf("accept(): Error %d", errno); return; } pnc = memset(malloc(sizeof(NEWSCLIENT)), 0, sizeof(NEWSCLIENT)); pnc -> s = ns; /* * Get remote name */ if(cfg.accessfile[0]) hp = gethostbyaddr((char *)&client.sin_addr, sizeof (struct in_addr), AF_INET); strncpy(pnc->remotehost, hp ? (hp->h_name) : inet_ntoa(client.sin_addr), sizeof(pnc->remotehost) - 1); lprintf("Client at %s connected", pnc->remotehost); /* * Set access rights */ if(cfg.accessfile[0]) host_access(pnc); else pnc -> canpost = pnc -> canread = pnc -> canxfer = 1; _beginthread(ClientThread, NULL, 12288, ps); if(!pnc->canread && !pnc->canxfer) { lprintf("Refusing to talk to %s", pnc->remotehost); so_printf(ns, "%d NNTP server can't talk to you. Goodbye.\r\n", ERR_ACCESS); lprintf("%s: *!*!* ILLEGAL ACCESS *!*!*", pnc->remotehost); } /* * Send greeting banner */ else if (so_printf(ns, "%d Changi OS/2 NNTP server ready (%s).\r\n", pnc -> canpost ? OK_CANPOST : OK_NOPOST, pnc -> canpost ? "posting ok" : "no posting") != -1) { /* * Loop for command input and processing */ for (;;) { if (recv_line(ns, buf) <= 0) break; if ((argnum = parsit(buf, &argp)) == 0) continue; if (!stricmp(argp[0], "quit")) break; for (i = 0; i < NUMCMDS; ++i) if (!stricmp(cmdtbl[i].cmd_name, argp[0])) break; if (i < NUMCMDS) (*cmdtbl[i].cmd_fctn) (pnc, argnum, argp); else { lprintf("%s: Command %s unrecognized.", pnc->remotehost, argp[0]); if (so_printf(ns, "%d Command unrecognized.\r\n", ERR_COMMAND) == -1) break; } } so_printf(ns, "%d Closing connection. Goodbye.\r\n", OK_GOODBYE); } lprintf("Client at %s disconnected", pnc->remotehost); soclose(ns); if(pnc->art_fp) fclose(pnc->art_fp); if(pnc->ngpermlist) { for (i = 0; pnc->ngpermlist[i]; i++) free(pnc->ngpermlist[i]); free(pnc->ngpermlist); } if(pnc->dist_list) { for (i = 0; pnc->dist_list[i]; i++) free(pnc->dist_list[i]); free(pnc->dist_list); } if(pnc->nglist) { for (i = 0; pnc->nglist[i]; i++) free(pnc->nglist[i]); free(pnc->nglist); } free(pnc); if(argp) { for (i = 0; argp[i]; i++) free(argp[i]); free(argp); } } /************************************************************************/ /* */ /* */ /************************************************************************/ void ignore(PNEWSCLIENT pnc, int argc, char *argv[]) { lprintf("Command ignored: %s %s %s", argv[0], argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : ""); so_puts(pnc -> s, "500 command recognized but not applicable.\r\n"); if (argc && argv) ; }