回精華區
作者BioStar.bbs@micro.bio.ncue.edu.tw (澎湖小雲雀) 看板: itoc
標題[文件] 精華區的篇數上限和容量上限
時間擎天崗 (Sun, 06 Jul 2003 15:21:41 +0800 (CST)) Updated: 2005/10/07
  (5) 檢查的主程式

: maple/bbsd.c:tn_login()

-#ifndef LINUX   /* 在 Linux 下這檢查怪怪的 */
-    /* itoc.010924: 檢查個人精華區是否過多 */
-    usr_fpath(fpath, cuser.userid, "gem");
-    {
-      struct stat st;
-
-      if (!stat(fpath, &st) && (st.st_size >= 512 * 7))
-      {
-        cuser.userlevel &= ~PERM_POST;
-        bell();
-        more("etc/mboxgem.over", NULL);
-      }
-    }
-#endif

: maple/gem.c

extern int TagNum;
extern TagItem TagList[];
+ extern BCACHE *bshm;

: maple/gem.c 開啟 gem_bno()

- #if 0
static int      /* -1:不是看板精華區  >=0:bno */
gem_bno(xo)
  XO *xo;
{
  ...
}
- #endif

: maple/gem.c:新增 gem_checksize() 於 gem_add() 之前

static int      /* 1:過大  0:沒有過大 */
gem_checksize(xo, filenum, filesize)
  XO *xo;
  int *filenum, *filesize;
{
  int i, total_n, total_k;
  char *ptr, *str, fpath[64];
  struct stat st;
  struct dirent *de;
  DIR *dirp;

  if (HAS_PERM(PERM_ALLBOARD))  /* 站長和看板總管不受限制 */
    return 0;

  if (*xo->dir == 'g')
  {
    if ((i = gem_bno(xo)) < 0)      /* 如果是 (A)nnounce 的話,跳過 */
      return 0;
    if ((bshm->bcache + i)->battr & BRD_NOGEMCHECK)
      return 0;
    strcpy(fpath, xo->dir);
    if (!(str = strchr(fpath + 8, '/')))
      return 0;
    strcpy(str + 1, fn_dir);
  }
  else /* if (*xo->dir == 'u') */
  {
    if (HAS_PERM(PERM_MYGEM))
      return 0;
    usr_fpath(fpath, cuser.userid, "gem/" FN_DIR);
  }

  if (!stat(fpath, &st))
    total_n = st.st_size;
  else
    total_n = 0;
  if (!total_n)     /* .DIR 開啟失敗或 size=0 表示沒有精華區 */
    return 0;
  total_k = 0;
  ptr = (char *) strchr(fpath, '.');

  /* 看板精華區要檢查 32 個子目錄,個人精華區只需檢查 1 個子目錄 */
  for (i = (*xo->dir == 'g') ? 31 : 0; i >= 0; i--)
  {
    *ptr = radix32[i];
    *(ptr + 1) = '\0';
    if (!(dirp = opendir(fpath)))
      continue;

    *(ptr + 1) = '/';
    while (de = readdir(dirp))
    {
      str = de->d_name;

      if (*str <= ' ' || *str == '.')
        continue;

      strcpy(ptr + 2, str);

      if (!stat(fpath, &st))
      {
        if (*str == 'F')
          total_n += st.st_size;
        else if (*str == 'A')
          total_k += st.st_size;
      }
    }
    closedir(dirp);
  }

  /* 過大的檢查 */
  if (*xo->dir == 'g')
  {
    BRD *brd;
    int bno;

    if ((bno = gem_bno(xo)) < 0)
      return 0;
    brd = bshm->bcache + bno;
    if (total_n >= brd->gemsize_n * sizeof(HDR) || total_k >= brd->gemsize_k)
    {
      *filenum = total_n / sizeof(HDR);
      *filesize = total_k;
      return 1;
    }
  }
  else
  {
    if (total_n >= cuser.gemsize_n * sizeof(HDR) || total_k >= cuser.gemsize_k)
    {
      *filenum = total_n / sizeof(HDR);
      *filesize = total_k;
      return 1;
    }
  }

  return 0;
}

: maple/gem.c:gem_add()

  level = xo->key;
  if (level < GEM_MANAGER)      /* [回收筒] 中不能新增 */
    return XO_NONE;

+ if (gem_checksize(xo, &fd, &ans))     /* 借用 fd 和 ans */
+ {
+   /* 告訴使用者是用了多少,讓他服氣些 */
+   sprintf(fpath, "精華區檔案數:%d,總大小:%dKB,請刪除一些文章",
+     fd, ans >> 10);
+   vmsg(fpath);
+   return XO_FOOT;
+ }

: maple/gem.c:gem_paste()

  if (!(xo->key & GEM_W_BIT))
    return XO_NONE;

+ if (gem_checksize(xo, &num, &ans))    /* 借用 num 和 ans */
+ {
+   char msg[80];
+   /* 告訴使用者是用了多少,讓他服氣些 */
+   sprintf(msg, "精華區檔案數:%d,總大小:%dKB,請刪除一些文章",
+     num, ans >> 10);
+   vmsg(msg);
+   return XO_FOOT;
+ }

: maple/gem.c:gem_anchor()

  int ans;
  char *folder;
+ int gemsize, filenum;
+ char msg[80];

  ...
  ...

  ans = vans("精華區 A)定錨 D)拔錨 J)就位 Q)取消 [A] ");
  if (ans != 'q')
  {
    folder = GemAnchor;

+   /* 精華區容量達到上限就禁止定錨,但允許拔錨和就位 */
+   if (gem_checksize(xo, &fd, &ans) && ans != 'j' && ans != 'd')
+    if (ans != 'j' && ans != 'd' && gem_checksize(xo, &filenum, &gemsize))
+   {
+     /* 告訴使用者是用了多少,讓他服氣些 */
+     sprintf(fpath, "精華區檔案數:%d,總大小:%dKB,請刪除一些文章",
+       fd, ans / 1024);
+     vmsg(fpath);
+     return XO_FOOT;
+   }

--
| Origin |  彰化師大生物系 吟風‧眺月‧擎天崗  micro.bio.ncue.edu.tw 
| Author | 218-163-206-115.HINET-IP.hinet.net
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻