作者guessi.bbs@cpu.tfcis.org (沒) 看板: itoc
標題[功能] 自動檢查並清除幽靈板主
時間動力核心 (2010/01/08 Fri 04:13:48)
清除存在於板主列表的幽靈板主 (帳號已經刪除 或被重新申請 卻還顯示在列表中)
: src/util/resetPermBM 新增此檔案
/*-------------------------------------------------------*/
/* util/resetPermBM.c ( NTHU CS MapleBBS Ver 3.10 ) */
/*-------------------------------------------------------*/
/* target : 看板板主清單整理刷新 */
/* create : 01/08/2010 */
/* update : 01/08/2010 */
/* author : guessi.bbs@bbs.ndhu.edu.tw */
/*-------------------------------------------------------*/
#include "bbs.h"
static BCACHE *bshm;
static void
init_bshm()
{
/*
* itoc.030727: 在開啟 bbsd 之前,應該就要執行過 account
* 所以 bshm 應該已設定好
*/
bshm = shm_new(BRDSHM_KEY, sizeof(BCACHE));
if (bshm->uptime <= 0) /* bshm 未設定完成 */
exit(0);
}
static
void
check_bmlist()
{
ACCT acct;
BRD *bhdr, *tail, newbrd;
char userid[IDLEN + 1];
char fpath[64], buf[80], *blist, *tmp;
int BMlen, len, rt;
bhdr = bshm->bcache;
tail = bhdr + bshm->number;
do
{
/* guessi.100108 先備份 */
memcpy(&newbrd, bhdr, sizeof(BRD));
blist = bhdr->BM;
strcpy(buf, blist);
BMlen = strlen(buf);
/* guessi.100108 找出第一個看板板主帳號 */
tmp = strtok(bhdr->BM, "/");
while (tmp != NULL)
{
sprintf(userid, "%s", tmp);
len = strlen(userid);
usr_fpath(fpath, userid, FN_ACCT);
rt = rec_get(fpath, &acct, sizeof(ACCT), 0);
/* guessi.011008
* rt < 0 帳號不存在
* rt >= 0 && !(acct.userlevel & PERM_BM) 帳號存在 但沒有PERM_BM權限 */
if (rt < 0 || (rt >= 0 && !(acct.userlevel & PERM_BM)))
{
/* guessi.100108 帳號不存在(此部分參考manage.c)
* 或帳號存在 但沒有PERM_BM 都應該從板主列表中移除 */
if (BMlen == len)
{
/* 若只有一個板主 */
*buf = '\0';
break;
}
else if (!str_cmp(buf + BMlen - len, userid) &&
buf[BMlen - len - 1] == '/')
{
/* 板主列表中 最後一位板主 */
buf[BMlen - len - 1] = '\0';
len++;
BMlen -= len;
}
else
{
/* 其他板主(含正板主) */
str_lower(userid, userid);
strcat(userid, "/");
len++;
blist = str_str(buf, userid);
strcpy(blist, blist + len);
BMlen -= len;
}
}
/* guessi.100108 繼續尋找下一個看板板主帳號 */
tmp = strtok(NULL, "/");
}
strcpy(newbrd.BM, buf);
/* 若有更動 將BRD記錄寫入 */
if (memcmp(&newbrd, bhdr, sizeof(BRD)))
{
memcpy(bhdr, &newbrd, sizeof(BRD));
rec_put(FN_BRD, &newbrd, sizeof(BRD), bhdr - bshm->bcache, NULL);
}
} while (++bhdr < tail);
}
int
main()
{
init_bshm();
chdir(BBSHOME);
check_bmlist();
return 0;
}
: src/util/Makefile
EXE = ... resetPermBM
最後 確認無誤後 crontab 加入排程
--
=[﹎:�摃�◣��:﹎Origin ]|[ ���O���� cpu.tfcis.org ]|[�搟說�﹎:]=
=[﹊:�摃�╱��:﹊Author ]|[118-161-214-110.dynamic.hi]|[���插�﹊:]=