回文章列表
作者itoc.bbs@cpu.tfcis.org (核心動力) 看板: itoc
標題Re: [問題]看板合併?
時間動力核心 (2007/03/16 Fri 19:26:04)
※ 引述《allen501pc.bbs@bbs.sa.ncyu.edu.tw (靜養中..)》之銘言:
> 我管的站裡面目前有3個看板需要合併成一個看板,話說直接把brd/XXX的東西移過去
> 是不行的吧? 那麼還要修改什麼?

  ~/bin/mergebrd A B C D
  將 A B C D 四個板合併成 A 板  (A 板可以是新成立的板,或是已經存在的板)

: src/util/Makefile

EXE =   ... mergebrd

: src/util/mergebrd.c 新增程式如下

/*-------------------------------------------------------*/
/* util/mergebrd.c      ( NTHU CS MapleBBS Ver 3.10 )    */
/*-------------------------------------------------------*/
/* target : merge several boards into one board          */
/* create : 07/03/16                                     */
/* update :   /  /                                       */
/*-------------------------------------------------------*/
/* syntax : mergebrd dst src1 [src2 src3 ...]            */
/*-------------------------------------------------------*/


#include "bbs.h"


static int
is_board(brdname)
  char *brdname;
{
  BRD brd;
  int fd;
  int rc = 0;

  if ((fd = open(FN_BRD, O_RDONLY)) >= 0)
  {
    while (read(fd, &brd, sizeof(BRD)) == sizeof(BRD))
    {
      if (!strcmp(brdname, brd.brdname))
      {
        rc = 1;
        break;
      }
    }
    close(fd);
  }

  return rc;
}


static int
merge_board(src, dst)
  char *src, *dst;
{
  int i;
  char x;
  char fnew[64], fold[64];
  char cmd[256];

  if (!strcmp(src, dst))
  {
    printf("不能將同一板合併\n");
    return 0;
  }

  if (!is_board(src))
  {
    printf("沒有 %s 這板!\n", src);
    return 0;
  }

  for (i = 0; i < 32; i++)
  {
    x = radix32[i];                       /* @/ 拋棄 */
    sprintf(fold, "brd/%s/%c/*", src, x);
    sprintf(fnew, "brd/%s/%c/", dst, x);
    sprintf(cmd, "cp %s %s", fold, fnew); /* 假設沒有同樣檔名的。若有會覆蓋 */
    system(cmd);
  }

  brd_fpath(fold, src, FN_DIR);
  brd_fpath(fnew, dst, FN_DIR);
  sprintf(cmd, "cat %s >> %s", fold, fnew);
  system(cmd);

  return 1;
}


static int
hdr_cmp(a, b)
  HDR *a;
  HDR *b;
{
  return a->chrono - b->chrono;
}


int
main(argc, argv)
  int argc;
  char *argv[];
{
  int i, num;
  char *src, *dst;
  char folder[64];

  if (argc < 3)
  {
    printf("Usage: %s dst src1 [src2 src3 ...]\n", argv[0]);
    return -1;
  }

  chdir(BBSHOME);

  dst = argv[1];
  if (!is_board(dst))
  {
    printf("沒有 %s 這板!\n", brdname);
    return -1;
  }

  num = 0;
  for (i = 2; i < argc; i++)
  {
    src = argv[i];
    printf("開始將 %s 板合併到 %s 板內\n", src, dst);
    num += merge_board(src, dst);
  }

  if (num > 0)
  {
    brd_fpath(folder, dst, FN_DIR);
    rec_sync(fpath, sizeof(HDR), hdr_cmp, NULL);
    printf("%d 個板合併成功\n", num);
  }

  return 0;
}


--
=[:摃�◣�:Origin ]|[  Ocpu.tfcis.org  ]|[�搟說:]=
=[:摃�╱�:Author ]|[218-168-183-31.dynamic.hin]|[�:]=
= ▊▌▎▎Modify ▎▌▋▊: Fri, 16 Mar 2007 19:28:43 CST ::]=
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻