From 50a91ac9fcb6ffa78377e8fb81adb65e7c3a91c7 Mon Sep 17 00:00:00 2001 From: scw Date: Mon, 5 Apr 2004 07:42:05 +0000 Subject: Merge from brc2 branch. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@1695 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/board.c | 307 ++-------------------------------------------------------- 1 file changed, 8 insertions(+), 299 deletions(-) (limited to 'mbbsd/board.c') diff --git a/mbbsd/board.c b/mbbsd/board.c index 200376eb..446f1103 100644 --- a/mbbsd/board.c +++ b/mbbsd/board.c @@ -1,298 +1,5 @@ /* $Id$ */ #include "bbs.h" -#define BRC_STRLEN 15 /* Length of board name */ -#define BRC_MAXSIZE 24576 /* Effective size of brc rc file */ -#define BRC_ITEMSIZE (BRC_STRLEN + 1 + BRC_MAXNUM * sizeof( int )) - /* Maximum size of each record */ -#define BRC_MAXNUM 80 /* Upper bound of brc_num, size of brc_list */ - -/* brc rc file form: - * board_name 15 bytes - * brc_num 1 byte, binary integer - * brc_list brc_num * sizeof(int) bytes, brc_num binary integer(s) */ - -static time_t brc_expire_time; - /* Will be set to the time one year before login. All the files created - * before then will be recognized read. */ - -static int brc_changed = 0; -/* The below two will be filled by read_brc_buf() and brc_update() */ -static char *brc_buf = NULL; -static int brc_size; - -static char * const fn_boardrc = ".boardrc"; - -static char * -brc_getrecord(char *ptr, char *endp, char *name, int *pnum, int *list) -{ - int num; - char *tmp; - - if (ptr + BRC_STRLEN + 1 > endp) return endp + 1; - strncpy(name, ptr, BRC_STRLEN); /* board_name */ - ptr += BRC_STRLEN; - num = (*ptr++) & 0xff; /* brc_num */ - tmp = ptr + num * sizeof(int); /* end of this record */ - if (tmp <= endp){ - if (num > BRC_MAXNUM) /* FIXME if this happens... may crash next time. */ - num = BRC_MAXNUM; - *pnum = num; - memcpy(list, ptr, num * sizeof(int)); /* brc_list */ - } - return tmp; -} - -static char * -brc_putrecord(char *ptr, char *endp, const char *name, int num, const int *list) -{ - if (num > 0 && list[0] > brc_expire_time && - ptr + BRC_STRLEN + 1 <= endp) { - if (num > BRC_MAXNUM) - num = BRC_MAXNUM; - - while (num > 1 && list[num - 1] < brc_expire_time) - num--; /* not to write the times before brc_expire_time */ - - if( num == 0 ) return ptr; - - strncpy(ptr, name, BRC_STRLEN); /* write in board_name */ - ptr += BRC_STRLEN; - *ptr++ = num; /* write in brc_num */ - if (ptr + num * sizeof(int) <= endp) - memcpy(ptr, list, num * sizeof(int)); /* write in brc_list */ - ptr += num * sizeof(int); - } - return ptr; -} - -static inline void -brc_insert_record(const char* board, int num, int* list) -{ - char *ptr, *endp, *tmpp = 0; - char tmp_buf[BRC_ITEMSIZE]; - char tmp_name[BRC_STRLEN]; - int tmp_list[BRC_MAXNUM]; - int new_size, end_size, tmp_num; - int found = 0; - - ptr = brc_buf; - endp = &brc_buf[brc_size]; - while (ptr < endp && (*ptr >= ' ' && *ptr <= 'z')) { - /* for each available records */ - tmpp = brc_getrecord(ptr, endp, tmp_name, &tmp_num, tmp_list); - - if ( tmpp > endp ){ - /* dangling, ignore the trailing data */ - brc_size = (int)(ptr - brc_buf); - break; - } - if ( strncmp(tmp_name, board, BRC_STRLEN) == 0 ){ - found = 1; - break; - } - ptr = tmpp; - } - - if( ! found ){ - /* put on the beginning */ - ptr = brc_putrecord(tmp_buf, tmp_buf + BRC_MAXSIZE, - board, num, list); - new_size = (int)(ptr - tmp_buf); - if( new_size ){ - brc_size += new_size; - if ( brc_size > BRC_MAXSIZE ) - brc_size = BRC_MAXSIZE; - memmove(brc_buf + new_size, brc_buf, brc_size); - memmove(brc_buf, tmp_buf, new_size); - } - }else{ - /* ptr points to the old current brc list. - * tmpp is the end of it (exclusive). */ - end_size = endp - tmpp; - new_size = (int)(brc_putrecord(tmp_buf, tmp_buf + BRC_ITEMSIZE, - board, num, list) - tmp_buf); - if( new_size ){ - brc_size += new_size - (tmpp - ptr); - if ( brc_size > BRC_MAXSIZE ){ - end_size -= brc_size - BRC_MAXSIZE; - brc_size = BRC_MAXSIZE; - } - if ( end_size > 0 && ptr + new_size != tmpp ) - memmove(ptr + new_size, tmpp, end_size); - memmove(ptr, tmp_buf, new_size); - }else - memmove(ptr, tmpp, brc_size - (tmpp - brc_buf)); - } - - brc_changed = 0; -} - -void -brc_update(){ - if (brc_changed && cuser->userlevel && brc_num > 0) - brc_insert_record(currboard, brc_num, brc_list); -} - -inline static void -read_brc_buf() -{ - if( brc_buf == NULL ){ - char dirfile[STRLEN]; - int fd; - - brc_buf = malloc(BRC_MAXSIZE); - setuserfile(dirfile, fn_boardrc); - if ((fd = open(dirfile, O_RDONLY)) != -1) { - brc_size = read(fd, brc_buf, BRC_MAXSIZE); - close(fd); - } else { - brc_size = 0; - } - } -} - -void -brc_finalize(){ - char brcfile[STRLEN]; - int fd; - brc_update(); - setuserfile(brcfile, fn_boardrc); - if (brc_buf != NULL && - (fd = open(brcfile, O_WRONLY | O_CREAT | O_TRUNC, 0644)) != -1) { - write(fd, brc_buf, brc_size); - close(fd); - } -} - -void -brc_initialize(){ - static char done = 0; - if( done ) - return; - done = 1; - brc_expire_time = login_start_time - 365 * 86400; - read_brc_buf(); -} - -int -brc_read_record(const char* bname, int* num, int* list){ - char *ptr; - char *endp; - char tmp_name[BRC_STRLEN]; - ptr = brc_buf; - endp = &brc_buf[brc_size]; - while (ptr < endp && (*ptr >= ' ' && *ptr <= 'z')) { - /* for each available records */ - ptr = brc_getrecord(ptr, endp, tmp_name, num, list); - if (strncmp(tmp_name, bname, BRC_STRLEN) == 0) - return *num; - } - *num = list[0] = 1; - return 0; -} - -int -brc_initial_board(const char *boardname) -{ - brc_initialize(); - - if (strcmp(currboard, boardname) == 0) { - return brc_num; - } - - brc_update(); /* write back first */ - strlcpy(currboard, boardname, sizeof(currboard)); - currbid = getbnum(currboard); - currbrdattr = bcache[currbid - 1].brdattr; - - return brc_read_record(boardname, &brc_num, brc_list); -} - -static void -brc_trunc(const char* brdname, int ftime){ - brc_insert_record(brdname, 1, &ftime); - if (strncmp(brdname, currboard, BRC_STRLEN) == 0){ - brc_num = 1; - brc_list[0] = ftime; - brc_changed = 0; - } -} - -void -brc_addlist(const char *fname) -{ - int ftime, n, i; - - if (!cuser->userlevel) - return; - - ftime = atoi(&fname[2]); - if (ftime <= brc_expire_time /* too old, don't do any thing */ - /* || fname[0] != 'M' || fname[1] != '.' */ ) { - return; - } - if (brc_num <= 0) { /* uninitialized */ - brc_list[0] = ftime; - brc_num = 1; - brc_changed = 1; - return; - } - if ((brc_num == 1) && (ftime < brc_list[0])) /* most when after 'v' */ - return; - for (n = 0; n < brc_num; n++) { /* using linear search */ - if (ftime == brc_list[n]) { - return; - } else if (ftime > brc_list[n]) { - if (brc_num < BRC_MAXNUM) - brc_num++; - /* insert ftime in to brc_list */ - for (i = brc_num - 1; --i >= n; brc_list[i + 1] = brc_list[i]); - brc_list[n] = ftime; - brc_changed = 1; - return; - } - } -} - -static int -brc_unread_time(time_t ftime, int bnum, const int *blist) -{ - int n; - - if (ftime <= brc_expire_time) /* too old */ - return 0; - - if (brc_num <= 0) - return 1; - for (n = 0; n < bnum; n++) { /* using linear search */ - if (ftime > blist[n]) - return 1; - else if (ftime == blist[n]) - return 0; - } - return 0; -} - -int -brc_unread(const char *fname, int bnum, const int *blist) -{ - int ftime, n; - - ftime = atoi(&fname[2]); /* this will get the time of the file created */ - - if (ftime <= brc_expire_time) /* too old */ - return 0; - - if (brc_num <= 0) - return 1; - for (n = 0; n < bnum; n++) { /* using linear search */ - if (ftime > blist[n]) - return 1; - else if (ftime == blist[n]) - return 0; - } - return 0; -} /* personal board state * 相對於看板的 attr (BRD_* in ../include/pttstruct.h), @@ -343,7 +50,8 @@ void imovefav(int old) void init_brdbuf() { - brc_initialize(); + if (brc_initialize()) + return; brc_initial_board(DEFAULT_BOARD); set_board(); } @@ -411,8 +119,9 @@ have_author(char *brdname) static int check_newpost(boardstat_t * ptr) { /* Ptt 改 */ - int tbrc_list[BRC_MAXNUM], tbrc_num; + int tbrc_num; time_t ftime; + time_t *tbrc_list; ptr->myattr &= ~NBRD_UNREAD; if (B_BH(ptr)->brdattr & BRD_GROUPBOARD) @@ -426,8 +135,8 @@ check_newpost(boardstat_t * ptr) if (ftime > now) ftime = B_LASTPOSTTIME(ptr) = now - 1; - if ( brc_read_record(B_BH(ptr)->brdname, &tbrc_num, tbrc_list) == 0 || - brc_unread_time(ftime, tbrc_num, tbrc_list) ) + tbrc_list = brc_find_record(ptr->bid, &tbrc_num); + if ( brc_unread_time(ftime, tbrc_num, tbrc_list) ) ptr->myattr |= NBRD_UNREAD; return 1; @@ -1298,10 +1007,10 @@ choose_board(int newflag) break; if (ch == 'v') { ptr->myattr &= ~NBRD_UNREAD; - brc_trunc(B_BH(ptr)->brdname, now); + brc_trunc(ptr->bid, now); setbrdtime(ptr->bid, now); } else { - brc_trunc(B_BH(ptr)->brdname, 1); + brc_trunc(ptr->bid, 1); setbrdtime(ptr->bid, 1); ptr->myattr |= NBRD_UNREAD; } -- cgit v1.2.3