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