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