回文章列表
作者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 ]|[  Ocpu.tfcis.org  ]|[�搟說:]=
=[:摃�╱�:Author ]|[118-161-214-110.dynamic.hi]|[�:]=
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻