📄 phpbbs.board.c
字号:
#include "php_kbs_bbs.h" static void assign_board(zval * array, const struct boardheader *board, const struct BoardStatus* bstatus, int num){ add_assoc_long(array, "NUM", num); // kept for back compatible add_assoc_long(array, "BID", num); add_assoc_string(array, "NAME", (char*)board->filename, 1); /* * add_assoc_string(array, "OWNER", board->owner, 1); */ add_assoc_string(array, "BM", (char*)board->BM, 1); add_assoc_long(array, "FLAG", board->flag); add_assoc_string(array, "DESC", (char*)board->title + 13, 1); add_assoc_stringl(array, "CLASS", (char*)board->title + 1, 6, 1); add_assoc_stringl(array, "SECNUM", (char*)board->title, 1, 1); add_assoc_long(array, "LEVEL", board->level); add_assoc_long(array, "CURRENTUSERS", bstatus->currentusers); add_assoc_long(array, "LASTPOST", bstatus->lastpost); add_assoc_long(array, "TOTAL", bstatus->total);}char *brd_col_names[] = { "NAME", "DESC", "CLASS", "BM", "ARTCNT", /* article count */ "UNREAD", "ZAPPED", "BID", "POSITION", /* added by caltary */ "FLAG" , /* is group ?*/ "NPOS" , "CURRENTUSERS", /* added by atppp */ "LASTPOST"};#define BOARD_COLUMNS sizeof(brd_col_names)/sizeof(char *)/* added by caltary */#define favbrd_list_t (*(getSession()->favbrd_list_count))/* TODO: this is very stupid... need to speed it up */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, (char *)brd->title + 1, 6, 1); } else if (strncmp(col_name, "DESC", len) == 0) { ZVAL_STRING(value, (char *)brd->title + 13, 1); } else if (strncmp(col_name, "NAME", len) == 0) { ZVAL_STRING(value, (char *)brd->name, 1); } else if (strncmp(col_name, "BM", len) == 0) { ZVAL_STRING(value, (char *)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 if (strncmp(col_name, "NPOS", len) == 0){ ZVAL_LONG(value, brd->pos);/*added end */ } else if (strncmp(col_name, "CURRENTUSERS", len) == 0){ ZVAL_LONG(value, brd->currentusers); } else if (strncmp(col_name, "LASTPOST", len) == 0){ ZVAL_LONG(value, brd->lastpost); } else { ZVAL_EMPTY_STRING(value); }}static void assign_board_zval(zval * array, struct newpostdata *brd){ add_assoc_string(array, "NAME", (char *)brd->name, 1); add_assoc_string(array, "DESC", (char *)brd->title + 13, 1); add_assoc_stringl(array, "CLASS", (char *)brd->title + 1, 6, 1); add_assoc_string(array, "BM", (char *)brd->BM, 1); add_assoc_long(array, "ARTCNT", brd->total); add_assoc_long(array, "UNREAD", brd->unread); add_assoc_long(array, "ZAPPED", brd->zap); add_assoc_long(array, "BID", brd->pos+1); add_assoc_long(array, "POSITION", brd->pos); add_assoc_long(array, "FLAG", brd->flag); add_assoc_long(array, "NPOS", brd->pos); add_assoc_long(array, "CURRENTUSERS", brd->currentusers); add_assoc_long(array, "LASTPOST", brd->lastpost);}static void bbs_make_favdir_zval(zval * value, char *col_name, struct newpostdata *brd){ int len = strlen(col_name); if (strncmp(col_name, "DESC", len) == 0) { ZVAL_STRING(value, (char *)brd->title, 1); } else if (strncmp(col_name, "NAME", len) == 0) { ZVAL_STRING(value, (char *)brd->name, 1); } else if (strncmp(col_name, "POSITION", len) == 0){ /* 保存目录的上一级的索引值 */ ZVAL_LONG(value, getSession()->favbrd_list[brd->tag].father); } else if (strncmp(col_name, "FLAG", len) == 0){ ZVAL_LONG(value, (brd->flag == 0xffffffff) ? -1L : brd->flag);/*added end */ } else if (strncmp(col_name, "BID", len) == 0){ /* 保存目录的索引值 */ ZVAL_LONG(value, brd->tag);/*added end */ } else if (strncmp(col_name, "NPOS", len) == 0){ /* 保存目录的索引值 */ ZVAL_LONG(value, brd->pos);/*added end */ } else { ZVAL_EMPTY_STRING(value); }}static void assign_favdir_zval(zval * array, struct newpostdata *brd){ add_assoc_string(array, "NAME", (char *)brd->name, 1); add_assoc_string(array, "DESC", (char *)brd->title, 1); add_assoc_string(array, "CLASS", "", 1); add_assoc_string(array, "BM", (char *)brd->BM, 1); add_assoc_long(array, "ARTCNT", 0); add_assoc_long(array, "UNREAD", 0); add_assoc_long(array, "ZAPPED", 0); add_assoc_long(array, "BID", brd->tag); add_assoc_long(array, "POSITION", getSession()->favbrd_list[brd->tag].father); add_assoc_long(array, "FLAG", (brd->flag == 0xffffffff) ? -1L : brd->flag); add_assoc_long(array, "NPOS", brd->pos); add_assoc_long(array, "CURRENTUSERS", 0); add_assoc_long(array, "LASTPOST", 0);}/* TODO: move this function into bbslib. *//* no_brc added by atppp 20040706 */static int check_newpost(struct newpostdata *ptr, bool no_brc){ struct BoardStatus *bptr; ptr->total = ptr->unread = 0; bptr = getbstatus(ptr->pos+1); if (bptr == NULL) return 0; ptr->total = bptr->total; ptr->currentusers = bptr->currentusers; ptr->lastpost = bptr->lastpost; if (!strcmp(getCurrentUser()->userid, "guest")) { ptr->unread = 1; return 1; } if (no_brc) return 1;#ifdef HAVE_BRC_CONTROL if (!brc_initial(getCurrentUser()->userid, ptr->name, getSession())) { ptr->unread = 1; } else { if (brc_board_unread(ptr->pos+1, getSession())) { ptr->unread = 1; } }#endif return 1;}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 = getbid(boardname, &bh); if (b_num == 0) RETURN_LONG(0); 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);}/* * return: null: 版面不存在或者当前用户没有阅读权限 * false/true: 是不是 normalboard */PHP_FUNCTION(bbs_safe_getboard){ zval *array; char *boardname; int boardname_len; long bid; int nb; const struct boardheader *bh; const struct BoardStatus *bs; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsa", &bid, &boardname, &boardname_len, &array) != SUCCESS) WRONG_PARAM_COUNT; if (bid) { bh = getboard(bid); if (bh == NULL) { RETURN_NULL(); } } else { if (boardname_len == 0) { RETURN_NULL(); } if (boardname_len > BOARDNAMELEN) { boardname[BOARDNAMELEN] = 0; } bid = getbid(boardname, &bh); if (bid == 0) { RETURN_NULL(); } } nb = public_board(bh); if (!nb) { if (getCurrentUser() == NULL) { RETURN_NULL(); } if (!check_read_perm(getCurrentUser(), bh)) { RETURN_NULL(); } } bs = getbstatus(bid); if (array_init(array) != SUCCESS) { RETURN_NULL(); } assign_board(array, bh, bs, bid); if (nb) { RETURN_TRUE; } else { RETURN_FALSE; }}/** * Fetch all boards which have given prefix into an array. * prototype: * array bbs_getboards(char *prefix, int group, int flag); * * prefix: 分类讨论区代号 * group: 当获得目录版面(二级版面)内的版面时这个传入目录版面 bid,否则设置为 0 * prefix = '*', group = 0 的时候返回所有版面 * flag: bit 0 (LSB): yank (no use now) * 1 : no_brc. set to 1 when you don't need BRC info. (will speedup) * 2 : all_boards 只在 group = 0 的时候有效,如果设置为 1,就返回 * 所有版面,包括目录版面内的版面。设置成 0 的时候,目录版面 * 内的版面是不返回的。 * 3 : 新的返回值模式 * * @return array of loaded boards on success, * FALSE on failure. * @author roy * * original version by flyriver - removed by atppp */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; long flag, group; struct newpostdata *newpost_buffer; struct newpostdata *ptr; zval **columns; zval *element; int i; int j; int ac = ZEND_NUM_ARGS(); int brdnum, yank, no_brc, all_boards, new_return_mode; int total; /* * getting arguments */ if (ac != 3 || zend_parse_parameters(3 TSRMLS_CC, "sll", &prefix, &plen, &group,&flag) == FAILURE) { WRONG_PARAM_COUNT; } if (plen == 0) { RETURN_FALSE; } if (getCurrentUser() == NULL) { RETURN_FALSE; } total=get_boardcount(); yank = flag & 1; no_brc = flag & 2; all_boards = (flag & 4) && (group == 0); new_return_mode = (flag & 8);#if 0 if (getSession()->zapbuf==NULL) { char fname[STRLEN]; int fd, size; size = total* sizeof(int); getSession()->zapbuf = (int *) malloc(size); if (getSession()->zapbuf==NULL) { RETURN_FALSE; } for (i = 0; i < total; i++) getSession()->zapbuf[i] = 1; sethomefile(fname, getCurrentUser()->userid, ".lastread"); /*user的.lastread, zap信息 */ if ((fd = open(fname, O_RDONLY, 0600)) != -1) { size = total * sizeof(int); read(fd, getSession()->zapbuf, size); close(fd); } }#endif brdnum = 0; { int n; struct boardheader const *bptr; const char** namelist; int* indexlist; time_t tnow; tnow = time(0); namelist=(const char**)emalloc(sizeof(char**)*(total)); if (namelist==NULL) { RETURN_FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -