亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? art.c

?? 早期freebsd實現
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*  $Revision: 1.52 $****  Article-processing.*/#include "innd.h"#include "dbz.h"#include <sys/uio.h>typedef struct iovec	IOVEC;/***  A way to index into the header table.*/#define HDR(_x)		(ARTheaders[(_x)].Value)#if	defined(S_IXUSR)#define EXECUTE_BITS	(S_IXUSR | S_IXGRP | S_IXOTH)#else#define EXECUTE_BITS	0111#endif	/* defined(S_IXUSR) *//***  Mark that the site gets this article.*/#define SITEmark(sp_, ngp_) \    do { \	SITE	*funnel; \    \	sp_->Sendit = TRUE; \	if (sp_->ng == NULL) \	    sp_->ng = ngp_; \	if (sp_->Funnel != NOSITE) { \	    funnel = &Sites[sp_->Funnel]; \	    if (funnel->ng == NULL) \		funnel->ng = ngp_; \	} \    } while (JUSTONCE)/***  Header types.*/typedef enum _ARTHEADERTYPE {    HTreq,			/* Drop article if this is missing	*/    HTobs,			/* Delete this header if found		*/    HTstd			/* Standard optional header		*/} ARTHEADERTYPE;/***  Entry in the header table.*/typedef struct _ARTHEADER {    STRING		Name;    ARTHEADERTYPE	Type;    int			Size;			/* Length of Name	*/    char		*Value;    int			Length;			/* Length of Value	*/    int			Found;    BOOL		Allocated;} ARTHEADER;/***  For speed we build a binary tree of the headers, sorted by their**  name.  We also store the header's Name fields in the tree to avoid**  doing an extra indirection.*/typedef struct _TREE {    STRING		Name;    ARTHEADER		*Header;    struct _TREE	*Before;    struct _TREE	*After;} TREE;STATIC TREE		*ARTheadertree;/***  For doing the overview database, we keep a list of the headers and**  a flag saying if they're written in brief or full format.*/typedef struct _ARTOVERFIELD {    ARTHEADER		*Header;    BOOL		NeedHeader;} ARTOVERFIELD;STATIC ARTOVERFIELD		*ARTfields;/***  General newsgroup we care about, and what we put in the Path line.*/STATIC char		ARTctl[] = "control";STATIC char		ARTjnk[] = "junk";STATIC char		*ARTpathme;/***  Flag array, indexed by character.  Character classes for Message-ID's.*/STATIC char		ARTcclass[256];#define CC_MSGID_ATOM	01#define CC_MSGID_NORM	02#define CC_HOSTNAME	04#define ARTnormchar(c)	((ARTcclass[(c)] & CC_MSGID_NORM) != 0)#define ARTatomchar(c)	((ARTcclass[(c)] & CC_MSGID_ATOM) != 0)#define ARThostchar(c)	((ARTcclass[(c)] & CC_HOSTNAME) != 0)/***  The header table.  Not necessarily sorted, but the first character**  must be uppercase.*/STATIC ARTHEADER	ARTheaders[] = {    /*	Name			Type	... */    {	"Approved",		HTstd },#define _approved		 0    {	"Control",		HTstd },#define _control		 1    {	"Date",			HTreq },#define _date			 2    {	"Distribution",		HTstd },#define _distribution		 3    {	"Expires",		HTstd },#define _expires		 4    {	"From",			HTreq },#define _from			 5    {	"Lines",		HTstd },#define _lines			 6    {	"Message-ID",		HTreq },#define _message_id		 7    {	"Newsgroups",		HTreq },#define _newsgroups		 8    {	"Path",			HTreq },#define _path			 9    {	"Reply-To",		HTstd },#define _reply_to		10    {	"Sender",		HTstd },#define _sender			11    {	"Subject",		HTreq },#define _subject		12    {	"Supersedes",		HTstd },#define _supersedes		13    {	"Bytes",		HTstd },#define _bytes			14    {	"Also-Control",		HTstd },#define _alsocontrol		15    {	"References",		HTstd },#define _references		16    {	"Xref",			HTobs },#define _xref			17    {	"Date-Received",	HTobs },    {	"Posted",		HTobs },    {	"Posting-Version",	HTobs },    {	"Received",		HTobs },    {	"Relay-Version",	HTobs },};/****/BOOLARTreadschema(){    static char			SCHEMA[] = _PATH_SCHEMA;    register FILE		*F;    register int		i;    register char		*p;    register ARTOVERFIELD	*fp;    register ARTHEADER		*hp;    BOOL			ok;    char			buff[SMBUF];    if (ARTfields != NULL) {	DISPOSE(ARTfields);	ARTfields = NULL;    }    /* Open file, count lines. */    if ((F = fopen(SCHEMA, "r")) == NULL)	return FALSE;    for (i = 0; fgets(buff, sizeof buff, F) != NULL; i++)	continue;    (void)fseek(F, (OFFSET_T)0, SEEK_SET);    ARTfields = NEW(ARTOVERFIELD, i + 1);    /* Parse each field. */    for (ok = TRUE, fp = ARTfields; fgets(buff, sizeof buff, F) != NULL; ) {	/* Ignore blank and comment lines. */	if ((p = strchr(buff, '\n')) != NULL)	    *p = '\0';	if ((p = strchr(buff, COMMENT_CHAR)) != NULL)	    *p = '\0';	if (buff[0] == '\0')	    continue;	if ((p = strchr(buff, ':')) != NULL) {	    *p++ = '\0';	    fp->NeedHeader = EQ(p, "full");	}	else	    fp->NeedHeader = FALSE;	for (hp = ARTheaders; hp < ENDOF(ARTheaders); hp++)	    if (EQ(buff, hp->Name)) {		fp->Header = hp;		break;	    }	if (hp == ENDOF(ARTheaders)) {	    syslog(L_ERROR, "%s bad_schema unknown header \"%s\"", buff);	    ok = FALSE;	    continue;	}	fp++;    }    fp->Header = NULL;    (void)fclose(F);    return ok;}/***  Build a balanced tree for the headers in subscript range [lo..hi).**  This only gets called once, and the tree only has about 20 entries,**  so we don't bother to unroll the recursion.*/static TREE *ARTbuildtree(Table, lo, hi)    ARTHEADER	**Table;    int		lo;    int		hi;{    int		mid;    TREE	*tp;    mid = lo + (hi - lo) / 2;    tp = NEW(TREE, 1);    tp->Header = Table[mid];    tp->Name = tp->Header->Name;    if (mid == lo)	tp->Before = NULL;    else	tp->Before = ARTbuildtree(Table, lo, mid);    if (mid == hi - 1)	tp->After = NULL;    else	tp->After = ARTbuildtree(Table, mid + 1, hi);    return tp;}/***  Sorting predicate for qsort call in ARTsetup.*/STATIC intARTcompare(p1, p2)    POINTER	p1;    POINTER	p2;{    ARTHEADER	**h1;    ARTHEADER	**h2;    h1 = CAST(ARTHEADER**, p1);    h2 = CAST(ARTHEADER**, p2);    return strcasecmp(h1[0]->Name, h2[0]->Name);}/***  Setup the article processing.*/voidARTsetup(){    register STRING	p;    register ARTHEADER	*hp;    ARTHEADER		**table;    register int	i;    /* Set up the character class tables.  These are written a     * little strangely to work around a GCC2.0 bug. */    (void)memset((POINTER)ARTcclass, 0, sizeof ARTcclass);    p = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";    while ((i = *p++) != 0) {        ARTcclass[i] = CC_HOSTNAME | CC_MSGID_ATOM | CC_MSGID_NORM;    }    p = "!#$%&'*+-/=?^_`{|}~";    while ((i = *p++) != 0) {	ARTcclass[i] = CC_MSGID_ATOM | CC_MSGID_NORM;    }    p = "\"(),.:;<@[\\]";    while ((i = *p++) != 0) {	ARTcclass[i] = CC_MSGID_NORM;    }    /* The RFC's don't require it, but we add underscore to the list of valid     * hostname characters. */    ARTcclass['.'] |= CC_HOSTNAME;    ARTcclass['-'] |= CC_HOSTNAME;    ARTcclass['_'] |= CC_HOSTNAME;    /* Allocate space in the header table. */    for (hp = ARTheaders; hp < ENDOF(ARTheaders); hp++) {	hp->Size = strlen(hp->Name);	hp->Allocated = hp->Value == NULL && hp->Type != HTobs			&& hp != &ARTheaders[_bytes];	if (hp->Allocated)	    hp->Value = NEW(char, MAXHEADERSIZE + 1);    }    /* Build the header tree. */    table = NEW(ARTHEADER*, SIZEOF(ARTheaders));    for (i = 0; i < SIZEOF(ARTheaders); i++)	table[i] = &ARTheaders[i];    qsort((POINTER)table, SIZEOF(ARTheaders), sizeof *table, ARTcompare);    ARTheadertree = ARTbuildtree(table, 0, SIZEOF(ARTheaders));    DISPOSE(table);    /* Get our Path name, kill trailing !. */    ARTpathme = COPY(Path.Data);    ARTpathme[Path.Used - 1] = '\0';    /* Set up database; ignore errors. */    (void)ARTreadschema();}STATIC voidARTfreetree(tp)    TREE	*tp;{    TREE	*next;    for ( ; tp != NULL; tp = next) {	if (tp->Before)	    ARTfreetree(tp->Before);	next = tp->After;	DISPOSE(tp);    }}voidARTclose(){    register ARTHEADER	*hp;    /* Free space in the header table. */    for (hp = ARTheaders; hp < ENDOF(ARTheaders); hp++)	if (hp->Allocated)	    DISPOSE(hp->Value);    if (ARTfields != NULL) {	DISPOSE(ARTfields);	ARTfields = NULL;    }    ARTfreetree(ARTheadertree);}/***  Read in a file, return a pointer to static space that is reused.*/STATIC char *ARTreadfile(name)    char		*name;{    static BUFFER	File;    struct stat		Sb;    int			fd;    int			oerrno;    /* Open the file, get its size. */    if ((fd = open(name, O_RDONLY)) < 0)	return NULL;    if (fstat(fd, &Sb) < 0) {	oerrno = errno;	(void)close(fd);	errno = oerrno;	return NULL;    }    /* Make sure we have enough space. */    if (File.Size == 0) {	File.Size = Sb.st_size;	File.Data = NEW(char, File.Size + 1);    }    else if (File.Size <= Sb.st_size) {	File.Size = Sb.st_size + 16;	RENEW(File.Data, char, File.Size + 1);    }    /* Read in the file. */    if (xread(fd, File.Data, Sb.st_size) < 0) {	oerrno = errno;	(void)close(fd);	errno = oerrno;	return NULL;    }    /* Clean up and return the data. */    File.Data[Sb.st_size] = '\0';    (void)close(fd);    return File.Data;}/***  Open the article file and return a copy of it.  The files parameter is**  actually a whitespace-separated list of names.*/char *ARTreadarticle(files)    register char	*files;{    register char	*p;    register BOOL	more;    char		*art;    if (files == NULL)	return NULL;    /* Loop over all filenames until we can open one. */    for ( ; *files; files = p + 1) {	/* Snip off next name, turn dots to slashes. */	for (p = files; ISWHITE(*p); p++)	    continue;	for (files = p; *p && *p != ' '; p++)	    if (*p == '.')		*p = '/';	more = *p == ' ';	if (more)	    *p = '\0';	art = ARTreadfile(files);	if (more)	    *p = ' ';	if (art != NULL)	    return art;	if (!more)	    break;    }    return NULL;}/***  Open the article file and return a copy of the headers.*/char *ARTreadheader(files)    char		*files;{    register char	*p;    register char	*head;    if ((head = ARTreadarticle(files)) == NULL)	return NULL;    /* Find \n\n which means the end of the header. */    for (p = head; (p = strchr(p, '\n')) != NULL; p++)	if (p[1] == '\n') {	    p[1] = '\0';	    return head;	}    syslog(L_NOTICE, "%s bad_article %s is all headers", LogName, files);    DISPOSE(head);    return NULL;}/***  Parse a Path line, splitting it up into NULL-terminated array of strings.**  The argument is modified!*/STATIC char **ARTparsepath(p, countp)    register char	*p;    int			*countp;{    static char		*NULLPATH[1] = { NULL };    static int		oldlength;    static char		**hosts;    register int	i;    register char	**hp;    /* We can be called with a non-existant or empty path. */    if (p == NULL || *p == '\0') {	*countp = 0;	return NULLPATH;    }    /* Get an array of character pointers. */    i = strlen(p);    if (hosts == NULL) {	oldlength = i;	hosts = NEW(char*, oldlength + 1);    }    else if (oldlength <= i) {	oldlength = i;	RENEW(hosts, char*, oldlength + 1);    }    /* Loop over text. */    for (hp = hosts; *p; *p++ = '\0') {	/* Skip leading separators. */	for (; *p && !ARThostchar(*p); p++)	    continue;	if (*p == '\0')	    break;	/* Mark the start of the host, move to the end of it. */	for (*hp++ = p; *p && ARThostchar(*p); p++)	    continue;	if (*p == '\0')	    break;    }    *hp = NULL;    *countp = hp - hosts;    return hosts;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡视频在线看| 欧美探花视频资源| 亚洲卡通动漫在线| 欧美一区二区不卡视频| 国产91精品入口| 亚洲线精品一区二区三区八戒| 日韩欧美你懂的| 国产精品系列在线观看| 一区二区三区四区亚洲| 精品国产3级a| 91久久国产最好的精华液| 久久精品99久久久| 一区二区三区在线观看欧美| 精品国产乱码久久| 在线免费亚洲电影| 国产精品综合av一区二区国产馆| 一区二区三区美女视频| 国产亚洲欧美日韩日本| 欧美日韩一区二区三区不卡| 国产美女精品人人做人人爽| 亚洲已满18点击进入久久| 欧美激情综合网| 欧美一区二区三区在线看| 91天堂素人约啪| 国产乱码字幕精品高清av| 亚洲午夜精品在线| 国产精品国产三级国产专播品爱网 | 91精品欧美久久久久久动漫| 99国产精品一区| 国产夫妻精品视频| 久久精品国产99| 视频一区二区不卡| 亚洲综合无码一区二区| 欧美白人最猛性xxxxx69交| 欧美亚洲国产bt| 91小宝寻花一区二区三区| 成人免费毛片高清视频| 综合久久久久综合| 日韩欧美国产午夜精品| 91黄色免费网站| av一区二区不卡| 成人黄色777网| 成人99免费视频| 成人永久看片免费视频天堂| 国产在线日韩欧美| 国产乱码精品一区二区三区忘忧草| 青青草国产成人99久久| 香蕉av福利精品导航| 一区二区三区视频在线观看| 亚洲精品自拍动漫在线| 亚洲综合清纯丝袜自拍| 亚洲一区二区欧美日韩| 偷偷要91色婷婷| 免费观看一级特黄欧美大片| 免费成人在线观看视频| 三级欧美在线一区| 免费成人在线播放| 国产高清在线精品| 99久久综合国产精品| 色嗨嗨av一区二区三区| 欧美日本一道本在线视频| 日韩精品中文字幕在线不卡尤物 | 国产欧美日产一区| 国产精品色呦呦| 亚洲欧美另类在线| 偷拍亚洲欧洲综合| 美日韩一区二区三区| 国产高清亚洲一区| 91高清视频在线| 8x8x8国产精品| 久久精品一区蜜桃臀影院| 国产精品理伦片| 亚洲乱码日产精品bd| 日韩av电影免费观看高清完整版 | 亚洲精品在线网站| 国产欧美精品一区| 一区二区在线看| 男女性色大片免费观看一区二区| 国产精品18久久久久久vr| 99精品视频在线播放观看| 欧美日韩国产首页在线观看| 久久蜜桃av一区精品变态类天堂| 亚洲欧洲av一区二区三区久久| 亚洲午夜私人影院| 国产福利一区二区三区视频| 在线亚洲一区二区| 精品欧美久久久| 一片黄亚洲嫩模| 国产一区二区精品久久| 91久久精品国产91性色tv| 久久婷婷色综合| 亚洲国产三级在线| 国产高清在线观看免费不卡| 欧美日韩一二区| 国产精品青草久久| 精品在线一区二区| 欧美性猛交xxxxxx富婆| 欧美高清在线视频| 免费久久精品视频| 在线观看免费成人| 国产精品午夜免费| 国内精品久久久久影院色| 欧美亚一区二区| 亚洲欧美中日韩| 国产精品一区免费在线观看| 91麻豆精品久久久久蜜臀| 亚洲欧美另类小说| 成人动漫一区二区| 精品国产sm最大网站免费看| 丝袜亚洲另类欧美| 91黄色小视频| 自拍偷拍国产亚洲| 国产成人免费在线| 精品剧情v国产在线观看在线| 亚洲成人资源在线| 99视频在线精品| 亚洲国产成人私人影院tom| 久久99精品国产| 欧美精品在线一区二区| 亚洲制服欧美中文字幕中文字幕| gogo大胆日本视频一区| 国产欧美一区二区精品久导航| 久久精品二区亚洲w码| 欧美三区免费完整视频在线观看| 中文字幕一区在线观看视频| 国产精品888| 国产亚洲综合性久久久影院| 极品美女销魂一区二区三区| 日韩三级视频在线看| 午夜电影网一区| 欧美日韩精品综合在线| 玉米视频成人免费看| 欧美在线制服丝袜| 亚洲精品久久久久久国产精华液| 91在线免费播放| 国产精品国产精品国产专区不片| 国产91清纯白嫩初高中在线观看| 久久久精品中文字幕麻豆发布| 激情综合色播激情啊| 精品盗摄一区二区三区| 国产一区二区网址| 国产日韩欧美制服另类| 国产aⅴ综合色| 国产精品卡一卡二| a4yy欧美一区二区三区| 亚洲免费视频中文字幕| 91毛片在线观看| 亚洲高清在线视频| 欧美一区二区在线观看| 韩国精品久久久| 国产精品嫩草99a| 色噜噜久久综合| 亚洲国产日产av| 日韩欧美在线影院| 韩国一区二区三区| 国产精品久久久久久久久免费丝袜| 99久久免费视频.com| 亚洲精品久久久久久国产精华液| 欧美日韩精品一区二区三区四区| 欧美96一区二区免费视频| 久久你懂得1024| 91网页版在线| 三级影片在线观看欧美日韩一区二区 | 日韩一区二区三区视频在线 | 在线精品视频一区二区三四| 日韩高清不卡一区二区| 久久人人爽人人爽| 9i看片成人免费高清| 天堂一区二区在线| www激情久久| 91高清在线观看| 久久9热精品视频| 中文字幕在线不卡国产视频| 欧美男男青年gay1069videost | 午夜精品视频在线观看| 精品国内片67194| 色综合久久久久久久久| 日本欧美一区二区三区乱码| 日本一区二区成人在线| 欧美日韩在线播| 国产福利91精品一区二区三区| 曰韩精品一区二区| 久久亚洲一级片| 欧美视频日韩视频在线观看| 国产在线乱码一区二区三区| 亚洲综合免费观看高清完整版| 精品国产露脸精彩对白| 色婷婷亚洲精品| 国内精品久久久久影院薰衣草 | aaa亚洲精品| 久久精品久久99精品久久| 中文字幕一区在线| 精品久久久影院| 欧美日韩视频第一区| 国产成人鲁色资源国产91色综| 亚洲国产精品一区二区尤物区| 国产亚洲精品资源在线26u| 欧美日韩国产精品自在自线| 成人国产精品免费观看动漫| 日本成人超碰在线观看|