Message header ============== 作者者: rock 日期: 2001年4月17日 必要的 Header ------------- 對 The TIP Project 而言,所有的 Message ,都必須具備 的 header 有四個: * Subject * From * Date * Message-ID From 接受的格式有二種: 1) "user name" user name 必須包括在兩個雙括號中, e-mail address 必須包括 在兩個角括號中,兩部份間以一個空白字元 (0x20) 。 2) user@domain (user name) 以 e-mail address 開頭,間以一個空白字元後,再用小括號包括起 user name 。 所有 header 的意義與格式,皆與 RFC822, MIME 所規定者相同,不再 另行說明。 Fileheader ---------- /* struct size = 256 bytes */ struct fileheader { char filename[STRLEN]; char owner[STRLEN]; char title[STRLEN]; unsigned int level; unsigned int group; unsigned int attrib; unsigned char accessed[4]; }; typedef struct fileheader fileheader_t; fileheader 是 message header 的內容摘要,以及屬性、狀態儲存的 結構,其擷取下列 header 的資料儲存,以方便文件的處理。 1.將 Subject 的內容,存入 fileheader.title 2.將 Date 的內容,存入 fileheader.ctime 3.將 From 的內容,存入 fileheader.owner 4.將 Message-ID 的內容,存入 fileheader.filename 若 header 的內容,超過 fileheader 對應欄位的儲存空間,則可以只截取 一段內容存入。 特別注意此處, fileheader.filename 儲存的內容有兩部份,第 一部份是文件儲存的檔案名稱,第二部份才是 Message-ID,兩部 份間,是以 '\0' 字元分隔的。 而且 Message-ID 的部份不是必須存入的,如果 fileheader.filename 的剩餘空間不足以儲存 Message-ID 時,便不須存入。 由於 fileheader 的空間有限,因此,其中儲存的內容,可能無法完 全存入 header 的內容,故僅供參考用,正式場合裡,仍以文件的 header 的內容為準。 更明確的說法是, fileheader 的內容,僅僅是文件 header 的"摘要", 其內容可以只是 header 的一部份,其目的在方便瀏覽及搜尋。 比如說文件的搜尋,如果是要搜尋相關"標題"或"作者",則可以用 fileheader 中的欄位,不需開啟文件並掃描 header 。 而"正式場合"呢? 例如要取得文件的發表人 e-mail ,應該讀取文件的 From: 的內容,而不是用 fileheader.owner 。 舉例來說,由於"稱呼"及 mail address 的總合長度,很容易超出 fileheader.owner 的儲存空間,碰到這種情形時,大部份的程式開發 者,只儲存"稱呼"或 mail address 的 userid 部份,省略掉 maill address 的 主機名稱。 DOTDIR --------- 在每個儲放 message 的目錄下,都有至少一個資料庫,用以集中儲存各 message 的 fileheader 內容。 私人信件的 message 被存放在各人的信箱目錄下,通常是 "mail/$userid" 或 "mail/$U/$userid" ;而版面文件的 message 則被存放在各版面目錄下 ,通常是 "boards/$boardid" 或 "boards/$B/$boardid" 。 然而程式開發者並不需要知道這個細節, BBS 系統應提供特定函數,供程 式開發者開啟信箱目錄或版面目錄的檔案。 這些資料庫都是普通的隨機存取檔,而 fileheader 的內容,是以固定的 大小連續而緊密地儲存在檔案中,且無任何記錄指標或索引資料間雜其中 ,故可簡單地以記錄編號 (Record Number) 存取資料庫中的任何記錄。 ps. 在 TANet 各 BBS 系統中,普遍存在的 record.c ,就是被設計用來 存取這種類型的資料庫。 本計劃的 bbslib 中包含了 record.c 。 這些資料庫中,最主要而且是必須的一個,其檔案名稱為 ".DIR" ,又稱 為 DOTDIR 。 DOTDIR 是 message 的總目錄,在同一個目錄下所有 message 的 fileheader 內容,都必須被儲存在 DOTDIR 中。 而程式開 發者必須先從 DOTDIR 中,取得想要提取的 message 的 fileheader 後, 再依 BBS 系統所提供的特定函數,才能開啟 message 。 -- The TIP Project 根基於 Firebird BBS 原始碼的改進計劃 Short URL: http://fbtip.tsx.org/ Group: http://groups.yahoo.com/group/firebird-tip Mailing list: firebird-tip@yahoogroups.com