回精華區
作者amaki.bbs@luna.twbbs.org (招喚颱風的羊) 看板: plan
標題[修改]自訂副板主後變動線上使用者權限
時間月下夜想 (Thu, 11 Sep 2003 02:23:01 +0800 (CST)) Updated: 2003/09/13
  變更副板主後,讓被卸任的板主拿下權限,新上任板主掛上權限,這個修改請勿盲目抄

  下面的程式碼,您必須有做「線上變更使用者權限」且新增相關函式,可參考itoc精華

  區。

: manage.c : post_changeBM()

static int
post_changeBM(xo)
  XO *xo;
{
  char buf[80], uid[IDLEN + 1], *blist;
  BRD *oldbrd, newbrd;
  ACCT acct;
  int dirty, len;
+ int has_set = 0;

  ......
  ......

  while (1)
  {
    if (!vget(10, 0, "請輸入板主,結束請按 .....", uid, IDLEN + 1, DOECHO))
    {
-      if (dirty != strlen(cuser.userid))    /* 有做修改 */
-        strcpy(newbrd.BM, buf);
+      if ((*uid == '\0' || !strcmp(cuser.userid, uid)) && !has_set)
+        return XO_BODY;
+      else
        break;
    }

  ......
  ......

      strcat(buf, "/");
      strcat(buf, acct.userid);
      buf[BMLEN] = '\0';                /* 避免過長 */
+      strcpy(newbrd.BM, buf);

      move(8, 0);
      prints("目前板主為 %s", buf);
      clrtoeol();

+      has_set = 1;

  ......
  ......

  if (memcmp(&newbrd, oldbrd, sizeof(BRD)) && vans(msg_sure_ny) == 'y')
  {
    memcpy(oldbrd, &newbrd, sizeof(BRD));
    rec_put(FN_BRD, &newbrd, sizeof(BRD), currbno, NULL);
  }
+  utmp_BMset(newbrd.BM, currbno);


: cache.c : utmp_BMset()

  新增這支函式,但請勿盲目抄錄下面程式碼,下面程式碼名單檔的路徑請用自己站上的

  名單檔路徑或是檔名,且須做變更。

void
utmp_BMset(blist, bno)   /* amaki.030909: 動態設定線上板主的看板閱讀權限 */
  char *blist;
  int bno;
{
  extern BCACHE *bshm;
  int fd, key;
  UTMP *uentp, *uceil;
  BRD *brd;
  char fpath[64];

  brd = bshm->bcache + bno;
  uentp = ushm->uslot;
  uceil = (void *) uentp + ushm->offset;

  if ((brd->readlevel & PERM_SYSOP) || (brd->readlevel & PERM_BOARD))
  {
    brd_fpath(fpath, brd->brdname, fn_pal);
    key = (brd->readlevel & PERM_SYSOP) ? '1' : '2';
  }
  else
  {
    brd_fpath(fpath, brd->brdname, fn_badpal);
    key = '3';
  }

  fd = open(fpath, O_RDONLY);

  do
  {
    /* 重新判斷該板的 brd_bits */
    if (is_bm(blist, uentp->userid))
    {
      uentp->brd_bits[bno] =(uentp->brd_bits[bno] &
        (BRD_V_BIT | BRD_H_BIT | BR_Z_BIT)) |
        (BRD_L_BIT | BRD_R_BIT | BRD_W_BIT | BRD_X_BIT);
      uentp->status |= STATUS_BRD_BIT;
    }
    else if (uentp->brd_bits[bno] & BRD_X_BIT)
    {
      uentp->brd_bits[bno] =(uentp->brd_bits[bno] &
        (BRD_V_BIT | BRD_H_BIT | BR_Z_BIT)) |
        pal_brdutmp(fd, brd->BM, uentp, key);
      uentp->status |= STATUS_BRD_BIT;
    }
  } while (++uentp <= uceil);
}

--
  Origin: luna.twbbs.org
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻