From b9eee7301a59036c791b0cabef44092aaedc9c80 Mon Sep 17 00:00:00 2001 From: piaip Date: Wed, 20 Apr 2005 13:48:18 +0000 Subject: convenient board watcher tools. Suggestion: .BRD should have '0RootClass' as first board ([0]). Because the buggy board class thinks .BRD[0] as class root. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2702 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- util/shmctl.c | 89 +++++++++++++++++++++++++++++++++++++++++++------------- util/showboard.c | 56 ++++++++++++++++++++++++++++++----- 2 files changed, 118 insertions(+), 27 deletions(-) diff --git a/util/shmctl.c b/util/shmctl.c index dcaeadcd..0430f4f1 100644 --- a/util/shmctl.c +++ b/util/shmctl.c @@ -589,29 +589,77 @@ int listpid(int argc, char **argv) int listbrd(int argc, char **argv) { - int i, ch; - int noHidden = 0; + int i = 0; - while( (ch = getopt(argc, argv, "hn")) != -1 ) - switch( ch ){ - case 'n': - noHidden = 1; - break; - case 'h': - default: - printf("usage:\tshmctl\tlistbrd [-n]\n" - "\t-n no hidden board\n"); - return 0; - } + if (argc == 2) + i = atoi(argv[1]); + + if(i > 0 && i < MAX_BOARD) + { + int di = i; + + /* print details */ + boardheader_t b = bcache[di-1]; + printf("brdname(bid):\t%s\n", b.brdname); + printf("title:\t%s\n", b.title); + printf("BM:\t%s\n", b.BM); + printf("brdattr:\t%08x\n", b.brdattr); + printf("post_limit_posts:\t%d\n", b.post_limit_posts); + printf("post_limit_logins:\t%d\n", b.post_limit_logins); + printf("post_limit_regtime:\t%d\n", b.post_limit_regtime); + printf("level:\t%d\n", b.level); + printf("gid:\t%d\n", b.gid); + printf("parent:\t%d\n", b.parent); + printf("childcount:\t%d\n", b.childcount); + printf("nuser:\t%d\n", b.nuser); + + printf("next[0]:\t%d\n", b.next[0]); + printf("next[1]:\t%d\n", b.next[1]); + printf("firstchild[0]:\t%d\n", b.firstchild[0]); + printf("firstchild[1]:\t%d\n", b.firstchild[1]); + printf("---- children: ---- \n"); + for (i = 0; i < MAX_BOARD; i++) + { + if(bcache[i].gid == di && bcache[i].brdname[0]) + printf("%4d %-13s%-25.25s%s\n", + i+1, bcache[i].brdname, + bcache[i].BM, bcache[i].title); + } + } else + for( i = 0 ; i < MAX_BOARD ; ++i ) + { + if(bcache[i].brdname[0]) + printf("%03d %-13s%-25.25s%s\n", i+1, bcache[i].brdname, bcache[i].BM, bcache[i].title); + } + return 0; +} + +static void update_brd(int i) { + if(substitute_record(BBSHOME "/" FN_BOARD, &bcache[i],sizeof(boardheader_t),i+1) < 0) { + printf("\n! CANNOT WRITE: " BBSHOME "/" FN_BOARD "\n"); + exit(0); + } +} + +int fixbrd(int argc, char **argv) +{ + int i = 0; for( i = 0 ; i < MAX_BOARD ; ++i ) - if( bcache[i].brdname[0] && !(bcache[i].brdattr & BRD_GROUPBOARD) && - (!noHidden || - !((bcache[i].brdattr & BRD_HIDE) || - (bcache[i].level && !(bcache[i].brdattr & BRD_POSTMASK) && - (bcache[i].level & - ~(PERM_BASIC|PERM_CHAT|PERM_PAGE|PERM_POST|PERM_LOGINOK))))) ) - printf("%s\n", bcache[i].brdname); + { + if(!bcache[i].brdname[0]) + continue; + /* do whatever you wanna fix here. */ + if(bcache[i].parent > MAX_BOARD) { + printf("parent: #%d [%s] *%d\n", i+1, bcache[i].brdname, bcache[i].parent); + bcache[i].parent = 0; + update_brd(i); + } + if(bcache[i].gid < 1) { + printf("gid: #%d [%s] *%d\n", i+1, bcache[i].brdname, bcache[i].gid); + } +// update_brd(i); + } return 0; } @@ -986,6 +1034,7 @@ struct { {utmpstatus, "utmpstatus", "list utmpstatus"}, {listpid, "listpid", "list all pids of mbbsd"}, {listbrd, "listbrd", "list board info in SHM"}, + {fixbrd, "fixbrd", "fix board info in SHM"}, {hotboard, "hotboard", "list boards of most bfriends"}, {usermode, "usermode", "list #users in the same mode"}, {showstat, "showstat", "show statistics"}, diff --git a/util/showboard.c b/util/showboard.c index 0b473569..77bde9f1 100644 --- a/util/showboard.c +++ b/util/showboard.c @@ -16,11 +16,11 @@ int main(argc, argv) int argc; char *argv[]; { - int inf, i, count; + int inf, i = 0, detail_i = 0, count; if (argc < 2) { - printf("Usage:\t%s .BRD [MAXUSERS]\n", argv[0]); + printf("Usage:\t%s .BRD [bid]\n", argv[0]); exit(1); } @@ -47,16 +47,58 @@ int main(argc, argv) /* sort them by name */ count = i; +#if 0 qsort(allbrd, count, sizeof(boardheader_t), board_cmp); +#endif /* write out the target file */ - printf( - "看板名稱 板主 類別 中文敘述\n" - "----------------------------------------------------------------------\n"); - for (i = 0; i < count; i++) + if (argc > 2) { - printf("%-13s%-25.25s%s\n", allbrd[i].brdname, allbrd[i].BM, allbrd[i].title); + detail_i = atoi(argv[2]); + if (detail_i >= count) + detail_i = -1; + } else { + detail_i = -1; + } + + if (detail_i < 0) { + printf( + " 看板名稱 板主 類別 中文敘述\n" + " -----------------------------------------------------------------\n"); + for (i = 0; i < count; i++) + { + printf("%4d %-13s%-25.25s%s\n", i, allbrd[i].brdname, allbrd[i].BM, allbrd[i].title); + } + } else { + /* print details */ + boardheader_t b = allbrd[detail_i]; + printf("brdname(bid):\t%s\n", b.brdname); + printf("title:\t%s\n", b.title); + printf("BM:\t%s\n", b.BM); + printf("brdattr:\t%08x\n", b.brdattr); + printf("post_limit_posts:\t%d\n", b.post_limit_posts); + printf("post_limit_logins:\t%d\n", b.post_limit_logins); + printf("post_limit_regtime:\t%d\n", b.post_limit_regtime); + printf("level:\t%d\n", b.level); + printf("gid:\t%d\n", b.gid); + printf("parent:\t%d\n", b.parent); + printf("childcount:\t%d\n", b.childcount); + printf("nuser:\t%d\n", b.nuser); + + printf("next[0]:\t%d\n", b.next[0]); + printf("next[1]:\t%d\n", b.next[1]); + printf("firstchild[0]:\t%d\n", b.firstchild[0]); + printf("firstchild[1]:\t%d\n", b.firstchild[1]); + /* traverse to find my children */ + printf("---- children: ---- \n"); + for (i = 0; i < count; i++) + { + if(allbrd[i].gid == detail_i) + printf("%4d %-13s%-25.25s%s\n", + i, allbrd[i].brdname, + allbrd[i].BM, allbrd[i].title); + } } return 0; } -- cgit v1.2.3