phpbbslib.c
来自「bbs server linux平台下软件源码」· C语言 代码 · 共 2,310 行 · 第 1/5 页
C
2,310 行
RETURN_LONG(-6); //同名ID不能修改老ID的文章 } } /* * 版主禁止POST 检查 */ if (deny_me(currentuser->userid, brd->filename) && !HAS_PERM(currentuser, PERM_SYSOP)) { RETURN_LONG(-7); //您的POST权被封 } RETURN_LONG(0);}/* function bbs_printoriginfile(string board, string filename); * 输出原文内容供编辑 */static PHP_FUNCTION(bbs_printoriginfile){ char *board, *filename; long boardLen, filenameLen; FILE *fp; const int outbuf_len = 4096; char buf[512], path[512]; buffered_output_t *out; int i; int skip; bcache_t *bp; getcwd(old_pwd, 1023); chdir(BBSHOME); old_pwd[1023] = 0; 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_output(out, buffered_output); override_default_flush(out, flush_buffer); i = 0; skip = 0; while (skip_attach_fgets(buf, sizeof(buf), fp) != 0) { char tmp[256]; i++; if (Origin2(buf)) break; if ((i == 1) && (strncmp(buf, "发信人", 6) == 0)) { skip = 1; } if ((skip) && (i <= 4)) { continue; } if (!strcasestr(buf, "</textarea>")) out->output(buf, strlen(buf), out); } out->flush(out); free_output(out); RETURN_LONG(0);}static PHP_FUNCTION(bbs_getboard){ zval *array; char *boardname; int boardname_len; const struct boardheader *bh; const struct BoardStatus *bs; int b_num; if (ZEND_NUM_ARGS() == 1) { if (zend_parse_parameters(1 TSRMLS_CC, "s", &boardname, &boardname_len) != SUCCESS) WRONG_PARAM_COUNT; array = NULL; } else { if (ZEND_NUM_ARGS() == 2) { if (zend_parse_parameters(2 TSRMLS_CC, "sa", &boardname, &boardname_len, &array) != SUCCESS) WRONG_PARAM_COUNT; } else WRONG_PARAM_COUNT; } if (boardname_len > BOARDNAMELEN) boardname[BOARDNAMELEN] = 0; b_num = getbnum(boardname); if (b_num == 0) RETURN_LONG(0); bh = getboard(b_num); bs = getbstatus(b_num); if (array) { if (array_init(array) != SUCCESS) WRONG_PARAM_COUNT; assign_board(array, bh, bs, b_num); } RETURN_LONG(b_num);}static int bbs_cmpboard(const struct newpostdata *brd, const struct newpostdata *tmp){ register int type = 0; if (!(currentuser->flags & BRDSORT_FLAG)) { type = brd->title[0] - tmp->title[0]; if (type == 0) type = strncasecmp(brd->title + 1, tmp->title + 1, 6); } if (type == 0) type = strcasecmp(brd->name, tmp->name); return type;}/* TODO: move this function into bbslib. */static int check_newpost(struct newpostdata *ptr){ struct BoardStatus *bptr; ptr->total = ptr->unread = 0; bptr = getbstatus(ptr->pos + 1); if (bptr == NULL) return 0; ptr->total = bptr->total; if (!strcmp(currentuser->userid, "guest")) { ptr->unread = 1; return 1; }#ifdef HAVE_BRC_CONTROL if (!brc_initial(currentuser->userid, ptr->name)) { ptr->unread = 1; } else { if (brc_unread(bptr->lastpost)) { ptr->unread = 1; } }#else ptr->unread = 0;#endif return 1;}#define BOARD_COLUMNS 10char *brd_col_names[BOARD_COLUMNS] = { "NAME", "DESC", "CLASS", "BM", "ARTCNT", /* article count */ "UNREAD", "ZAPPED", "BID", "POSITION", /* added by caltary */ "FLAG" /* is group ? */};/* added by caltary */struct favbrd_struct { int flag; char *title; int father;};extern struct favbrd_struct favbrd_list[FAVBOARDNUM];extern int favbrd_list_t;extern int favnow;static void bbs_make_board_columns(zval ** columns){ int i; for (i = 0; i < BOARD_COLUMNS; i++) { MAKE_STD_ZVAL(columns[i]); ZVAL_STRING(columns[i], brd_col_names[i], 1); }}static void bbs_make_board_zval(zval * value, char *col_name, struct newpostdata *brd){ int len = strlen(col_name); if (strncmp(col_name, "ARTCNT", len) == 0) { ZVAL_LONG(value, brd->total); } else if (strncmp(col_name, "UNREAD", len) == 0) { ZVAL_LONG(value, brd->unread); } else if (strncmp(col_name, "ZAPPED", len) == 0) { ZVAL_LONG(value, brd->zap); } else if (strncmp(col_name, "CLASS", len) == 0) { ZVAL_STRINGL(value, brd->title + 1, 6, 1); } else if (strncmp(col_name, "DESC", len) == 0) { ZVAL_STRING(value, brd->title + 13, 1); } else if (strncmp(col_name, "NAME", len) == 0) { ZVAL_STRING(value, brd->name, 1); } else if (strncmp(col_name, "BM", len) == 0) { ZVAL_STRING(value, brd->BM, 1); /* * added by caltary */ } else if (strncmp(col_name, "POSITION", len) == 0) { ZVAL_LONG(value, brd->pos); /*added end */ } else if (strncmp(col_name, "FLAG", len) == 0) { ZVAL_LONG(value, brd->flag); /*added end */ } else if (strncmp(col_name, "BID", len) == 0) { ZVAL_LONG(value, brd->pos + 1); /*added end */ } else { ZVAL_EMPTY_STRING(value); }}#ifdef HAVE_WFORUMunsigned int *zapbuf;/** * Fetch all boards which have given prefix into an array. * prototype: * array bbs_getboards(char *prefix, int group, int yank); * * @return array of loaded boards on success, * FALSE on failure. * @author roy */static PHP_FUNCTION(bbs_getboards){ /* * TODO: The name of "yank" must be changed, this name is totally * shit, but I don't know which name is better this time. */ char *prefix; int plen; int yank; int rows = 0; struct newpostdata newpost_buffer; struct newpostdata *ptr; zval **columns; zval *element; int i; int j; int ac = ZEND_NUM_ARGS(); int brdnum, yank_flag; int group; int total; getcwd(old_pwd, 1023); chdir(BBSHOME); /* * getting arguments */ if (ac != 3 || zend_parse_parameters(3 TSRMLS_CC, "sll", &prefix, &plen, &group, &yank) == FAILURE) { WRONG_PARAM_COUNT; } if (plen = 0) { RETURN_FALSE; } if (currentuser == NULL) { RETURN_FALSE; } /* * setup column names */ if (array_init(return_value) == FAILURE) { RETURN_FALSE; } columns = emalloc(BOARD_COLUMNS * sizeof(zval *)); if (columns == NULL) { RETURN_FALSE; } for (i = 0; i < BOARD_COLUMNS; i++) { MAKE_STD_ZVAL(element); array_init(element); columns[i] = element; zend_hash_update(Z_ARRVAL_P(return_value), brd_col_names[i], strlen(brd_col_names[i]) + 1, (void *) &element, sizeof(zval *), NULL); } total = get_boardcount(); yank_flag = yank; if (yank_flag != 1) yank_flag = 0; if (zapbuf == NULL) { char fname[STRLEN]; int fd, size; size = total * sizeof(int); zapbuf = (int *) emalloc(size); if (zapbuf == NULL) { RETURN_FALSE; } for (i = 0; i < total; i++) zapbuf[i] = 1; sethomefile(fname, currentuser->userid, ".lastread"); /*user的.lastread, zap信息 */ if ((fd = open(fname, O_RDONLY, 0600)) != -1) { size = total * sizeof(int); read(fd, zapbuf, size); close(fd); } } brdnum = 0; { int n; struct boardheader const *bptr; char **namelist; int *indexlist; time_t tnow; tnow = time(0); namelist = (char **) emalloc(sizeof(char **) * (total)); if (namelist == NULL) { RETURN_FALSE; } indexlist = (int *) emalloc(sizeof(int *) * (total)); if (indexlist == NULL) { RETURN_FALSE; } for (n = 0; n < total; n++) { bptr = getboard(n + 1); if (!bptr) continue; if (*(bptr->filename) == 0) continue; if (group == -2) { if ((tnow - bptr->createtime) > 86400 * 30 || (bptr->flag & BOARD_GROUP)) continue; } else if (bptr->group != group) continue; if (!check_see_perm(currentuser, bptr)) { continue; } if ((group == 0) && (strchr(prefix, bptr->title[0]) == NULL && prefix[0] != '*')) continue; if (yank_flag || zapbuf[n] != 0 || (bptr->level & PERM_NOZAP)) { /* * 都要排序 */ for (i = 0; i < brdnum; i++) { if (strcasecmp(namelist[i], bptr->filename) > 0) break; } for (j = brdnum; j > i; j--) { namelist[j] = namelist[j - 1]; indexlist[j] = indexlist[j - 1]; } namelist[i] = bptr->filename; indexlist[i] = n; brdnum++; } } for (i = 0; i < brdnum; i++) { ptr = &newpost_buffer; bptr = getboard(indexlist[i] + 1); ptr->dir = bptr->flag & BOARD_GROUP ? 1 : 0; ptr->name = bptr->filename; ptr->title = bptr->title; ptr->BM = bptr->BM; ptr->flag = bptr->flag | ((bptr->level & PERM_NOZAP) ? BOARD_NOZAPFLAG : 0); ptr->pos = indexlist[i]; if (bptr->flag & BOARD_GROUP) { ptr->total = bptr->board_data.group_total; } else ptr->total = -1; ptr->zap = (zapbuf[indexlist[i]] == 0); check_newpost(ptr); for (j = 0; j < BOARD_COLUMNS; j++) { MAKE_STD_ZVAL(element); bbs_make_board_zval(element, brd_col_names[j], ptr); zend_hash_index_update(Z_ARRVAL_P(columns[j]), i, (void *) &element, sizeof(zval *), NULL); } } efree(namelist); efree(indexlist); } efree(columns);}#elseextern int brdnum;/** * Fetch all boards which have given prefix into an array. * prototype: * array bbs_getboards(char *prefix, int yank); * * @return array of loaded boards on success, * FALSE on failure. * @author flyriver */static PHP_FUNCTION(bbs_getboards){ /* * TODO: The name of "yank" must be changed, this name is totally * shit, but I don't know which name is better this time. */ char *prefix; int plen; int yank; int rows = 0; struct newpostdata newpost_buffer[MAXBOARD]; struct newpostdata *ptr; zval **columns; zval *element; int i; int j; int ac = ZEND_NUM_ARGS(); int brdnum, yank_flag; int group; getcwd(old_pwd, 1023); chdir(BBSHOME); /* * getting arguments */ if (ac != 3 || zend_parse_parameters(3 TSRMLS_CC, "sll", &prefix, &plen, &group, &yank) == FAILURE) { WRONG_PARAM_COUNT; } /* * loading boards */ /* * handle some global variables: currentuser, yank, brdnum, * * nbrd. */ /* * NOTE: currentuser SHOULD had been set in funcs.php, * * but we still check it. */ if (currentuser == NULL) { RETURN_FALSE; } yank_flag = yank; if (strcmp(currentuser->userid, "guest") == 0) yank_flag = 1; /* see all boards including zapped boards. */ if (yank_flag != 0) yank_flag = 1; brdnum = 0; /* * TODO: replace load_board() with a new one, without accessing * * global variables. */ if ((brdnum = load_boards(newpost_buffer, prefix, group, 1, MAXBOARD, 1, yank_flag, NULL)) <= 0) { RETURN_FALSE; } /* * qsort( nbrd, brdnum, sizeof( nbrd[0] ), * (int (*)(const void *, const void *))bbs_cmpboard ); */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?