phpbbs.file.c

来自「linux/unix环境下的建站系统」· C语言 代码 · 共 736 行 · 第 1/2 页

C
736
字号
	return len;}#if 0static int new_buffered_output(char *buf, size_t buflen, void *arg){	output_printf(buf,buflen);	return 0;}#endifstatic int new_write(const char *buf, uint buflen){	output_printf(buf, buflen);	return 0;}/* 注意,当 is_preview 为 1 的时候,第一个参数 filename 就是供预览的帖子内容,而不是文件名 - atppp */PHP_FUNCTION(bbs_printansifile){    char *filename;    int filename_len;    long linkmode,is_tex,is_preview;    char *ptr;    off_t ptrlen, mmap_ptrlen;    const int outbuf_len = 4096;    buffered_output_t *out;    char* attachlink;    int attachlink_len;    char attachdir[MAXPATH];    if (ZEND_NUM_ARGS() == 1) {        if (zend_parse_parameters(1 TSRMLS_CC, "s", &filename, &filename_len) != SUCCESS) {            WRONG_PARAM_COUNT;        }        linkmode = 1;        attachlink=NULL;        is_tex=is_preview=0;    } else if (ZEND_NUM_ARGS() == 2) {        if (zend_parse_parameters(2 TSRMLS_CC, "sl", &filename, &filename_len, &linkmode) != SUCCESS) {            WRONG_PARAM_COUNT;        }        attachlink=NULL;        is_tex=is_preview=0;    } else if (ZEND_NUM_ARGS() == 3) {        if (zend_parse_parameters(3 TSRMLS_CC, "sls", &filename, &filename_len, &linkmode,&attachlink,&attachlink_len) != SUCCESS) {            WRONG_PARAM_COUNT;        }        is_tex=is_preview=0;    } else {        if (zend_parse_parameters(5 TSRMLS_CC, "slsll", &filename, &filename_len, &linkmode,&attachlink,&attachlink_len,&is_tex,&is_preview) != SUCCESS) {            WRONG_PARAM_COUNT;        }    }    if (!is_preview) {        if (safe_mmapfile(filename, O_RDONLY, PROT_READ, MAP_SHARED, &ptr, &mmap_ptrlen, NULL) == 0)            RETURN_LONG(-1);        ptrlen = mmap_ptrlen;    } else {        ptr = filename;        ptrlen = filename_len;        getattachtmppath(attachdir, MAXPATH, getSession());    }	if ((out = alloc_output(outbuf_len)) == NULL)	{		if (!is_preview) end_mmapfile(ptr, mmap_ptrlen, -1);        RETURN_LONG(2);	}/*	override_default_output(out, buffered_output);	override_default_flush(out, flush_buffer);*/	/*override_default_output(out, new_buffered_output);	override_default_flush(out, new_flush_buffer);*/	override_default_write(out, new_write);	output_ansi_html(ptr, ptrlen, out, attachlink, is_tex, is_preview ? attachdir : NULL);	free_output(out);    if (!is_preview) end_mmapfile(ptr, mmap_ptrlen, -1);	RETURN_STRINGL(get_output_buffer(), get_output_buffer_len(),1);}PHP_FUNCTION(bbs_print_article){    char *filename;    int filename_len;    long linkmode;    char *ptr;    off_t mmap_ptrlen;    const int outbuf_len = 4096;    buffered_output_t *out;    char* attachlink;    int attachlink_len;    if (ZEND_NUM_ARGS() == 1) {        if (zend_parse_parameters(1 TSRMLS_CC, "s", &filename, &filename_len) != SUCCESS) {            WRONG_PARAM_COUNT;        }        linkmode = 1;        attachlink=NULL;    } else if (ZEND_NUM_ARGS() == 2) {        if (zend_parse_parameters(2 TSRMLS_CC, "sl", &filename, &filename_len, &linkmode) != SUCCESS) {            WRONG_PARAM_COUNT;        }        attachlink=NULL;    } else {        if (zend_parse_parameters(3 TSRMLS_CC, "sls", &filename, &filename_len, &linkmode,&attachlink,&attachlink_len) != SUCCESS) {            WRONG_PARAM_COUNT;        }    }    if (safe_mmapfile(filename, O_RDONLY, PROT_READ, MAP_SHARED, &ptr, &mmap_ptrlen, NULL) == 0)        RETURN_LONG(-1);	if ((out = alloc_output(outbuf_len)) == NULL)	{		end_mmapfile(ptr, mmap_ptrlen, -1);        RETURN_LONG(2);	}	override_default_write(out, zend_write);	output_ansi_text(ptr, mmap_ptrlen, out, attachlink);	free_output(out);    end_mmapfile(ptr, mmap_ptrlen, -1);}PHP_FUNCTION(bbs_print_article_js){    char *filename;    int filename_len;    long linkmode;    char *ptr;    off_t mmap_ptrlen;    const int outbuf_len = 4096;    buffered_output_t *out;    char* attachlink;    int attachlink_len;    if (ZEND_NUM_ARGS() == 1) {        if (zend_parse_parameters(1 TSRMLS_CC, "s", &filename, &filename_len) != SUCCESS) {            WRONG_PARAM_COUNT;        }        linkmode = 1;        attachlink=NULL;    } else if (ZEND_NUM_ARGS() == 2) {        if (zend_parse_parameters(2 TSRMLS_CC, "sl", &filename, &filename_len, &linkmode) != SUCCESS) {            WRONG_PARAM_COUNT;        }        attachlink=NULL;    } else {        if (zend_parse_parameters(3 TSRMLS_CC, "sls", &filename, &filename_len, &linkmode,&attachlink,&attachlink_len) != SUCCESS) {            WRONG_PARAM_COUNT;        }    }    if (safe_mmapfile(filename, O_RDONLY, PROT_READ, MAP_SHARED, &ptr, &mmap_ptrlen, NULL) == 0)        RETURN_LONG(-1);	if ((out = alloc_output(outbuf_len)) == NULL)	{		end_mmapfile(ptr, mmap_ptrlen, -1);        RETURN_LONG(2);	}	override_default_write(out, zend_write);	output_ansi_javascript(ptr, mmap_ptrlen, out, attachlink);	free_output(out);    end_mmapfile(ptr, mmap_ptrlen, -1);}/* function bbs_printoriginfile(string board, string filename); * 输出原文内容供编辑 */PHP_FUNCTION(bbs_printoriginfile){    char *board,*filename;    int boardLen,filenameLen;    FILE* fp;    const int outbuf_len = 4096;	char buf[512],path[512];    buffered_output_t *out;	int i;	int skip;	const boardheader_t* bp;    if ((ZEND_NUM_ARGS() != 2) || (zend_parse_parameters(2 TSRMLS_CC, "ss", &board,&boardLen, &filename,&filenameLen) != SUCCESS)) {		WRONG_PARAM_COUNT;    } 	if ( (bp=getbcache(board))==0) {		RETURN_LONG(-1);	}	setbfile(path, bp->filename, filename);    fp = fopen(path, "r");    if (fp == 0)        RETURN_LONG(-1); //文件无法读取	if ((out = alloc_output(outbuf_len)) == NULL)	{        RETURN_LONG(-2);	}	override_default_write(out, zend_write);	/*override_default_output(out, buffered_output);	override_default_flush(out, flush_buffer);*/		i=0;    	skip=0;    while (skip_attach_fgets(buf, sizeof(buf), fp) != 0) {		i++;        if (Origin2(buf))            break;		if ((i==1) && (strncmp(buf,"发信人",6)==0)) {			skip=1;		}		if ((skip) && (i<=4) ){			continue;		}        if (strstr(buf,"\033[36m※ 修改:·")==buf) {            continue;        }        if (!strcasestr(buf, "</textarea>"))		{			int len = strlen(buf);            BUFFERED_OUTPUT(out, buf, len);		}    }    fclose(fp);	BUFFERED_FLUSH(out);	free_output(out);    RETURN_LONG(0);}/* function bbs_originfile(string board, string filename); * 返回原文内容供编辑 modified from the function above by pig2532 解决很猪的问题之二 */PHP_FUNCTION(bbs_originfile){    char *board,*filename;    int boardLen,filenameLen;    FILE* fp;	char buf[512],path[512];    char *content, *ptr;    int chunk_size=51200, calen, clen, buflen;	int i;	int skip;	const boardheader_t* bp;    if ((ZEND_NUM_ARGS() != 2) || (zend_parse_parameters(2 TSRMLS_CC, "ss", &board,&boardLen, &filename,&filenameLen) != SUCCESS)) {		WRONG_PARAM_COUNT;    } 	if ( (bp=getbcache(board))==0) {		RETURN_LONG(-1);	}	setbfile(path, bp->filename, filename);    fp = fopen(path, "r");    if (fp == 0)        RETURN_LONG(-1); //文件无法读取		i=0;    	skip=0;    calen = chunk_size;    content = (char *)emalloc(calen);    clen = 0;    ptr = content;    while (skip_attach_fgets(buf, sizeof(buf), fp) != 0) {		i++;        if (Origin2(buf))            break;		if ((i==1) && (strncmp(buf,"发信人",6)==0)) {			skip=1;		}		if ((skip) && (i<=4) ){			continue;		}        if (strstr(buf,"\033[36m※ 修改:·")==buf) {            continue;        }        buflen = strlen(buf);        if((clen + buflen) >= calen)        {            calen += chunk_size;            content = (char *)erealloc(content, calen);            ptr = content + clen;        }        memcpy(ptr, buf, buflen);        clen += buflen;        ptr += buflen;    }    fclose(fp);    content[clen] = '\0';    RETURN_STRINGL(content, clen, 0);}PHP_FUNCTION(bbs_decode_att_hash){#ifndef DISABLE_INTERNAL_BOARD_PPMM_VIEWING    char *info;    int infolen;    char *spec;    int speclen;    int specbytes[10];    int totalspecbytes;    char decoded[256];    char md5ret[256];    uint16_t u16;    int i, u32, len;    char *ptr;    MD5_CTX md5;        if ((ZEND_NUM_ARGS() != 2) || (zend_parse_parameters(2 TSRMLS_CC, "ss", &info, &infolen, &spec, &speclen) != SUCCESS)) {		WRONG_PARAM_COUNT;    }        if (infolen > 128) {        RETURN_FALSE;    }    if (speclen > sizeof(specbytes)/sizeof(int)) {        RETURN_FALSE;    }    totalspecbytes = 0;    for (i = 0; i < speclen; i++) {        u32 = spec[i] - '0';        if (u32 != 2 && u32 != 4) {            RETURN_FALSE;        }        specbytes[i] = u32;        totalspecbytes += u32;    }    memcpy(decoded, info, 9);    len = from64tobits(decoded+9, info+9);    if (4+totalspecbytes+4 != len) {        RETURN_FALSE;    }    MD5Init(&md5);    MD5Update(&md5, (unsigned char *) decoded, 9+4+totalspecbytes);    MD5Final((unsigned char*)md5ret, &md5);    if (memcmp(md5ret, decoded+9+4+totalspecbytes, 4) != 0) {        RETURN_FALSE;    }    ptr = decoded+9;    memcpy(&u32, ptr, 4); ptr+=4;    if (time(NULL) < u32 || (time(NULL) - u32 >= 300)) {        RETURN_FALSE;    }    if (array_init(return_value) == FAILURE) {        RETURN_FALSE;    }    add_next_index_stringl(return_value, info, 9, 1);    for (i = 0; i < speclen; i++) {        if (specbytes[i] == 2) {            memcpy(&u16, ptr, 2); ptr += 2;            u32 = u16;        } else {            memcpy(&u32, ptr, 4); ptr += 4;        }        add_next_index_long(return_value, u32);    }#else    RETURN_FALSE;#endif}

⌨️ 快捷键说明

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