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 + -
显示快捷键?