summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mbbsd/board.c161
-rw-r--r--mbbsd/name.c2
2 files changed, 85 insertions, 78 deletions
diff --git a/mbbsd/board.c b/mbbsd/board.c
index 66451224..dff99939 100644
--- a/mbbsd/board.c
+++ b/mbbsd/board.c
@@ -264,12 +264,17 @@ brc_unread(const char *fname, int bnum, const int *blist)
/* personal board state
* 相對於看板的 attr (BRD_* in ../include/pttstruct.h),
* 這些是因人而異的 flag */
-#define PBS_FAV 1
-#define PBS_BOARD 2
-#define PBS_LINE 4
-#define PBS_FOLDER 8
-#define PBS_TAG 16
-#define PBS_UNREAD 32
+#define NBRD_FAV 1
+#define NBRD_BOARD 2
+#define NBRD_LINE 4
+#define NBRD_FOLDER 8
+#define NBRD_TAG 16
+#define NBRD_UNREAD 32
+#define NBRD_SYMBOLIC 64
+
+#define BRD_LINK_TARGET(x) ((x)->nuser)
+#define TITLE_MATCH(bptr, key) ((key)[0] && !strcasestr((bptr)->title, (key)))
+#define GROUPOP() (currmode & MODE_GROUPOP)
#define FAVNB ".favnb"
@@ -287,10 +292,10 @@ static char choose_board_depth = 0;
static short brdnum;
static char yank_flag = 1;
-
-#define SYM2TAR_UID(_uid) bcache[_uid - 1].nuser
-#define SYM2TAR_BH(_bcache) &bcache[_bcache->nuser - 1]
-
+inline int getbid(boardheader_t *fh)
+{
+ return (fh - bcache);
+}
#define BRD_OLD 0
#define BRD_NEW 1
@@ -315,7 +320,7 @@ void updatenewfav(int mode)
for(i = 0; i < numboards + 1 && brd[i] != BRD_END; i++){
if(brd[i] == BRD_NEW){
- if(bcache[i].brdname[0] && Ben_Perm(&bcache[i])){ // check the permission if the board exsits
+ if(bcache[i].brdname[0] && HasPerm(&bcache[i])){ // check the permission if the board exsits
if(mode)
fav_add_board(i + 1);
brd[i] = BRD_OLD;
@@ -328,7 +333,7 @@ void updatenewfav(int mode)
}
if( i < numboards) // the board number may change
for(i-- ; i < numboards; i++){
- if(bcache[i].brdname[0] && Ben_Perm(&bcache[i])){
+ if(bcache[i].brdname[0] && HasPerm(&bcache[i])){
if(mode)
fav_add_board(i + 1);
brd[i] = BRD_OLD;
@@ -389,7 +394,7 @@ save_brdbuf(void)
}
int
-Ben_Perm(boardheader_t * bptr)
+HasPerm(boardheader_t * bptr)
{
register int level, brdattr;
@@ -447,7 +452,7 @@ check_newpost(boardstat_t * ptr)
int tbrc_list[BRC_MAXNUM], tbrc_num;
time_t ftime;
- ptr->myattr &= ~PBS_UNREAD;
+ ptr->myattr &= ~NBRD_UNREAD;
if (B_BH(ptr)->brdattr & BRD_GROUPBOARD)
return 0;
@@ -461,7 +466,7 @@ check_newpost(boardstat_t * ptr)
if ( brc_read_record(B_BH(ptr)->brdname, &tbrc_num, tbrc_list) == 0 ||
brc_unread_time(ftime, tbrc_num, tbrc_list) )
- ptr->myattr |= PBS_UNREAD;
+ ptr->myattr |= NBRD_UNREAD;
return 1;
}
@@ -506,10 +511,10 @@ addnewbrdstat(int n, int state)
ptr->bid = n + 1;
ptr->myattr = state;
- if ((B_BH(ptr)->brdattr & BRD_HIDE) && state == PBS_BOARD)
+ if ((B_BH(ptr)->brdattr & BRD_HIDE) && state == NBRD_BOARD)
B_BH(ptr)->brdattr |= BRD_POSTMASK;
if (yank_flag != 0)
- ptr->myattr &= ~PBS_FAV;
+ ptr->myattr &= ~NBRD_FAV;
check_newpost(ptr);
return ptr;
}
@@ -552,17 +557,17 @@ load_boards(char *key)
if ( !key[0] ){
if (get_item_type(&fav->favh[i]) == FAVT_LINE )
- state = PBS_LINE;
+ state = NBRD_LINE;
else if (get_item_type(&fav->favh[i]) == FAVT_FOLDER )
- state = PBS_FOLDER;
+ state = NBRD_FOLDER;
else {
bptr = &bcache[ fav_getid(&fav->favh[i]) - 1];
if( yank_flag == 0 )
- state = PBS_BOARD;
+ state = NBRD_BOARD;
else
continue;
if (is_set_attr(&fav->favh[i], FAVH_UNREAD))
- state |= PBS_UNREAD;
+ state |= NBRD_UNREAD;
}
} else {
if (get_item_type(&fav->favh[i]) == FAVT_LINE )
@@ -572,25 +577,25 @@ load_boards(char *key)
get_folder_title(fav_getid(&fav->favh[i])),
key)
)
- state = PBS_FOLDER;
+ state = NBRD_FOLDER;
else
continue;
}else{
bptr = &bcache[ fav_getid(&fav->favh[i]) - 1];
- if( Ben_Perm(bptr) && strcasestr(bptr->title, key))
- state = PBS_BOARD;
+ if( HasPerm(bptr) && strcasestr(bptr->title, key))
+ state = NBRD_BOARD;
else
continue;
if (is_set_attr(&fav->favh[i], FAVH_UNREAD))
- state |= PBS_UNREAD;
+ state |= NBRD_UNREAD;
}
}
if (is_set_attr(&fav->favh[i], FAVH_TAG))
- state |= PBS_TAG;
+ state |= NBRD_TAG;
if (is_set_attr(&fav->favh[i], FAVH_ADM_TAG))
- state |= PBS_TAG;
- addnewbrdstat(fav_getid(&fav->favh[i]) - 1, PBS_FAV | state);
+ state |= NBRD_TAG;
+ addnewbrdstat(fav_getid(&fav->favh[i]) - 1, NBRD_FAV | state);
}
if (brdnum == 0)
addnewbrdstat(0, 0);
@@ -602,12 +607,15 @@ load_boards(char *key)
for (i = 0; i < numboards; i++) {
if ((bptr = SHM->bsorted[type][i]) == NULL)
continue;
- n = (int)(bptr - bcache);
+ n = getbid(bptr);
if (!bptr->brdname[0] ||
- (bptr->brdattr & BRD_GROUPBOARD) ||
- !((state = Ben_Perm(bptr)) || (currmode & MODE_MENU)) ||
- (key[0] && !strcasestr(bptr->title, key)) ||
- (class_bid == -1 && bptr->nuser < 5))
+ !((state = HasPerm(bptr)) || GROUPOP()) ||
+ (bptr->brdattr & (BRD_GROUPBOARD | BRD_SYMBOLIC)) ||
+ TITLE_MATCH(bptr, key) ||
+ // XXX:
+ // class_bid == -1 should be remove
+ // if symbolic link work fine
+ (class_bid == -1 && bptr->nuser < 5))
continue;
addnewbrdstat(n, state);
}
@@ -626,15 +634,14 @@ load_boards(char *key)
nbrd = (boardstat_t *) malloc(childcount * sizeof(boardstat_t));
for (bptr = bptr->firstchild[type]; bptr != NULL;
bptr = bptr->next[type]) {
- n = (int)(bptr - bcache);
- if (!((state = Ben_Perm(bptr)) || (currmode & MODE_MENU))
- || (yank_flag == 0 && !(getbrdattr(n) & PBS_FAV)) ||
- (key[0] && !strcasestr(bptr->title, key)))
+ n = getbid(bptr);
+ state = HasPerm(bptr);
+ if ( !(state || GROUPOP()) || TITLE_MATCH(bptr, key) )
continue;
if (bptr->brdattr & BRD_SYMBOLIC) {
- bptr = SYM2TAR_BH(bptr);
- n = SYM2TAR_UID(n + 1) - 1;
- // "state" is set since B_BH get the target stuff
+ n = BRD_LINK_TARGET(bptr);
+ bptr = &bcache[n];
+ state |= NBRD_SYMBOLIC;
}
addnewbrdstat(n, state);
}
@@ -666,7 +673,7 @@ search_board()
CreateNameList();
for (num = 0; num < brdnum; num++)
if (yank_flag != 0 ||
- (nbrd[num].myattr & PBS_BOARD && Ben_Perm(B_BH(&nbrd[num]))) )
+ (nbrd[num].myattr & NBRD_BOARD && HasPerm(B_BH(&nbrd[num]))) )
AddNameList(B_BH(&nbrd[num])->brdname);
namecomplete(MSG_SELECT_BOARD, genbuf);
FreeNameList();
@@ -687,7 +694,7 @@ unread_position(char *dirfile, boardstat_t * ptr)
total = B_TOTAL(ptr);
num = total + 1;
- if ((ptr->myattr & PBS_UNREAD) && (fd = open(dirfile, O_RDWR)) > 0) {
+ if ((ptr->myattr & NBRD_UNREAD) && (fd = open(dirfile, O_RDWR)) > 0) {
if (!brc_initial(B_BH(ptr)->brdname)) {
num = 1;
} else {
@@ -722,11 +729,11 @@ unread_position(char *dirfile, boardstat_t * ptr)
static char
get_fav_type(boardstat_t *ptr)
{
- if (ptr->myattr & PBS_FOLDER)
+ if (ptr->myattr & NBRD_FOLDER)
return FAVT_FOLDER;
- else if (ptr->myattr & PBS_BOARD)
+ else if (ptr->myattr & NBRD_BOARD)
return FAVT_BOARD;
- else if (ptr->myattr & PBS_LINE)
+ else if (ptr->myattr & NBRD_LINE)
return FAVT_LINE;
return 0;
}
@@ -791,22 +798,22 @@ show_brdlist(int head, int clsflag, int newflag)
clrtoeol();
if (head < brdnum) {
ptr = &nbrd[head++];
- if (ptr->myattr & PBS_LINE){
+ if (ptr->myattr & NBRD_LINE){
if( !newflag )
prints("%5d %c %s------------ ------------------------------------------\033[m",
head,
- ptr->myattr & PBS_TAG ? 'D' : ' ',
- ptr->myattr & PBS_FAV ? "" : "\033[1;30m");
+ ptr->myattr & NBRD_TAG ? 'D' : ' ',
+ ptr->myattr & NBRD_FAV ? "" : "\033[1;30m");
else
- prints(" %s------------ ------------------------------------------\033[m", ptr->myattr & PBS_FAV ? "" : "\033[1;30m");
+ prints(" %s------------ ------------------------------------------\033[m", ptr->myattr & NBRD_FAV ? "" : "\033[1;30m");
continue;
}
- else if (ptr->myattr & PBS_FOLDER){
+ else if (ptr->myattr & NBRD_FOLDER){
char *title = get_folder_title(ptr->bid);
if( !newflag )
prints("%5d %c %sMyFavFolder\033[m 目錄 □%-34s\033[m",
head,
- ptr->myattr & PBS_TAG ? 'D' : ' ',
+ ptr->myattr & NBRD_TAG ? 'D' : ' ',
!(cuser.uflag2 & FAVNOHILIGHT) ? "\033[1;36m" : "",
title);
else
@@ -823,18 +830,18 @@ show_brdlist(int head, int clsflag, int newflag)
prints("%5d%c%s", head,
!(B_BH(ptr)->brdattr & BRD_HIDE) ? ' ' :
(B_BH(ptr)->brdattr & BRD_POSTMASK) ? ')' : '-',
- (ptr->myattr & PBS_TAG) ? "D " :
+ (ptr->myattr & NBRD_TAG) ? "D " :
(B_BH(ptr)->brdattr & BRD_GROUPBOARD) ? " " :
- unread[ptr->myattr & PBS_UNREAD ? 1 : 0]);
+ unread[ptr->myattr & NBRD_UNREAD ? 1 : 0]);
} else {
if (B_BH(ptr)->brdattr & BRD_GROUPBOARD)
prints(" ");
else
prints("%6d%s", (int)(B_TOTAL(ptr)),
- unread[ptr->myattr & PBS_UNREAD ? 1 : 0]);
+ unread[ptr->myattr & NBRD_UNREAD ? 1 : 0]);
}
if (class_bid != 1) {
- if (!(currmode & MODE_MENU) && !Ben_Perm(B_BH(ptr))) {
+ if (!GROUPOP() && !HasPerm(B_BH(ptr))) {
prints("Unknown?? 隱板 ?這個板是隱板");
}
else {
@@ -907,7 +914,7 @@ static void
set_menu_BM(char *BM)
{
if (HAS_PERM(PERM_ALLBOARD) || is_BM(BM)) {
- currmode |= MODE_MENU;
+ currmode |= MODE_GROUPOP;
cuser.userlevel |= PERM_SYSSUBOP;
}
}
@@ -947,7 +954,7 @@ choose_board(int newflag)
yank_flag++;
continue;
}
- if (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU)) {
+ if (HAS_PERM(PERM_SYSOP) || GROUPOP()) {
if (m_newbrd(0) == -1)
break;
brdnum = -1;
@@ -969,7 +976,7 @@ choose_board(int newflag)
tmp = num;
while (num < brdnum) {
ptr = &nbrd[num];
- if (ptr->myattr & PBS_UNREAD)
+ if (ptr->myattr & NBRD_UNREAD)
break;
num++;
}
@@ -1044,12 +1051,12 @@ choose_board(int newflag)
}
else if (yank_flag != 0) {
/* 站長管理用的 tag */
- if (ptr->myattr & PBS_TAG)
+ if (ptr->myattr & NBRD_TAG)
set_attr(getadmtag(ptr->bid), FAVH_ADM_TAG, 0);
else
fav_add_admtag(ptr->bid);
}
- ptr->myattr ^= PBS_TAG;
+ ptr->myattr ^= NBRD_TAG;
head = 9999;
case KEY_DOWN:
case 'n':
@@ -1124,7 +1131,7 @@ choose_board(int newflag)
break;
case Ctrl('P'):
if (class_bid != 0 &&
- (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU))) {
+ (HAS_PERM(PERM_SYSOP) || GROUPOP())) {
fav_t *fav = get_current_fav();
for (tmp = 0; tmp < fav->DataTail; tmp++) {
short bid = fav_getid(&fav->favh[tmp]);
@@ -1172,23 +1179,23 @@ choose_board(int newflag)
if (HAS_PERM(PERM_BASIC)) {
ptr = &nbrd[num];
if (yank_flag == 0) {
- if (ptr->myattr & PBS_FAV) {
+ if (ptr->myattr & NBRD_FAV) {
if (getans("你確定刪除嗎? [N/y]") != 'y')
break;
fav_remove_item(ptr->bid, get_fav_type(ptr));
- ptr->myattr &= ~PBS_FAV;
+ ptr->myattr &= ~NBRD_FAV;
}
}
else {
if (getboard(ptr->bid) != NULL) {
fav_remove_item(ptr->bid, FAVT_BOARD);
- ptr->myattr &= ~PBS_FAV;
+ ptr->myattr &= ~NBRD_FAV;
}
else {
if (fav_add_board(ptr->bid) == NULL)
vmsg("你的最愛太多了啦 真花心");
else
- ptr->myattr |= PBS_FAV;
+ ptr->myattr |= NBRD_FAV;
}
}
brdnum = -1;
@@ -1224,7 +1231,7 @@ choose_board(int newflag)
}
break;
case 'T':
- if (HAS_PERM(PERM_BASIC) && nbrd[num].myattr & PBS_FOLDER) {
+ if (HAS_PERM(PERM_BASIC) && nbrd[num].myattr & NBRD_FOLDER) {
fav_type_t *ft = getfolder(nbrd[num].bid);
strlcpy(buf, get_item_title(ft), sizeof(buf));
getdata_buf(b_lines - 1, 0, "請輸入板名:", buf, 65, DOECHO);
@@ -1294,16 +1301,16 @@ choose_board(int newflag)
case 'v':
case 'V':
ptr = &nbrd[num];
- if(nbrd[num].bid < 0 || !Ben_Perm(B_BH(ptr)))
+ if(nbrd[num].bid < 0 || !HasPerm(B_BH(ptr)))
break;
if (ch == 'v') {
- ptr->myattr &= ~PBS_UNREAD;
+ ptr->myattr &= ~NBRD_UNREAD;
brc_trunc(B_BH(ptr)->brdname, now);
setbrdtime(ptr->bid, now);
} else {
brc_trunc(B_BH(ptr)->brdname, 1);
setbrdtime(ptr->bid, 1);
- ptr->myattr |= PBS_UNREAD;
+ ptr->myattr |= NBRD_UNREAD;
}
show_brdlist(head, 0, newflag);
break;
@@ -1315,7 +1322,7 @@ choose_board(int newflag)
num = tmp;
break;
case 'E':
- if (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU)) {
+ if (HAS_PERM(PERM_SYSOP) || GROUP_OP()) {
ptr = &nbrd[num];
move(1, 1);
clrtobot();
@@ -1324,20 +1331,20 @@ choose_board(int newflag)
}
break;
case 'R':
- if (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU)) {
+ if (HAS_PERM(PERM_SYSOP) || GROUP_OP()) {
m_newbrd(1);
brdnum = -1;
}
break;
case 'B':
- if (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU)) {
+ if (HAS_PERM(PERM_SYSOP) || GROUP_OP()) {
m_newbrd(0);
brdnum = -1;
}
break;
case 'W':
if (class_bid > 0 &&
- (HAS_PERM(PERM_SYSOP) || (currmode & MODE_MENU))) {
+ (HAS_PERM(PERM_SYSOP) || GROUP_OP())) {
setbpath(buf, bcache[class_bid - 1].brdname);
mkdir(buf, 0755); /* Ptt:開群組目錄 */
b_note_edit_bname(class_bid);
@@ -1359,9 +1366,9 @@ choose_board(int newflag)
ptr = &nbrd[num];
if (yank_flag == 0 && get_fav_type(&nbrd[0]) == 0)
break;
- else if (ptr->myattr & PBS_LINE)
+ else if (ptr->myattr & NBRD_LINE)
break;
- else if (ptr->myattr & PBS_FOLDER){
+ else if (ptr->myattr & NBRD_FOLDER){
int t = num;
num = 0;
fav_folder_in(ptr->bid);
@@ -1374,7 +1381,7 @@ choose_board(int newflag)
}
if (!(B_BH(ptr)->brdattr & BRD_GROUPBOARD)) { /* 非sub class */
- if (Ben_Perm(B_BH(ptr))) {
+ if (HasPerm(B_BH(ptr))) {
brc_initial(B_BH(ptr)->brdname);
if (newflag) {
@@ -1400,7 +1407,7 @@ choose_board(int newflag)
else
class_bid = -1; /* 熱門群組用 */
- if (!(currmode & MODE_MENU)) /* 如果還沒有小組長權限 */
+ if (!GROUP_OP()) /* 如果還沒有小組長權限 */
set_menu_BM(B_BH(ptr)->BM);
if (now < B_BH(ptr)->bupdate) {
diff --git a/mbbsd/name.c b/mbbsd/name.c
index 0b58604e..cfeceb3c 100644
--- a/mbbsd/name.c
+++ b/mbbsd/name.c
@@ -674,7 +674,7 @@ completeboard_compar(int where, char *str, int len)
int
completeboard_permission(int where)
{
- return (((currmode & MODE_MENU) || Ben_Perm(SHM->bsorted[0][where])) &&
+ return (((currmode & MODE_GROUPOP) || Ben_Perm(SHM->bsorted[0][where])) &&
!(SHM->bsorted[0][where]->brdattr & BRD_GROUPBOARD));
}