回精華區
作者itoc.bbs@bbs.cs.nthu.edu.tw, 信區: plan
標題Re: 請教一下如何重建 .BRD
時間Sun Oct 20 17:34:53 2002 Updated: 2005/05/19
※ 引述《rojer》之銘言:
>         若 .BRD 爛掉
>         有辦法用程式去重新建立嗎?!

  執行此程式以後,再將 .BRD_new 覆蓋 .BRD 即可

  板主要手動重建
  特殊看板權限(秘密/好友/站務板)要手動重設
  分類要手動改

: src/util/Makefile

EXE =   ..... rebrd

: src/util/rebrd.c 新增這程式

/*-------------------------------------------------------*/
/* util/rebrd.c         ( NTHU CS MapleBBS Ver 3.10 )    */
/*-------------------------------------------------------*/
/* target : 重建 .BRD                                    */
/* create : 02/10/20                                     */
/* update :   /  /                                       */
/* author : itoc.bbs@bbs.tnfsh.tn.edu.tw                 */
/*-------------------------------------------------------*/

/*
  英文板名去 brd/* 抓
  中文板名去 gem/@/@Class 抓
  看板屬性去 innd/newsfeeds.bbs 抓
  板主要手動重建
  特殊看板權限(秘密/好友/站務板)要手動重設
  分類要手動改
*/


#include "bbs.h"


static int                  /* 1:此看板轉信 0:此看板不轉信 */
board_outgo(brdname)
  char *brdname;
{
  newsfeeds_t nf;
  int fd;
  int rc = 0;

  /* 若 newsfeeds 裡面有資料,就代表要轉信 */

  if ((fd = open("innd/newsfeeds.bbs", O_RDONLY)) >= 0)
  {
    while (read(fd, &nf, sizeof(newsfeeds_t)) == sizeof(newsfeeds_t))
    {
      if (!str_cmp(brdname, nf.board))
      {
        rc = 1;
        break;
      }
    }
    close(fd);
  }

  return rc;
}


static void
board_title(folder, brdname, title)  /* 去 gem/@/@Class 找 brd.title */
  char *folder;
  char *brdname;
  char *title;
{
  int xmode;
  char fpath[64];
  HDR hdr;
  FILE *fp;

  if (*title)           /* 已經找到 */
    return;

  if (fp = fopen(folder, "r"))
  {
    while (fread(&hdr, sizeof(HDR), 1, fp) == 1)
    {
      xmode = hdr.xmode & (GEM_BOARD | GEM_FOLDER);

      if (xmode == (GEM_BOARD | GEM_FOLDER))      /* 看板精華區捷徑 */
      {
        if (!strcmp(hdr.xname, brdname))
        {
          /* 參考 gem.c:brd2gem() 的格式 */
          str_ncpy(title, hdr.title + BNLEN + 1 + BCLEN + 1, BTLEN + 1);
          break;
        }
      }
      else if (xmode == GEM_FOLDER)               /* 卷宗 recursive 進去找 */
      {
        hdr_fpath(fpath, folder, &hdr);
        board_title(fpath, brdname, title);
      }
    }

    fclose(fp);
  }
}


static void
transbrd(brdname)
  char *brdname;
{
  static int chrono = 1000;

  BRD brd;
  int outgo;
  char title[BTLEN + 1];

  memset(&brd, 0, sizeof(BRD));
  outgo = board_outgo(brdname);

  str_ncpy(brd.brdname, brdname, sizeof(brd.brdname));
  title[0] = '\0';
  board_title("gem/@/@"CLASS_INIFILE, brdname, title);
  sprintf(brd.title, "分類 %s", title);  /* 分類手動改 */
  /* brd.BM 留白,手動恢復 */

  brd.bvote = 0;                /* 投票會流失 */
  brd.bstamp = ++chrono;
  brd.readlevel = 0;            /* 特殊板權限手動改 */
  brd.postlevel = PERM_POST;
  brd.battr = outgo ? 0 : BRD_NOTRAN;

  /* 這些會自動更新 */
  brd.btime = 0;
  brd.bpost = 0;
  brd.blast = 0;

  /* 新檔案建在 .BRD_new 再覆蓋 .BRD 即可 */
  rec_add(".BRD_new", &brd, sizeof(BRD));
}


int
main()
{
  DIR *dirp;
  struct dirent *de;
  char *str;

  chdir(BBSHOME);

  if (!(dirp = opendir("brd")))
    exit(-1);

  unlink(".BRD_new");

  while (de = readdir(dirp))
  {
    str = de->d_name;
    if (*str <= ' ' || *str == '.')
      continue;

    transbrd(str);
  }

  closedir(dirp);
  exit(0);
}

--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: itoc.Dorm-GD2.NCTU.edu.tw
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻