Metropoli BBS
VIEWER: ihave.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
 *
 */

#include <os2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <direct.h>

#include <lprintf.h>
#include <tcpconn.h>
#include <history.h>

#include <dbgheap.h>

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

#ifdef LOG
int ih_accepted;
int ih_rejected;
int ih_failed;
#endif

/*
 * IHAVE <messageid>
 *
 * Accept an article for transferral if we haven't seen it before.
 */
void ihave(PNEWSCLIENT pnc, int argc, char *argv[])
{
    int retcode;
    char *cp;
    FILE *fp;

    if (!pnc -> canxfer) {
	so_printf(pnc -> s, "%d You do not have transfer permission\r\n",
                  ERR_GOODBYE);
        lprintf("%s: Illegal transfer access", pnc->remotehost);
	return;
    }

    if (argc != 2) {
        so_printf(pnc -> s, "%d Usage: IHAVE <message-id>.\r\n", ERR_CMDSYN);
        lprintf("%s: Syntax error in ihave command", pnc->remotehost);
	return;
    }

    if(gethistart(cfg.historyfile, argv[1], NULL)) {
	so_printf(pnc -> s, "%d Got it.\r\n", ERR_GOTIT);
	return;
    }

    if((fp = _popen(cfg.rnewscall, "wb")) != NULL) {
        char *line = malloc(BUFSIZ);

        so_printf(pnc -> s, "%d Ok\r\n", CONT_XFER);
        for (;;) {
            if (recv_line(pnc -> s, line) <= 0)
                break;
            if ((cp = strchr(line, '\r')) != NULL)
                *cp = '\0';
            else if ((cp = strchr(line, '\n')) != NULL)
                *cp = '\0';

            if (line[0] == '.') {
                if (line[1] == '\0')
                    break;
                fprintf(fp, "%s\n", line + 1);
            }
            else
                fprintf(fp, "%s\n", line);
        }

        if((retcode = _pclose(fp)) != 0) {
            lprintf("%s returned %d", cfg.rnewscall, retcode);
            so_printf(pnc -> s, "%d Transfer failed.\r\n", ERR_XFERFAIL);
        }
        else
            so_printf(pnc -> s, "%d Thanks.\r\n", OK_XFERED);
        free(line);
    }
    else {
        so_printf(pnc -> s, "%d Failed to run %s.\r\n", ERR_XFERFAIL, cfg.rnewscall);
        lprintf("Failed to run %s", cfg.rnewscall);
    }
}
[ RETURN TO DIRECTORY ]