phpbbslib.c

来自「bbs server linux平台下软件源码」· C语言 代码 · 共 2,310 行 · 第 1/5 页

C
2,310
字号
    rows = brdnum;              /* number of loaded boards */    /*     * fill data in output array.      */    /*     * 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);    }    /*     * fill data for each column      */    for (i = 0; i < rows; i++) {        ptr = &newpost_buffer[i];        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(columns);}#endif/** * Fetch a list of articles in a board into an array. * prototype: * array bbs_getarticles(char *board, int start, int num, int mode); * * @return array of loaded articles on success, *         FALSE on failure. * @author flyriver */static PHP_FUNCTION(bbs_getarticles){    char *board;    int blen;    int start;    int num;    int mode;    char dirpath[STRLEN];    char dirpath1[STRLEN];      /* add by stiger */    int total;    struct fileheader *articles;    struct boardheader *bp;    int rows;    int i;    zval *element;    int is_bm;    char flags[4];              /* flags[0]: flag character                                 * flags[1]: imported flag                                 * flags[2]: no reply flag                                 * flags[3]: attach flag                                 */    int ac = ZEND_NUM_ARGS();    /*     * getting arguments      */    if (ac != 4 || zend_parse_parameters(4 TSRMLS_CC, "slll", &board, &blen, &start, &num, &mode) == FAILURE) {        WRONG_PARAM_COUNT;    }    /*     * checking arguments      */    if (currentuser == NULL) {        RETURN_FALSE;    }    if ((bp = getbcache(board)) == NULL) {        RETURN_FALSE;    }    is_bm = is_BM(bp, currentuser);    setbdir(mode, dirpath, bp->filename);    total = get_num_records(dirpath, sizeof(struct fileheader));    /*     * add by stiger      */    if (mode == DIR_MODE_NORMAL) {        sprintf(dirpath1, "boards/%s/" DING_DIR, bp->filename);        total += get_num_records(dirpath1, sizeof(struct fileheader));    }    /*     * add end      */    if (start > (total - num + 1))        start = (total - num + 1);    if (start <= 0)        start = 1;    /*     * fetching articles      */    if (array_init(return_value) == FAILURE) {        RETURN_FALSE;    }#ifdef HAVE_BRC_CONTROL    brc_initial(currentuser->userid, bp->filename);#endif    articles = emalloc(num * sizeof(struct fileheader));    if (articles == NULL) {        RETURN_FALSE;    }    /*     * modified by stiger      */    if (mode == DIR_MODE_NORMAL)        rows = read_get_records(dirpath, dirpath1, articles, sizeof(struct fileheader), start, num);    else        rows = get_records(dirpath, articles, sizeof(struct fileheader), start, num);    for (i = 0; i < rows; i++) {        MAKE_STD_ZVAL(element);        array_init(element);        flags[0] = get_article_flag(articles + i, currentuser, bp->filename, is_bm);        if (is_bm && (articles[i].accessed[0] & FILE_IMPORTED))            flags[1] = 'y';        else            flags[1] = 'n';        if (articles[i].accessed[1] & FILE_READ)            flags[2] = 'y';        else            flags[2] = 'n';        if (articles[i].attachment)            flags[3] = '@';        else            flags[3] = ' ';        bbs_make_article_array(element, articles + i, flags, sizeof(flags));        zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &element, sizeof(zval *), NULL);    }    efree(articles);}static PHP_FUNCTION(bbs_getwebmsgs){    char *user;    int user_len;    char buf[MAX_MSG_SIZE], showmsg[MAX_MSG_SIZE * 2], chk[STRLEN];    int count, i;    char title[STRLEN];    struct msghead head;    char fname[STRLEN];    zval *element;    if (ZEND_NUM_ARGS() != 0) {        WRONG_PARAM_COUNT;    }    if (!HAS_PERM(currentuser, PERM_PAGE))        RETURN_LONG(-1);    if (array_init(return_value) == FAILURE) {        RETURN_LONG(-2);    }    count = get_msgcount(0, currentuser->userid);    if (count != 0) {        for (i = 0; i < count; i++) {            load_msghead(0, currentuser->userid, i, &head);            load_msgtext(currentuser->userid, &head, buf);            MAKE_STD_ZVAL(element);            array_init(element);            add_assoc_string(element, "ID", head.id, 1);            add_assoc_long(element, "TIME", head.time);            add_assoc_string(element, "content", buf, 1);            add_assoc_long(element, "MODE", head.mode);            add_assoc_long(element, "SENT", head.sent ? 0 : 1);            zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &element, sizeof(zval *), NULL);        }    }}static PHP_FUNCTION(bbs_mailwebmsgs){    if (ZEND_NUM_ARGS() != 0) {        WRONG_PARAM_COUNT;    }    mail_msg(currentuser);    RETURN_TRUE;}/** * 获取版面精华主题数量 * prototype: * int bbs_get_elite_num(char *board); * * @return elite top number *         < 0 on failure. * @author roy */static PHP_FUNCTION(bbs_get_elite_num){    RETURN_FALSE;}/** * 获取从start开始的num个精华主题 * prototype: * array bbs_get_elite_list(char *board, int start, int num); * * @return array of loaded articles on success, *         FALSE on failure. * @author roy */static PHP_FUNCTION(bbs_get_elite_list){    RETURN_FALSE;}/** * 获取从start开始的num个版面主题 * prototype: * array bbs_getthreads(char *board, int start, int num,int includeTop); * * @return array of loaded articles on success, *         FALSE on failure. * @author roy */static PHP_FUNCTION(bbs_getthreads){    char *board;    int blen;    int start, num;    int total;    struct boardheader *bp = NULL;    char dirpath[STRLEN];    int i, j;    zval *element;    int is_bm;    char flags[4];              /* flags[0]: flag character                                 * flags[1]: imported flag                                 * flags[2]: no reply flag                                 * flags[3]: attach flag                                 */    int fd;    struct stat buf;    struct flock ldata;    struct wwwthreadheader *ptr1 = NULL;    char *ptr;    unsigned int long found;    int includeTop;    int skip;    int ac = ZEND_NUM_ARGS();    int begin, end;    zval *columns[3];    char *thread_col_names[] = { "origin", "lastreply", "articlenum" };    getcwd(old_pwd, 1023);    chdir(BBSHOME);    /*     * getting arguments      */    if (ac != 4 || zend_parse_parameters(4 TSRMLS_CC, "slll", &board, &blen, &start, &num, &includeTop) == FAILURE) {        WRONG_PARAM_COUNT;    }    if (start < 0) {        RETURN_FALSE;    }    if (num < 0) {        RETURN_FALSE;    }    /*     * checking arguments      */    if (currentuser == NULL) {        RETURN_FALSE;    }    if ((bp = getbcache(board)) == NULL) {        RETURN_FALSE;    }    is_bm = is_BM(bp, currentuser);    if (array_init(return_value) == FAILURE) {        RETURN_FALSE;    }#ifdef HAVE_BRC_CONTROL    brc_initial(currentuser->userid, bp->filename);#endif    setbdir(DIR_MODE_WEB_THREAD, dirpath, bp->filename);    if ((fd = open(dirpath, O_RDONLY, 0)) == -1) {        RETURN_LONG(-1);    }    ldata.l_type = F_RDLCK;    ldata.l_whence = 0;    ldata.l_len = 0;    ldata.l_start = 0;    if (fcntl(fd, F_SETLKW, &ldata) == -1) {        close(fd);        RETURN_LONG(-200);    }    if (fstat(fd, &buf) == -1) {        ldata.l_type = F_UNLCK;        fcntl(fd, F_SETLKW, &ldata);        close(fd);        RETURN_LONG(-201);    }    total = buf.st_size / sizeof(struct wwwthreadheader);    if ((i = safe_mmapfile_handle(fd, O_RDONLY, PROT_READ, MAP_SHARED, (void **) &ptr, (size_t *) & buf.st_size)) != 1) {        if (i == 2)            end_mmapfile((void *) ptr, buf.st_size, -1);        ldata.l_type = F_UNLCK;        fcntl(fd, F_SETLKW, &ldata);        close(fd);        RETURN_LONG(-2);    }    ptr1 = (struct fileheader *) ptr;    /*     * fetching articles      */    total--;    if (!includeTop) {        for (i = total; i >= 0; i--) {            if (!(ptr1[i].flags & FILE_ON_TOP))                break;        }        total = i;    }    begin = total - start;    end = total - start - num + 1;    if (end < 0)        end = 0;    for (i = begin; i >= end; i--) {        MAKE_STD_ZVAL(element);        array_init(element);        for (j = 0; j < 3; j++) {            MAKE_STD_ZVAL(columns[j]);            zend_hash_update(Z_ARRVAL_P(element), thread_col_names[j], strlen(thread_col_names[j]) + 1, (void *) &columns[j], sizeof(zval *), NULL);        }        flags[0] = get_article_flag(&(ptr1[i].origin), currentuser, bp->filename, is_bm);        if (is_bm && (ptr1[i].origin.accessed[0] & FILE_IMPORTED))            flags[1] = 'y';        else            flags[1] = 'n';        if (ptr1[i].origin.accessed[1] & FILE_READ)            flags[2] = 'y';        else            flags[2] = 'n';        if (ptr1[i].origin.attachment)            flags[3] = '@';        else            flags[3] = ' ';        array_init(columns[0]);        bbs_make_article_array(columns[0], &(ptr1[i].origin), flags, sizeof(flags));        flags[0] = get_article_flag(&(ptr1[i].lastreply), currentuser, bp->filename, is_bm);        if (is_bm && (ptr1[i].lastreply.accessed[0] & FILE_IMPORTED))            flags[1] = 'y';        else            flags[1] = 'n';        if (ptr1[i].lastreply.accessed[1] & FILE_READ)            flags[2] = 'y';        else            flags[2] = 'n';        if (ptr1[i].lastreply.attachment)            flags[3] = '@';        else            flags[3] = ' ';        array_init(columns[1]);        bbs_make_article_array(columns[1], &(ptr1[i].lastreply), flags, sizeof(flags));        ZVAL_LONG(columns[2], ptr1[i].articlecount);        zend_hash_index_update(Z_ARRVAL_P(return_value), begin - i, (void *) &element, sizeof(zval *), NULL);    }    end_mmapfile((void *) ptr, buf.st_size, -1);    ldata.l_type = F_UNLCK;    fcntl(fd, F_SETLKW, &ldata);        /* 退出互斥区域 */    close(fd);}#ifdef HAVE_WFORUMstatic PHP_FUNCTION(bbs_get_article){    char *board;    int blen;    int groupid;    int total;    struct fileheader *articles;    struct boardheader *bp;    char dirpath[STRLEN];    zval *element;    int is_bm;    char flags[4];              /* flags[0]: flag character                                 * flags[1]: imported flag                                 * flags[2]: no reply flag                                 * flags[3]: attach flag                                 */    int ac = ZEND_NUM_ARGS();    unsigned int articlesFounded;    int fd;    int i;    struct stat buf;    struct flock ldata;    struct fileheader *ptr1;    char *ptr;    unsigned int found;    /*     * getting arguments      */    if (ac != 2 || zend_parse_parameters(2 TSRMLS_CC, "sl", &board, &blen, &groupid) == FAILURE) {        WRONG_PARAM_COUNT;    }    if (groupid < 0) {        RETURN_LONG(-3);    }    /*     * checking arguments      */    if (currentuser == NULL) {        RETURN_LONG(-4);    }    if ((bp = getbcache(board)) == NULL) {        RETURN_LONG(-5);    }    is_bm = is_BM(bp, currentuser);    setbdir(DIR_MODE_NORMAL, dirpath, bp->filename);    if ((fd = open(dirpath, O_RDONLY, 0)) == -1)        RETURN_LONG(-6);    ldata.l_type = F_RDLCK;    ldata.l_whence = 0;    ldata.l_len = 0;    ldata.l_start = 0;    if (fcntl(fd, F_SETLKW, &ldata) == -1) {        close(fd);        RETURN_LONG(-200);    }    if (fstat(fd, &buf) == -1) {        ldata.l_type = F_UNLCK;        fcntl(fd, F_SETLKW, &ldata);        close(fd);        RETURN_LONG(-201);    }    total = buf.st_size / sizeof(struct fileheader);    if ((i = safe_mmapfile_handle(fd, O_RDONLY, PROT_READ, MAP_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?