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

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

?? art.c

?? 早期freebsd實現
?? C
?? 第 1 頁 / 共 4 頁
字號:
/***  Write an article using writev.  The article is split into pieces,**  shown below separated by pipe signs.  The items in square brackets are**  "inserted" by this routine.**	|headers...**	Path: |[Path.Data]|rest of path...**	headers...**	|[Lines header, if needed]|**	|[Xref header]|****	Article body.**  Also, the Data->Size field is filled in.*/STATIC intARTwrite(name, Article, Data, CrossPosted)    char		*name;    BUFFER		*Article;    ARTDATA		*Data;    BOOL		CrossPosted;{    static char		WHEN[] = "article";    static char		NL[] = "\n";    static BUFFER	Headers;    register int	fd;    register IOVEC	*vp;    register long	size;    register char	*p;    IOVEC		iov[7];    IOVEC		*end;    char		bytesbuff[SMBUF];    int			i;    if ((p = HeaderFind(Article->Data, "Path", 4)) == NULL     || p == Article->Data) {	/* This should not happen. */	syslog(L_ERROR, "%s internal %s no Path header",	    Data->MessageID, LogName);	return -1;    }    /* Open the file. */    if ((fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, ARTFILE_MODE)) < 0) {	if (errno != ENOENT)	    IOError(WHEN);	return -1;    }    /* Set up the scatter/gather vectors. */    vp = iov;    size = 0;    vp->iov_base = Article->Data;    vp->iov_len  = p - Article->Data;    size += (vp++)->iov_len;    vp->iov_base = Path.Data;    vp->iov_len  = Path.Used;    size += (vp++)->iov_len;    vp->iov_base = p;    vp->iov_len  = Data->Body - p;    size += (vp++)->iov_len;    if (ARTheaders[_lines].Found == 0) {	(void)sprintf(Data->Lines, "Lines: %d\n", Data->LinesValue);	i = strlen(Data->Lines);	vp->iov_base = Data->Lines;	(vp++)->iov_len  = i;	size += i;	/* Install in header table; STRLEN("Lines: ") == 7. */	(void)strcpy(ARTheaders[_lines].Value, Data->Lines + 7);	ARTheaders[_lines].Length = i - 7;	ARTheaders[_lines].Found = 1;    }    if (CrossPosted) {	/* Install in header table; STRLEN("Xref: ") == 6. */	HDR(_xref) = Xref.Data + 6;	ARTheaders[_xref].Length = Xref.Used - 6;	ARTheaders[_xref].Found = 1;	vp->iov_base = Xref.Data;	vp->iov_len  = Xref.Used;	size += (vp++)->iov_len;    }    end = vp;    vp->iov_base = NL;    vp->iov_len  = 1;    size += (vp++)->iov_len;    vp->iov_base = Data->Body;    vp->iov_len  = &Article->Data[Article->Used] - Data->Body;    size += (vp++)->iov_len;    Data->SizeValue = size;    (void)sprintf(Data->Size, "%ld", Data->SizeValue);    Data->SizeLength = strlen(Data->Size);    HDR(_bytes) = Data->Size;    ARTheaders[_bytes].Length = Data->SizeLength;    ARTheaders[_bytes].Found = 1;    /* Now do the write. */    if (xwritev(fd, iov, vp - iov) < 0) {	IOError(WHEN);	syslog(L_ERROR, "%s cant write %s %m", LogName, name);	(void)close(fd);	if (unlink(name) < 0 && errno != ENOENT) {	    IOError(WHEN);	    syslog(L_ERROR, "%s cant unlink %s %m", LogName, name);	}	return -1;    }    if (close(fd) < 0) {	IOError(WHEN);	syslog(L_ERROR, "%s cant close %s %m", LogName, name);	if (unlink(name) < 0 && errno != ENOENT) {	    IOError(WHEN);	    syslog(L_ERROR, "%s cant unlink %s %m", LogName, name);	}	return -1;    }    /* Set the owner. */    if (AmRoot)	xchown(name);    /* Need the header data? */    if (!NeedHeaders)	return 0;    /* Figure out how much space we'll need and get it. */    (void)sprintf(bytesbuff, "Bytes: %ld\n", size);    for (i = strlen(bytesbuff), vp = iov; vp < end; vp++)      i += vp->iov_len;    if (!CrossPosted)      i += Xref.Used;    if (Headers.Data == NULL) {	Headers.Size = i;	Headers.Data = NEW(char, Headers.Size + 1);    }    else if (Headers.Size <= i) {	Headers.Size = i;	RENEW(Headers.Data, char, Headers.Size + 1);    }    /* Add the data. */    BUFFset(&Headers, bytesbuff, strlen(bytesbuff));    if (!CrossPosted)	BUFFappend(&Headers, Xref.Data, Xref.Used);    for (vp = iov; vp < end; vp++)	BUFFappend(&Headers, vp->iov_base, vp->iov_len);    Data->Headers = &Headers;    return 0;}/***  Parse a header that starts at in, copying it to out.  Return pointer to**  the start of the next header and fill in *deltap with what should**  get added to the output pointer.  (This nicely lets us clobber obsolete**  headers by setting it to zero.)*/STATIC char *ARTparseheader(in, out, deltap, errorp)    register char	*in;    register char	*out;    int			*deltap;    STRING		*errorp;{    static char		buff[SMBUF];    static char		COLONSPACE[] = "No colon-space in \"%s\" header";    register char	*start;    register TREE	*tp;    register ARTHEADER	*hp;    register char	c;    register char	*p;    register char	*dest;    register int	i;    register char	*colon;    /* Find a non-continuation line. */    for (colon = NULL, start = out; ; ) {	switch (*in) {	case '\0':	    *errorp = "EOF in headers";	    return NULL;	case ':':	    if (colon == NULL)		colon = out;	    break;	}	if ((*out++ = *in++) == '\n' && !ISWHITE(*in))	    break;    }    *deltap = out - start;    if (colon == NULL || !ISWHITE(colon[1])) {	if ((p = strchr(start, '\n')) != NULL)	    *p = '\0';	(void)sprintf(buff, COLONSPACE, MaxLength(start, start));	*errorp = buff;	return NULL;    }    /* See if this is a system header.  A fairly tightly-coded     * binary search. */    c = CTYPE(islower, *start) ? toupper(*start) : *start;    for (*colon = '\0', tp = ARTheadertree; tp; ) {	if ((i = c - tp->Name[0]) == 0	 && (i = strcasecmp(start, tp->Name)) == 0)	    break;	if (i < 0)	    tp = tp->Before;	else	    tp = tp->After;    }    *colon = ':';    if (tp == NULL) {	/* Not a system header, make sure we have <word><colon><space>. */	for (p = colon; --p != start; )	    if (ISWHITE(*p)) {		(void)sprintf(buff, "Space before colon in \"%s\" header",			MaxLength(start, start));		*errorp = buff;		return NULL;	    }	return in;    }    /* Found a known header; is it obsolete? */    hp = tp->Header;    if (hp->Type == HTobs) {	*deltap = 0;	return in;    }    /* If body of header is all blanks, drop the header. */    for (p = colon + 1; ISWHITE(*p); p++)	continue;    if (*p == '\0' || *p == '\n') {	*deltap = 0;	return in;    }    hp->Found++;    /* Zap in the canonical form of the header, undoing the \0 that     * strcpy put out (strncpy() spec isn't trustable, unfortunately). */    (void)strcpy(start, hp->Name);    start[hp->Size] = ':';    /* Copy the header if not too big. */    i = (out - 1) - p;    if (i >= MAXHEADERSIZE) {	(void)sprintf(buff, "\"%s\" header too long", hp->Name);	*errorp = buff;	return NULL;    }    hp->Length = i;    if (i > MEMCPY_THRESHOLD) {	(void)memcpy((POINTER)hp->Value, (POINTER)p, (SIZE_T)i);	hp->Value[i] = '\0';    }    else {	for (dest = hp->Value, i++; --i > 0; )	    *dest++ = *p++;	*dest = '\0';    }    return in;}/***  Check Message-ID format based on RFC 822 grammar, except that (as per**  RFC 1036) whitespace, non-printing, and '>' characters are excluded.**  Based on code by Paul Eggert posted to news.software.b on 22-Nov-90**  in <#*tyo2'~n@twinsun.com>, with additional email discussion.**  Thanks, Paul.*/BOOLARTidok(save)    char		*save;{    register int	c;    register char	*p;    /* Scan local-part:  "< atom|quoted [ . atom|quoted]" */    p = save;    if (*p++ != '<')	return FALSE;    for (; ; p++) {	if (ARTatomchar(*p))	    while (ARTatomchar(*++p))		continue;	else {	    if (*p++ != '"')		return FALSE;	    for ( ; ; ) {		switch (c = *p++) {		case '\\':		    c = *p++;		    /* FALLTHROUGH */		default:		    if (ARTnormchar(c))			continue;		    return FALSE;		case '"':		    break;		}		break;	    }	}	if (*p != '.')	    break;    }    /* Scan domain part:  "@ atom|domain [ . atom|domain] > \0" */    if (*p++ != '@')	return FALSE;    for ( ; ; p++) {	if (ARTatomchar(*p))	    while (ARTatomchar(*++p))		continue;	else {	    if (*p++ != '[')		return FALSE;	    for ( ; ; ) {		switch (c = *p++) {		case '\\':		    c = *p++;		    /* FALLTHROUGH */		default:		    if (ARTnormchar(c))			continue;		    /* FALLTHROUGH */		case '[':		    return FALSE;		case ']':		    break;		}		break;	    }	}	if (*p != '.')	    break;    }    return *p == '>' && *++p == '\0' && p - save <= DBZMAXKEY;}/***  Clean up an article.  This is mainly copying in-place, stripping bad**  headers.  Also fill in the article data block with what we can find.**  Return NULL if the article is okay, or a string describing the error.*/STATIC STRINGARTclean(Article, Data)    BUFFER		*Article;    ARTDATA		*Data;{    static char		buff[SMBUF];    ARTHEADER		*hp;    register char	*in;    register char	*out;    register int	i;    register char	*p;    STRING		error;    int			delta;    /* Read through the headers one at a time. */    Data->Feedsite = "?";    Data->Size[0] = '0';    Data->Size[1] = '\0';    for (hp = ARTheaders; hp < ENDOF(ARTheaders); hp++) {	if (hp->Value && hp->Type != HTobs)	    *hp->Value = '\0';	hp->Found = 0;    }    for (error = NULL, in = out = Article->Data; ; out += delta, in = p) {	if (*in == '\0') {	    error = "No body";	    break;	}	if (*in == '\n' && out > Article->Data && out[-1] == '\n')	    /* Found a \n after another \n; break out. */	    break;	/* Check the validity of this header. */	if ((p = ARTparseheader(in, out, &delta, &error)) == NULL)	    break;    }    Data->Body = out;    in++;    /* Try to set this now, so we can report it in errors. */    p = HDR(_message_id);    if (*p) {	Data->MessageID = p;	Data->MessageIDLength = strlen(p);	if (error == NULL) {	    if (Data->MessageIDLength > DBZMAXKEY)		error = "\"Message-ID\" header too long";	    else if (!ARTidok(p))		error = "Bad \"Message-ID\" header";	}    }    if (error)	return error;    /* Make sure all the headers we need are there, and no duplicates. */    for (hp = ARTheaders; hp < ENDOF(ARTheaders); hp++)	if (hp->Type == HTreq) {	    if (*hp->Value == '\0') {		(void)sprintf(buff, "Missing \"%s\" header", hp->Name);		return buff;	    }	    if (hp->Found > 1) {		(void)sprintf(buff, "Duplicate \"%s\" header", hp->Name);		return buff;	    }	}    /* Scan the body, counting lines. */    for (i = 0; *in; ) {	if (*in == '\n')	    i++;	*out++ = *in++;    }    *out = '\0';    Article->Used = out - Article->Data;    Data->LinesValue = i;#if	defined(DO_CHECK_LINECOUNT)    p = HDR(_lines);    if (*p && (delta = i - atoi(p)) != 0 && abs(delta) > LINECOUNT_FUZZ) {	if ((in = strchr(p, '\n')) != NULL)	    *in = '\0';	(void)sprintf(buff, "Linecount %s != %d +- %d",		MaxLength(p, p), i, LINECOUNT_FUZZ);	return buff;    }#endif	/* defined(DO_CHECK_LINECOUNT) */    /* Is article too old? */    p = HDR(_date);    if ((Data->Posted = parsedate(p, &Now)) == -1) {	(void)sprintf(buff, "Bad \"Date\" header -- \"%s\"", MaxLength(p, p));	return buff;    }    if (Cutoff && Data->Posted < Now.time - Cutoff) {	(void)sprintf(buff, "Too old -- \"%s\"", MaxLength(p, p));	return buff;    }    if (Data->Posted > Now.time + DATE_FUZZ) {	(void)sprintf(buff, "Article posted in the future -- \"%s\"",		MaxLength(p, p));	return buff;    }    Data->Arrived = Now.time;    p = HDR(_expires);    Data->Expires = 0;    if (*p != '\0' && (Data->Expires = parsedate(p, &Now)) == -1) {#if	0	(void)sprintf(buff, "Bad \"Expires\" header -- \"%s\"",		MaxLength(p, p));	return buff;#endif    }    /* Whitespace in the Newsgroups header? */    for (p = HDR(_newsgroups); *p; p++)	if (ISWHITE(*p)) {	    (void)sprintf(buff,		    "Whitespace in \"Newsgroups\" header -- \"%s\"",		    MaxLength(HDR(_newsgroups), p));	    return buff;	}    /* If there is no control header, see if the article starts with     * "cmsg ". */    in = HDR(_control);    if (*in == '\0') {	p = HDR(_subject);	if (*p == 'c' && EQn(p, "cmsg ", 5)) {	    for (p += 5; *p && ISWHITE(*p); )		p++;	    if (*p)		(void)strcpy(in, p);	}    }    return NULL;}/***  Start a log message about an article.*/STATIC voidARTlog(Data, code, text)    ARTDATA		*Data;    char		code;    char		*text;{    int			i;    BOOL		Done;    /* We could be a bit faster by not dividing Now.usec by 1000,     * but who really wants to log at the Microsec level? */    Done = code == ART_ACCEPT || code == ART_JUNK;    if (text)	i = fprintf(Log, "%.15s.%03.3d %c %s %s %s%s",		ctime(&Now.time) + 4, (int)(Now.usec / 1000),		code, Data->Feedsite, Data->MessageID, text, Done ? "" : "\n");    else	i = fprintf(Log, "%.15s.%03.3d %c %s %s%s",		ctime(&Now.time) + 4, (int)(Now.usec / 1000),		code, Data->Feedsite, Data->MessageID, Done ? "" : "\n");    if (i == EOF || (Done && !BufferedLogs && fflush(Log)) || ferror(Log)) {	IOError("logging article");	syslog(L_ERROR, "%s cant write log_start %m", LogName);	clearerr(Log);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩久久久久久| 亚洲一级二级在线| 一区二区三区产品免费精品久久75| 免费美女久久99| 在线视频你懂得一区| 国产亚洲污的网站| 轻轻草成人在线| 色天天综合色天天久久| 久久五月婷婷丁香社区| 日韩电影网1区2区| 欧美日韩在线播放一区| 亚洲另类春色国产| av资源网一区| 中文字幕欧美激情一区| 国产在线精品国自产拍免费| 日韩一区二区在线看| 亚洲国产精品久久久久秋霞影院| 白白色亚洲国产精品| 欧美国产精品劲爆| 岛国一区二区三区| 中文子幕无线码一区tr| 国产美女精品在线| 国产视频亚洲色图| 成人性生交大片免费看在线播放| 日韩精品专区在线影院重磅| 美国一区二区三区在线播放| 欧美午夜一区二区三区免费大片| 亚洲三级在线看| 91美女精品福利| 亚洲品质自拍视频| 色婷婷精品久久二区二区蜜臀av| 1000部国产精品成人观看| 成人a级免费电影| 亚洲少妇最新在线视频| 成人av午夜电影| 亚洲免费观看在线视频| 色婷婷av久久久久久久| 亚洲成av人在线观看| 欧美专区在线观看一区| 偷窥少妇高潮呻吟av久久免费| 欧美精品亚洲二区| 日韩电影在线观看一区| 久久这里只有精品视频网| 国内精品不卡在线| 国产精品成人在线观看| 欧美视频在线一区| 日韩中文字幕区一区有砖一区| 欧美精品一卡二卡| 国产一区二区三区在线观看免费 | 欧美视频一区二区三区在线观看| 一区二区三区在线播| 欧美性三三影院| 男男视频亚洲欧美| 国产精品久线观看视频| 一本大道久久a久久综合婷婷| 亚洲免费看黄网站| 日韩视频在线一区二区| 成人性视频免费网站| 亚洲一区二区三区激情| 精品免费一区二区三区| 成人不卡免费av| 日韩成人免费看| 国产欧美1区2区3区| 91传媒视频在线播放| 免费不卡在线观看| 综合久久综合久久| 日韩精品一区在线观看| 99精品一区二区三区| 日韩电影免费在线观看网站| 国产偷国产偷亚洲高清人白洁| 在线中文字幕一区二区| 国产精品亚洲第一区在线暖暖韩国| 亚洲欧美日韩人成在线播放| 日韩视频国产视频| 91国产丝袜在线播放| 国产成人免费高清| 日韩av电影免费观看高清完整版在线观看| 久久久精品黄色| 日韩一区二区三| 91福利视频网站| 不卡的看片网站| 精品一区二区三区欧美| 亚洲国产婷婷综合在线精品| 国产欧美精品国产国产专区| 91精品国产品国语在线不卡| 91尤物视频在线观看| 精品一区二区在线免费观看| 亚洲第一福利一区| 亚洲男同性视频| 国产欧美日韩久久| 26uuu国产一区二区三区| 欧美日韩专区在线| 色婷婷国产精品综合在线观看| 国产成人av自拍| 国产一区二区三区在线看麻豆| 视频一区二区三区在线| 亚洲影院免费观看| 亚洲免费观看高清| 一区精品在线播放| 国产精品白丝在线| 中文一区在线播放| 久久精品一区四区| 久久久久久久久99精品| 精品国产自在久精品国产| 91精品国产欧美一区二区成人| 欧美日韩卡一卡二| 国产精品久久久久久久久晋中| 欧美大片国产精品| 欧美大黄免费观看| 日韩视频中午一区| 欧美videos中文字幕| 日韩欧美国产一区二区在线播放| 69久久99精品久久久久婷婷| 欧美日韩国产一级| 91精品国产91热久久久做人人| 欧美一区二区三区免费大片 | 日本免费新一区视频| 亚洲18影院在线观看| 亚洲国产精品影院| 肉丝袜脚交视频一区二区| 首页欧美精品中文字幕| 日韩黄色片在线观看| 日韩在线观看一区二区| 蜜芽一区二区三区| 国产大陆a不卡| 成av人片一区二区| 色婷婷av一区二区三区大白胸| 在线免费观看日本一区| 欧美挠脚心视频网站| 日韩亚洲欧美综合| 久久久亚洲精品一区二区三区| 日本一区二区综合亚洲| 亚洲视频一区二区在线| 亚洲成人一区二区在线观看| 全部av―极品视觉盛宴亚洲| 老司机一区二区| 成人精品亚洲人成在线| 91视频在线看| 91精品国产欧美一区二区成人| 精品99999| 亚洲女子a中天字幕| 亚洲高清免费视频| 韩日av一区二区| 91麻豆福利精品推荐| 777午夜精品视频在线播放| 久久伊99综合婷婷久久伊| 国产精品国产自产拍高清av王其| 香蕉久久夜色精品国产使用方法 | 国产精品全国免费观看高清| 亚洲网友自拍偷拍| 国产精一区二区三区| 色狠狠av一区二区三区| 亚洲精品一线二线三线无人区| 怡红院av一区二区三区| 国内成+人亚洲+欧美+综合在线| 91免费看`日韩一区二区| 日韩三级伦理片妻子的秘密按摩| 国产精品剧情在线亚洲| 麻豆成人免费电影| 91福利精品视频| 日本一区二区视频在线| 日韩国产欧美一区二区三区| 99re成人精品视频| 久久久久久久久99精品| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲精品ww久久久久久p站| 久久国产综合精品| 欧美日本在线视频| 亚洲精品日韩专区silk| 国产成人av电影在线| 91精品国产高清一区二区三区| 最新成人av在线| 国产成人在线观看| 日韩一区二区视频| 亚洲国产日韩综合久久精品| 丁香亚洲综合激情啪啪综合| 精品国产一区二区亚洲人成毛片| 亚洲自拍都市欧美小说| 99久久亚洲一区二区三区青草| 久久一日本道色综合| 美女在线观看视频一区二区| 91久久久免费一区二区| 亚洲国产精品成人久久综合一区| 久久国产精品色婷婷| 91精品视频网| 香蕉久久一区二区不卡无毒影院| 91麻豆国产香蕉久久精品| 亚洲欧洲韩国日本视频| 粗大黑人巨茎大战欧美成人| 久久―日本道色综合久久| 九九九精品视频| 欧美大胆人体bbbb| 久久精品99久久久| 欧美va亚洲va香蕉在线| 久久国产精品色婷婷| 欧美精品一区二| 国产一区欧美二区| 国产亚洲成aⅴ人片在线观看 | 久久久久久麻豆| 国产毛片精品视频|