⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nntp.c

📁 早期freebsd实现
💻 C
字号:
/* $Id: nntp.c,v 3.0 1991/11/22 04:12:21 davison Trn $*/#include "EXTERN.h"#include "common.h"#include "util.h"#include "init.h"#include "trn.h"#include "ngdata.h"#include "rcln.h"#include "cache.h"#include "bits.h"#include "head.h"#include "final.h"#include "nntp.h"#ifdef USE_NNTP/* try to access the specified group */boolnntp_group(group)char *group;{    sprintf(ser_line, "GROUP %s", group);    nntp_command(ser_line);    if (nntp_check(FALSE) != NNTP_CLASS_OK) {	int ser_int = atoi(ser_line);	if (ser_int != NNTP_NOSUCHGROUP_VAL	 && ser_int != NNTP_SYNTAX_VAL) {	    if (ser_int != NNTP_AUTH_NEEDED_VAL && ser_int != NNTP_ACCESS_VAL	     && ser_int != NNTP_AUTH_REJECT_VAL) {		fprintf(stderr, "\nServer's response to GROUP %s:\n%s\n",			group, ser_line);		finalize(1);	    }	}	return FALSE;    }    return TRUE;}/* check on an article's existence */boolnntp_stat(artnum)ART_NUM artnum;{    sprintf(ser_line, "STAT %ld", (long)artnum);    nntp_command(ser_line);		/* ask the server for the header */    return (nntp_check(TRUE) == NNTP_CLASS_OK);}/* prepare to get the header */boolnntp_header(artnum)ART_NUM artnum;{    sprintf(ser_line, "HEAD %ld", (long)artnum);    nntp_command(ser_line);		/* ask the server for the header */    return (nntp_check(TRUE) == NNTP_CLASS_OK);}/* copy the body of an article to a temporary file */FILE *nntp_body(artnum)ART_NUM artnum;{    char *artname;    FILE *fp;    if (!parseheader(artnum))	return Nullfp;    artname = nntp_artname();    if (!(fp = fopen(artname, "w+"))) {	fprintf(stderr, "\nUnable to write temporary file: '%s'.\n",		artname);	finalize(1);    }    sprintf(ser_line, "BODY %ld", (long)artnum);    nntp_command(ser_line);		/* ask the server for the article */    if (nntp_check(TRUE) != NNTP_CLASS_OK) {	/* and get it's reaction */	fclose(fp);	errno = ENOENT;			/* Simulate file-not-found */	return Nullfp;    }    fwrite(headbuf, 1, strlen(headbuf), fp);    for (;;) {	nntp_gets(ser_line, sizeof ser_line);	if (ser_line[0] == '.' && ser_line[1] == '\0')	    break;	fputs((ser_line[0] == '.' ? ser_line + 1 : ser_line), fp);	putc('\n', fp);    }    fseek(fp, 0L, 0);    return fp;}/* This is a 1-relative list */static int maxdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };time_tnntp_time(){    char *s;    int year, month, day, hh, mm, ss;#ifdef DEBUG    struct tm *ts;    char ch;#endif    nntp_command("DATE");    if (nntp_check(FALSE) != NNTP_CLASS_INF)	return time((time_t*)NULL);    s = ser_line + strlen(ser_line) - 1;    ss = (*s - '0') + (*--s - '0') * 10;    mm = (*--s - '0') + (*--s - '0') * 10;    hh = (*--s - '0') + (*--s - '0') * 10;    day = (*--s - '0') + (*--s - '0') * 10;    month = (*--s - '0') + (*--s - '0') * 10;#ifdef DEBUG    ch = *s;#endif    *s = '\0';    year = atoi(s-4);#ifdef DEBUG    *s = ch;#endif    /* This simple algorithm will be valid until the year 2400 */    if (year % 4)	maxdays[2] = 28;    else	maxdays[2] = 29;    if (month < 1 || month > 12 || day < 1 || day > maxdays[month]     || hh < 0 || hh > 23 || mm < 0 || mm > 59     || ss < 0 || ss > 59)	return time((time_t*)NULL);    for (month--; month; month--)	day += maxdays[month];    ss = ((((year-1970) * 365 + (year-1968)/4 + day - 1) * 24L + hh) * 60	  + mm) * 60 + ss;#ifdef DEBUG    ts = gmtime(&ss);    sprintf(buf,"19%02d%02d%02d%02d%02d%02d",	    ts->tm_year % 100, ts->tm_mon+1, ts->tm_mday,	    ts->tm_hour, ts->tm_min, ts->tm_sec) FLUSH;    if (strNE(ser_line+4,buf))	printf("\n** Tell Wayne:  %s != %s **\n",ser_line+4,buf);#endif    return ss;}boolnntp_newgroups(t)time_t t;{    struct tm *ts;    ts = gmtime(&t);    sprintf(ser_line, "NEWGROUPS %02d%02d%02d %02d%02d%02d GMT",	ts->tm_year % 100, ts->tm_mon+1, ts->tm_mday,	ts->tm_hour, ts->tm_min, ts->tm_sec);    nntp_command(ser_line);    return (nntp_check(TRUE) == NNTP_CLASS_OK);}boolnntp_listgroup(){    static bool listgroup_works = TRUE;    if (!listgroup_works)	return FALSE;    nntp_command("LISTGROUP");    if (nntp_check(FALSE) != NNTP_CLASS_OK) {	listgroup_works = FALSE;	return FALSE;    }    return TRUE;}/* similar to nntp_gets, but will make the buffer bigger if necessary */char *nntp_get_a_line(original_buffer,buffer_length)char *original_buffer;register int buffer_length;{    register int bufix = 0;    register int nextch;    register char *some_buffer_or_other = original_buffer;    do {	if (bufix >= buffer_length) {	    buffer_length *= 2;	    if (some_buffer_or_other == original_buffer) {					/* currently static? */		some_buffer_or_other = safemalloc((MEM_SIZE)buffer_length+1);		strncpy(some_buffer_or_other,original_buffer,buffer_length/2);					/* so we must copy it */	    }	    else {			/* just grow in place, if possible */		some_buffer_or_other = saferealloc(some_buffer_or_other,		    (MEM_SIZE)buffer_length+1);	    }	}	if ((nextch = getc(ser_rd_fp)) == EOF)	    return Nullch;	some_buffer_or_other[bufix++] = (char) nextch;    } while (nextch && nextch != '\n');    some_buffer_or_other[bufix] = '\0';    len_last_line_got = bufix;    buflen_last_line_got = buffer_length;    return some_buffer_or_other;}char *nntp_artname(){    static char artname[20];    sprintf(artname,"rrn.%ld",our_pid);    return artname;}/* cleanup the odds and ends associated with NNTP usage */voidnntp_cleanup(){    UNLINK(nntp_artname());    if (*active_name)	UNLINK(active_name);    nntp_close();}#ifdef USE_XTHREADstatic long rawbytes = -1;	/* bytes remaining to be transfered *//* nntp_readcheck -- get a line of text from the server, interpreting** it as a status message for a binary command.  Call this once** before calling nntp_read() for the actual data transfer.*/longnntp_readcheck(){    /* try to get the status line and the status code */    if (nntp_check(FALSE) != NNTP_CLASS_OK)	return rawbytes = -1;    /* try to get the number of bytes being transfered */    if (sscanf(ser_line, "%*d%ld", &rawbytes) != 1)	return rawbytes = -1;    return rawbytes;}/* nntp_read -- read data from the server in binary format.  This call must** be preceeded by an appropriate binary command and an nntp_readcheck call.*/longnntp_read(buf, n)char *buf;long n;{    /* if no bytes to read, then just return EOF */    if (rawbytes < 0)	return 0;#ifdef HAS_SIGHOLD    sighold(SIGINT);#endif    /* try to read some data from the server */    if (rawbytes) {	n = fread(buf, 1, n > rawbytes ? rawbytes : n, ser_rd_fp);	rawbytes -= n;    } else	n = 0;    /* if no more left, then fetch the end-of-command signature */    if (!rawbytes) {	char buf[5];	/* "\r\n.\r\n" */	fread(buf, 1, 5, ser_rd_fp);	rawbytes = -1;    }#ifdef HAS_SIGHOLD    sigrelse(SIGINT);#endif    return n;}#endif /* USE_XTHREAD */#endif /* USE_NNTP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -