回文章列表
作者Formose.bbs@bbs.wretch.cc (對妳情深不變~) 看板: itoc
標題[求救]
時間無名小站 (2007/06/04 Mon 21:52:56)
不曉得為什麼上次修改完程式後,按 x 要轉錄文章時卻會直接斷線

但小弟忘了改過什麼樣的程式了,不過應該和CrossPost有關

以下是我的post_cross那段,可以麻煩各位大大幫忙嗎

int
post_cross(xo)
  XO *xo;
{
  /* 來源看板 */
  char *dir, *ptr;
  HDR *hdr, xhdr;

  /* 欲轉去的看板 */
  int xbno;
  usint xbattr;
  char xboard[BNLEN + 1], xfolder[64];
  HDR xpost;

  int tag, rc, locus, finish;
  int method;       /* 0:原文轉載 1:從公開看板/精華區/信箱轉錄文章 2:從秘密看板
                       轉錄文章 */
  usint tmpbattr;
  char tmpboard[BNLEN + 1];
  char fpath[64], buf[ANSILINELEN];
  FILE *fpr, *fpw;

  if (!cuser.userlevel) /* itoc.000213: 避免 guest 轉錄去 sysop 板 */
    return XO_NONE;

  if ((hdr->xmode & POST_PASS) && strcmp(hdr->owner, cuser.userid))
    return XO_NONE;        /* 文章以密碼加密 */

  tag = AskTag("轉錄");
  if (tag < 0)
    return XO_FOOT;

  dir = xo->dir;

  if (!ask_board(xboard, BRD_W_BIT, "\n\n\033[1;33m請挑選適當的看板,切勿轉錄
    超過三板。\033[m\n\n") || (*dir == 'b' && !strcmp(xboard, currboard)))
    /* 信箱、精華區中可以轉錄至 currboard */
    return XO_HEAD;

  hdr = tag ? &xhdr : (HDR *) xo_pool + (xo->pos - xo->top);
  /* lkchu.981201: 整批轉錄 */

  if ((!tag) && (hdr->xmode & POST_RESTRICT))
  {
    vmsg("加密文章不得轉錄")
    return XO_HEAD;
  }

  /* 原作者轉錄自己文章時,可以選擇「原文轉載」 */
  method = (HAS_PERM(PERM_ALLBOARD) || (!tag && is_author(hdr))) &&
    (vget(2, 0, "(1)原文轉載 (2)轉錄文章?[1] ",
    buf, 3, DOECHO) != '2') ? 0 : 1;

  if (!tag) /* lkchu.981201: 整批轉錄就不要一一詢問 */
  {
    if (method)
      sprintf(ve_title, "Fw: %.68s", str_ttl(hdr->title));  /* 已有 Re:/Fw: 字
        樣就只要一個 Fw: */
    else
      strcpy(ve_title, hdr->title);

    if (!vget(2, 0, "標題:", ve_title, TTLEN + 1, GCARRY))
      return XO_HEAD;
  }

#ifdef HAVE_REFUSEMARK
  rc = vget(2, 0, "(S)存檔 (L)站內 (X)密封 (Q)取消?[Q] ", buf, 3, LCECHO);
  if (rc != 'l' && rc != 's' && rc != 'x')
#else
  rc = vget(2, 0, "(S)存檔 (L)站內 (Q)取消?[Q] ", buf, 3, LCECHO);
  if (rc != 'l' && rc != 's')
#endif
    return XO_HEAD;

  if (method && *dir == 'b')    /* 從看板轉出,先檢查此看板是否為秘密板 */
  {
    /* 借用 tmpbattr */
    tmpbattr = (bshm->bcache + currbno)->readlevel;
    if (tmpbattr == PERM_SYSOP || tmpbattr == PERM_BOARD)
      method = 2;
  }

  xbno = brd_bno(xboard);
  xbattr = (bshm->bcache + xbno)->battr;

  /* Thor.990111: 在可以轉出前,要檢查有沒有轉出的權力? */
  if ((rc == 's') && (!HAS_PERM(PERM_INTERNET) || (xbattr & BRD_NOTRAN)))
    rc = 'l';

  /* 備份 currboard */
  if (method)
  {
    /* itoc.030325: 一般轉錄呼叫 ve_header,會使用到 currboard、currbattr,先
       備份起來 */
    strcpy(tmpboard, currboard);
    strcpy(currboard, xboard);
    tmpbattr = currbattr;
    currbattr = xbattr;
  }

  locus = 0;
  do    /* lkchu.981201: 整批轉錄 */
  {
    if (tag)
    {
      EnumTag(hdr, dir, locus, sizeof(HDR));

      if (method)
    sprintf(ve_title, "Fw: %.68s", str_ttl(hdr->title));    /* 已有 Re:/Fw: 字
      樣就只要一個 Fw: */
      else
    strcpy(ve_title, hdr->title);
    }

    if (hdr->xmode & GEM_FOLDER)    /* 非 plain text 不能轉 */
      continue;

    if (hdr->xmode & POST_ERASE)    /* 小 d 刪除 */
      continue;

#ifdef HAVE_REFUSEMARK
    if ((hdr->xmode & POST_RESTRICT) || (hdr->xmode & POST_PASS))
      continue;
#endif

    hdr_fpath(fpath, dir, hdr);

#ifdef HAVE_DETECT_CROSSPOST
    if (check_crosspost(fpath, xbno))
      break;
#endif

    brd_fpath(xfolder, xboard, fn_dir);

    if (method)     /* 一般轉錄 */
    {
      /* itoc.030325: 一般轉錄要重新加上 header */
      fpw = fdopen(hdr_stamp(xfolder, 'A', &xpost, buf), "w");
      ve_header(fpw);

      /* itoc.040228: 如果是從精華區轉錄出來的話,會顯示轉錄自 [currboard] 看
     板,然而 currboard 未必是該精華區的看板。不過不是很重要的問題,所以就不管
     了 :p */
      fprintf(fpw, "※ 本文轉錄自 [%s] %s\n\n",
    *dir == 'u' ? cuser.userid : method == 2 ? "秘密" : tmpboard,
    *dir == 'u' ? "信箱" : "看板");

      /* Kyo.051117: 若是從秘密看板轉出的文章,刪除文章第一行所記錄的看板名稱
      */
      finish = 0;
      if ((method == 2) && (fpr = fopen(fpath, "r")))
      {
    if (fgets(buf, sizeof(buf), fpr) &&
      ((ptr = strstr(buf, str_post1)) || (ptr = strstr(buf, str_post2))) &&
      (ptr > buf))
    {
      ptr[-1] = '\n';
      *ptr = '\0';

      do
      {
        fputs(buf, fpw);
      } while (fgets(buf, sizeof(buf), fpr));
      finish = 1;
    }
    fclose(fpr);
      }
      if (!finish)
    f_suck(fpw, fpath);

      fclose(fpw);

      strcpy(xpost.owner, cuser.userid);
      strcpy(xpost.nick, cuser.username);
    }
    else        /* 原文轉錄 */
    {
      /* itoc.030325: 原文轉錄直接 copy 即可 */
      hdr_stamp(xfolder, HDR_COPY | 'A', &xpost, fpath);

      strcpy(xpost.owner, hdr->owner);
      strcpy(xpost.nick, hdr->nick);
      strcpy(xpost.date, hdr->date);    /* 原文轉載保留原日期 */
    }

    strcpy(xpost.title, ve_title);

    if (rc == 's')
      xpost.xmode = POST_OUTGO;
#ifdef HAVE_REFUSEMARK
    else if (rc == 'x' && !(currbattr & BRD_NORESTRICT))
      xpost.xmode = POST_RESTRICT;
#endif

    rec_bot(xfolder, &xpost, sizeof(HDR));

    if (rc == 's')
      outgo_post(&xpost, xboard);
  } while (++locus < tag)

  btime_update(xbno);

  /* Thor.981205: check 被轉的板有沒有列入紀錄? */
  if (!(xbattr & BRD_NOCOUNT))
    cuser.numposts += tag ? tag : 1;    /* lkchu.981201: 要算 tag */
    cutmp->numposts += tag ? tag : 1;

  /* 復原 currboard、currbattr */
  if (method)
  {
    strcpy(currboard, tmpboard);
    currbattr = tmpbattr;
  }

  vmsg("轉錄完成");
  return XO_HEAD;
}
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在 140.127.186.120
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻