⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phpbbs.board.c

📁 linux/unix环境下的建站系统
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -