ABCDEFGHIJKLMNOPQRSTUVWXYZ
1
函數名稱檔案位置說明細節
2
setbpath
(char *buf,
const char *boardname)
path.c設定檔案路徑的前半部(目錄)setbpath 產生檔案路徑的前半部,塞回 buf
路徑名稱為 boards/%c/%s,其中 %c 為 boardname 的第一個字元,%s 為 boardname
3
stampfile
(char *fpath,
fileheader_t *fh)
fhdr_stamp.c設定檔案路徑的後半部(檔名)並建立檔案stampfile 隨機產生檔案名稱並將檔案建出來,如果成功回傳 0,否則回傳 -1

stampfile 會在 fileheader 寫入 fname 與 date

檔案名稱為 M.%d.A.%3.3X,其中%d 為 timestamp,%3.3X 為亂數
4
setbtotalcache.c更新SHM中某看板的文章數量和最後更新時間
5
post_msg2
(const char* bname,
const char* title,
const char* msg,
const char* author,
char* output_path)
syspost.c發出看板警察之類的訊息
post_msg2 在看板 bname 上新增一個標題為 title 內文為 msg 作者為 author 的文章,如果output_path傳入不為 null 的話會將檔案儲存的位置寫回 output_path 。

post_msg2 除了將 msg 寫入檔案內以外,還會新增作者、看板、標題以及時間的標頭。

寫入檔案後 post_msg2 會將新地標頭資訊 append 到原本的 .DIR 檔案之後

寫入文章後會呼叫 setbtotal 來更新目前某看板的最後文章數量以及最後更新時間
6
7
8
static int
write_file(const char *fpath, int saveheader, char mytitle[STRLEN],
int flags, int *pentropy)
edit.c標準的發文
依設定印出提示使用者操作的文字

switch {

使用者輸入 'a' (放棄),設為 aborted,跳出 switch case

使用者輸入 'e' (繼續),回傳 KEEP_EDITING

如果能上傳資料,且使用者輸入 'u' (上傳資料),呼叫 upload_file() 並回傳 KEEP_EDITING

使用者輸入 'r' (讀取暫存檔),呼叫 read_tmpbuf(-1) 並回傳 KEEP_EDITING

使用者輸入 'w' (寫入暫存檔),呼叫 write_tmpbuf() 並回傳 KEEP_EDITING

使用者輸入 'd' (刪除暫存檔),呼叫 erase_tmpbuf() 並回傳 KEEP_EDITING

使用者輸入 't' (改標題)。若不能改標題的話回傳 KEEP_EDITING,可以的話則讓使用者更改舊標題並回傳 KEEP_EDITING

使用者輸入 's' (依設定可為儲存、發文、發信),跳出 switch case

}

如果非 aborted,檢查是否要直接回傳 KEEP_EDITING、abort、還是將標題寫入

如果非 aborted,印出 message body. (Line: 2050)

如果 aborted,回傳 aborted

如果 currstat == POSTING or SMAIL,呼叫 addsignature

如果 currstat == REEDIT,印出編輯訊息
9
10
11
modify_dir_lite(
const char *direct,
int ent,
const char *fhdr_name,
time4_t modified,
const char *title,
const char *owner,
const char *date,
char recommend,
void *multi,
uint8_t enable_modes,
uint8_t disable_modes)
bbs.c他說是輕量版的更新DIR檔
modify_dir_lite 會更新位於 direct 的 .DIR 的第ent項紀錄,ent為從1開始的索引,direct 為字串。

如果 fhdr_name 和該 ent 的 fileheader filename不同時,會回傳 -1, 不會修改 filename。
如果 modified 不為 0 時,修改 fileheader。
如果 enable_modes 不為 0 時,filemode 增加 flag, 如果 disable_modes 不為 0 時,取消 flag。
如果 title, owner, date, multi 不為 NULL 且非空字串時,更新該欄位。
如果 recommend 不為0時,增減輸入進去的recommend 直,最大最小值分別為 MAX_RECOMMENDS 和 -MAX_RECOMMENDS

以前好像有寫鎖,但是目前好像沒了...?
12
13
14
15
16
17
do_add_recommend
(const char *direct,
fileheader_t *fhdr,
int ent,
const char *buf,
int type)
bbs.c推文或是在底下新增一行
fhdr: 文章的 header 對應到 go-bbs 內的 ArticleRecord
ent: 寫入成功後,呼叫 modify_dir_lite 使用,詳細可參考 modify_dir_lite 說明。
buf: 使用者的留言 (處理過的完整文字)
type: 留言的種類 (推 or 噓)
do_add_recommend 會將使用者的留言寫入文章檔案的最後一行。
根據留言的種類計算推薦數,推文會將推薦數+1,噓文會將推薦數-1,並更新 fhdr->recommend。


do_add_recommend 會將要增加的文字 buf 加入direct .DIR底下的fhdr->filename 的最後一行,
ent在最後推文成功後呼叫modify_dir_lite所使用,後續請參閱modify_dir_lite。

START

BEGINSTAT(STAT_DORECOMMEND);


使用O_APPEND方式開啟來達成只增加至最後一行
如果檔案開啟失敗goto error
* 註1

更新成功後比對推文的type
如果為推文且推文數小於MAX_RECOMMENDS update = 1
如果為噓文且推文數大於-MAX_RECOMMENDS update = -1
fhdr->recommend += update;

並呼叫dasht取得最後文件修改時間
如果取得修改時間成功,呼叫modify_dir_lite,成功後呼叫brc_addlist將文章加入已讀

ENDSTAT(STAT_DORECOMMEND);
return 0;

error:
ENDSTAT(STAT_DORECOMMEND);
return -1;

END

* 註1:
此處有#ifdef針對如果有EDITPOST_SMARTMERGE tag的話有另外的邏輯
如果沒有EDITPOST_SMARTMERGE為上述直接加入文件最後

有設定EDITPOST_SMARTMERGE的話,會針對文件是否有LOCK進行retry

18
19
20
21
cross_post
(int ent,
fileheader_t * fhdr,
const char *direct)
bbs.c轉貼文章
cross_post 會詢問使用者要轉錄文章至哪個看板,還有要使用的標題,並在檢查看板權限&發文權限後在目標看板下新增文章。
同時會在原文章下方新增轉錄資訊,在目標看板下的新文章註記轉錄資訊,並更新 ALLPOST

透過 SHM 拿取 board cache 後進行以下檢查

如果目標看板是連署機看板(BRD_VOTEBOARD),回傳 DONOTHING
如果文章被刪除(fhdr->owner[0] == '-'),回傳 DONOTHING
如果文章檔案不存在,輸出錯誤訊息,回傳 FULLUPDATE
如果是違法使用者(PERM_VIOLATELAW),當轉貼次數大於等於 MAX_CROSSNUM 時,回傳 DONOTHING
如果是尚未註冊認證的使用者(!PERM_LOGINOK),輸出錯誤訊息,回傳 FULLUPDATE
輸出提示文字,提示使用者將要進行文章轉錄
如果看板自動留轉錄記錄(BRD_CPLOG), 並且沒有發文權限(!CheckPostPerm())或者不滿足發文限制(!CheckPostRestriction(currbid)),輸出錯誤訊息,回傳 FULLUPDATE
詢問要轉錄至哪個看板
如果沒有輸入看板,回傳 FULLUPDATE
如果看板不存在或者沒有發文權限,輸出錯誤訊息,回傳 FULLUPDATE
詢問是否採用原標題,或者輸入新標題
詢問是否確認發文或者取消,如果取消回傳 FULLUPDATE
呼叫 setbpath & stampfile 建立新文章檔案,若失敗輸出錯誤訊息,回傳 FULLUPDATE
呼叫 write_header 寫入新文章的標頭,包含作者、看板、標題、時間
依據目前看板是否為隱形看板(!IS_OPENBRD),寫入轉錄資訊到新文章
呼叫 addforwardsignature 在新文章尾巴加上 signature
呼叫 log_crosspost_in_allpost 在 ALLPOST 新增新文章
呼叫 do_add_recommend 在原文章下方新增轉錄資訊
呼叫 append_record 在看板.DIR下寫入文章標頭
呼叫 setbtotal 更新看板的文章數量與最後更新時間
輸出 "文章轉錄完成。(轉錄不增加文章數,敬請包涵)\n\n"
回傳 FULLUPDATE
22
CheckPostPerm()bbs.c檢查發文權限
23
CheckPostRestriction()bbs.c檢查發文限制
24
25
26
void read_tmpbuf(int n)edit.c讀取暫存檔參數 n 為暫存檔 id

檢查當前文章的總行數是否超過 EDIT_LINE_LIMIT(65530)。
檢查 n(暫存檔 id)是否在 0 ~ 9 區間內,若不在則重新詢問使用者要選擇編號幾號的暫存檔。
若 n(暫存檔 id)非 0 或 5 則詢問使用者是否確定要讀入(預設為讀入)。
若使用者回答非 'n'(確定讀入),則讀入指定暫存檔。
27
void write_tmpbuf(void)edit.c寫入暫存檔
wite_tmpbuf 沒有參數

write_tmpbuf 會先詢問使用者要選擇哪一個暫存檔
選定暫存檔後會檢查暫存檔有沒有資料
假如有資料的話會詢問使用者 (A)附加 (W)覆寫 (Q)取消

假如選擇(Q)取消,直接return

假如選擇(A)附加,會先檢查現有暫存檔的大小是否超過限制 (EDIT_SIZE_LIMIT (32768*1024)),然後打開暫存檔做append的動作

假如選擇(W)覆寫,會直接打開暫存檔做write的動作
28
void erase_tmpbuf(void)edit.c刪除暫存檔erase_tmpbuf沒有參數。

內部函數會從使用者端得到要刪除編號幾的草稿(最多10個)。
若欲刪除草稿不為空(可能會用類似Linux指令more讓使用者預覽),會再次向使用者確認是否刪除。
若確認,則刪除草稿。
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100