Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Pack 003: LUNATIC FORCE [Stage Final] #61

Merged
merged 260 commits into from
Feb 13, 2020

Conversation

IepIweidieng
Copy link
Member

@IepIweidieng IepIweidieng commented Feb 10, 2020

Demonstration screenshots

  • innbbsd setting rewritten with xover()
    image
  • Widescreen completion list display & hotkey change
    image
  • Plain text mode as well as footers are back
    image
  • Improved widescreen support as well as PttBBS-style menu lightbar system
    image
  • File editing menu rewritten with main menu system
    image
  • Message for the last page full of items is restored
    image
  • Pfterm standout/standend support (seems that the Windows Console has a rendering bug)
    image
  • Pfterm support for more SGRs
    image
  • Native IPv4 & IPv6 support
    image
  • Improved site information
    image
  • mruby powered BBS-Ruby
    image

Fixpack 003 Stage 5 Changelog (en-us):

The translation is currently not available.

Fixpack 003 Stage 5 Changelog (zh-tw):

標記意義:-重要功能改變; 💥-重要錯誤修正; ❗️-需要特別應對的改變

❗️ 需要的特別應對

  • UTMP::in_addr 的大小改變了,請重開 UTMPSHM,不然進入 BBS 時會立即 crash。
  • 重新分配了特殊按鍵的值,請全部重新編譯,不然進入 BBS 時會進入無限迴圈。
  • 重新分配了 xover 系統使用的特殊值,請全部重新編譯。
  • xo_pool 的型別改變了,請全部重新編譯,否則列表會出現黑洞項目。

✨ 快速鍵與其行為的變更

  • 編輯器 (maple/edit.c) 可用 EscEsc-Esc 輸入 ESC 字元
  • 踩地雷 (so/mine.c) 的退出鍵從 Esc 改成 Esc-Esc,避免不小心按出去
  • 增加 Esc-REsc-TEsc-W 快速鍵,對應 Ctrl-RCtrl-TCtrl-W
    解決在 PttChrome 上的快速鍵衝突 (雖然可用 Alt-RAlt-TAlt-W)
  • 主選單 (maple/menu.c) 增加搜尋看板的快速鍵 S/
  • 更改自動完成列表 (vkey_match() & match_getch()) 的操作:
    • 可用空白和 Tab 自動完成
    • 使用空白、Tab、和 Enter 讓列表繼續列出,像 PttBBS 那樣
    • 使用其它任意鍵結束列表,繼續輸入 (預設),像 PttBBS 那樣
  • 現在在 xover 列表最首 / 尾項按下 PgUp / PgDown
    會跳到最尾 / 首頁的首 / 尾項
  • 現在在 xover 列表最尾項按下 PgUp 向上翻頁後,游標會對齊頁面尾項。
  • xover 列表增加單行上捲 (Esc-Up & K) 與下捲 (Esc-Down & J) 的快速鍵
  • xover 列表增加跳回上層的快速鍵 EscEsc-Esc
  • 主選單、彈出選單增加跳回上層的快速鍵 EscEsc-Esc

💥 系統安全、資料正確的修正

  • 修正 5 處對重疊的資料範圍誤用 memcpy() 的問題,
    以免在較新的作業系統上出現資料毀壞的問題
  • 修正在高螢幕下,文章讀到一半進入使用者列表,退出時 xo_pool[] 還原不完全,
    可能會造成讀到不存在的文章,以及造成文章黑洞的問題

💥 使用者權限的修正

  • 修正 remove_perm() 只會移除前 1/4 MAXBOARD (1750) 個看板的寫入權限,
    導致因 crosspost 或灌水而被停權時,在重新登入前還可以發表文章的問題

💥 影響使用者介面使用的修正

  • 修正信件列表中的 tag 標誌在畫面重繪後會消失的問題
  • 修正 list_search() (群組名單搜尋) 目標不在第一頁時會跳到錯誤項的問題

閱讀紀錄 (BRH) 的修正

  • 💥 brh_add(): 避免閱讀紀錄為空,且下篇文章的時間值剛好為 INT_MAX 時,
    目前閱讀紀錄的長度會變成目前文章的時間值的問題
  • 💥 修正目前文章已在閱讀紀錄中還 brh_add() 時,前面幾篇文章會變成未讀的問題
  • ✨ 閱讀紀錄已滿,要新增最舊紀錄區間時,原本會忽略,改成併入最後的區間
  • 使用單板閱讀紀錄的最大大小作為 BRH_WINDOW,避免浪費記憶體空間

visio (maple/visio.c) 的修正

  • 修正不使用 pfterm 時,vbuf[] 太大而浪費空間的問題
  • TRAP_ESC 定義時,vkey() 正確處理 Esc-EscEsc-<特殊鍵>
  • 改善 vkey()I_TIMEOUTI_OTHERDATA 的處理
  • ✨ 將 vkey() 加上計時要素:
    • 按下 Esc VKEY_ESC_WAIT_TIME_MS 毫秒 (預設 0.65 秒) 後會送出 Esc
    • 按下 Esc 後,在 VKEY_ESC_WAIT_TIME_MS 毫秒內再按按鍵會送出對應鍵
    • 接收 escape sequence 時,在 VKEY_SEQ_WAIT_TIME_MS 毫秒內
      (預設 0.01 秒) 要收到下一個字元,否則送出對應鍵
    • 每多收到一個 Esc,計時減半,直到送出按鍵才回復
    • 計時中快速鍵無效
  • 修正先前在 igetch() 加入的邊界檢查的邊界設定錯誤,造成邊界檢查無效的問題
  • 支援 '\xff' (telnet: IAC IAC) 的輸出入
  • ✨ 更改 vget() 的歷史紀錄處理:
    • 防止按 Down 跳到最舊的紀錄
    • 防止按 Up 跑到空的紀錄
    • 按 Up/Down 時,儲存對目前輸入紀錄的修改 (要超過 2 個字元並編輯過)
    • 完成輸入而儲存時,將目前編輯的輸入紀錄變成最新紀錄,而不要另外增加新紀錄
  • ✨ 更改 move() 座標超出範圍的處理,從忽略或跑到下一行開頭,改成限制在範圍內
  • ✨ 改進 outf(),如果字串內有一個 '\t',就把空白填充到此,否則填充到結尾
  • 💥 修正因為畫面清除函數 (clear(), clearange(), clrtoeol(), clrtobot())
    使用 hardcoded 的成員大小,導致改變資料結構 screenline 成員之大小後,
    畫面清除函數將無法正確運作的問題
  • ❗️ 重新分配了特殊按鍵的值,以有效率地使用其可用值域,請全部重新編譯。

寬/高螢幕顯示的修正

  • 加上先前遺漏的寬螢幕支援:
    maple/banmail (檔信列表)、so/aloha (上站通知名單)、
    so/brdstat (看板使用資訊)、so/chatmenu (聊天室動詞列表)、
    bitset() (多重選項設定)
  • ✨ 將使用者介面從 b_cols - 1 個字元填滿到 b_cols 個字元,像 PttBBS 那樣
  • 讓原本定寬的各種螢幕分隔線支援寬螢幕
  • ✨ 讓 vget() 的自動完成列表 (vget_match()) 支援寬螢幕
  • ✨ 重寫 header 顯示 (vs_head()) 的標題置中邏輯,使其達到真置中
  • 加上先前遺漏的畫面底部訊息之高螢幕支援:
    special_search() (特殊觀察名單)、so/passwd.c (送新密碼)
  • ✨ 將主選單 footer 的呼叫器狀態向右對齊並補滿 b_cols 個字元,像 PttBBS 那樣
  • ✨ 新增「畫面大小參考座標系」系統,解決使用固定座標無法適應畫面縮放的問題
    • 參考座標系的座標 (T_LINES_REF/a + b, T_COLS_REF/c + d) 會被 map 到
      真實座標系的 (t_lines/a + b, t_columns/c + d) 上 (有條件限制)
      • T_LINES_DIV_RES % a == 0, abs(b) < T_LINES_OFF_MAX,
        T_COLS_DIV_RES % c == 0, & abs(d) < T_COLS_OFF_MAX
        四個條件要同時成立
    • 原理是模除運算,但是參數選擇了 2 的冪次,編譯器會將之取代成位元運算
    • 主要函數: gety_ref() & getx_ref(): 取得真實座標系的 y/x
    • 補助函數: move_ref(y, x): 呼叫 move_ansi(gety_ref(y), getx_ref(x))
  • ✨ 現在主選單在畫面大小改變後,按任意鍵可以調整位置重繪
  • ✨ 現在 vget() (輸入框處理函數) 在畫面大小改變後,按任意鍵可以調整位置重繪
  • ✨ 現在彈出選單在畫面大小改變後,按任意鍵可以調整位置重繪

pfterm 的修正

  • 將主程式 (maple/pfterm.c) 內的函數宣告用 extern "C" 包起
  • 增加定義 PFTERM_SUPPORT_IAC 就允許輸出 '\xff' 的設定
  • ✨ 讓 pfterm 支援黑白模式,修正彩色模式選項在 pfterm 下無效的問題:
    (D)Service -> (U)ser -> (C)onfigure -> (F)avorite -> 0 □ 彩色模式
  • 將先前增加的 virtual attribute (vattr) 改名成 cursor attribute (cattr)
  • 改在 outc() 中處理 cursor attribute
  • ✨ 完整支援反白屬性 (SGR 7, SGR 27) 的模擬
  • ✨ 將斜體屬性 (SGR 3, SGR 23) 與反白屬性造成的反白效果分開,
    現在只要有其中一個屬性就打開反白效果
  • ✨ 支援隱藏屬性 (SGR 8, SGR 28) 的模擬
  • ✨ 支援 aixterm 的亮色前景 (SGR 90-97) 以及亮色背景 (SGR 100-107) 的模擬
    (亮色背景會被轉換成對應的普通色背景)
  • ✨ 支援黯淡屬性 (SGR 2) (會被轉換成普通色屬性 (SGR 22))
  • 💥 修正把 CSI ; <m> H 誤當作 CSI ; H 的 parsing 錯誤;2007 年時就有此問題
  • 將先前用以修正將 ESC <ch> 誤當做 CSI <ch> 的 parsing 錯誤
    的 macro EXEC_ESCSEQ,依照 ECMA-48 所使用的術語,改名成 EXEC_C1_FS

pmore 的修正

  • 移除 Maple3 CSI K 問題的 workaround,因已被 PMORE_NO_FORCE_CLRTOEOL 處理

✨ 引進 PttBBS 式的光棒選單系統,及相關修正

  • 將選單游標的繪製一律改由 cursor_*() 函數實行
  • ✨ 增加啟用光棒選單系統的個人設定:
    (D)Service -> (U)ser -> (C)onfigure -> (F)avorite -> K ■ 使用光棒選單系統
  • 移除 MapleBBS-itoc 式的選單系統相關的 code
  • 更改部分介面在光棒選單系統開啟時的色彩,以適應光棒選單系統
  • 改進 grayout() 函數成 grayoutrect(),以處理多個 column 的列表
  • ✨ 光棒選單系統預設對新註冊的使用者以及 guest 帳號啟用

與 xover 列表系統 (maple/xover.c) 有關的修正

  • XO::xyz 的型別由 char * 改成 void *
  • ✨ 將轉信設定列表 (so/innbbs.c) 用 xover() 重寫;移除 xo_cursor() 函數
  • 與光棒選單系統相關的修正:
    • 修正畫面未重繪時重畫游標,造成雙重光棒的問題
    • 修正呼叫一般按鍵對應的函數,而函數直接呼叫螢幕重繪函數,
      造成 xover() 不知道列表有被重繪,而漏畫游標的問題
    • 修正某些函數重繪了游標所在行,卻沒有畫回游標,導致漏畫游標的問題
  • 💥 修正 h 鍵的 callback 函數的回傳值被強制視為 XO_NONE 的問題 [maple-itoc]
  • ✨ 在 C++ 模式下編譯時,改用 hash table (std::unordered_map)
    作為 callback 函數列表的資料結構 (KeyFuncList; 原先是 KeyFunc[]),
    讓取得某函數的時間複雜度變成 O(1)
  • ✨ 在 C++ 模式下,改用 hash table 作為 thread 模式的 op-code 列表的資料結構
    (KeyMapList; 原先是 KeyMap[])
  • ✨ 將 callback 函數列表的指標 XZ::cb 改放入 XO 中,
    強制寫程式的人指定 callback 函數列表,避免誤用函數而造成資料毀壞
  • ✨ 增加 XO::recsiz,為之後消除 xover 系統的 boilerplate code 的工作作準備
  • ❗️ 重新分配了 xover 系統使用的特殊值,請全部重新編譯。
    • XO_MOVE 重新定義為游標位置的 bias,簡化游標位置為負數的處理
      • 游標位置為負數時,flag bits 不會再跑掉
    • 保證 return XO_MOVE + XO_TAIL 可以讓游標移到最後 (TAIL;非 TALL)
      • xo->pos = XO_TAIL 在列表項目數不超過 XO_TAIL 時也可以
    • 用 bit flags 表達列表中要重繪的部分以及是否重新載入
      • 可用 (bool)(cmd & XR_PART_BODY) 檢查列表本身會不會被重繪
      • 可用 cmd |= XR_BODY 指定至少從列表處重繪
    • 可以表示畫面重繪和重新載入、以及游標移動或按鍵輸入的組合
      • 新增 XR_* 以及 XR_PART_* macros 作為組合用
      • 例如向前移動 42 項,頭尾循環,並重繪 footer:
        return XR_FOOT + XO_MOVE + XO_WRAP + XO_REL - 42
      • 例如執行 i 鍵對應的功能,並重繪至少從列表內容到 footer 的畫面部分:
        return XR_BODY + 'i'
    • 新增組合指令的連鎖機制,方便處理需要呼叫另一個 callback 的狀況
    • 使用游標移動表示 xover zone 的切換
      • 切換到 9 號 zone: return XO_ZONE + 9
      • 切換到下個 zone (頭尾循環): return XO_ZONE + XO_WRAP + XO_REL + 1
  • ✨ 增加 XO_REL 以方便游標位置未知時的上下移動,以及避免移動範圍有限的限制
  • 💥 避免 XZ::xo 變成 dangling pointer,
    以修正強制切換 xover zone 的時候會 crash 的問題
  • 與 footer 相關的修正:
    • 處理 XO_FOOT 時,從原本只清除螢幕底部,改成呼叫對應的 callback 函數
    • ✨ 加回部分列表的 footer
    • 將回傳 XO_NONE 但卻需要重繪 footer 的函數改為回傳 XO_FOOT
    • xo_thread() (主題瀏覽) 改以回傳值有無包含游標操作來判斷是否找到文章,
      現在回傳值可以包含畫面重繪的指令,解決了 footer 不會重繪的問題
    • 讓許多 xover 搜尋功能的回傳值都包含 XR_FOOT,可重繪 footer 了
    • xover() 輔助訊息 (找沒有了耶...:() 出現後按任意鍵可重繪 footer
    • ✨ 恢復 xover() 進入滿的最後一頁時的輔助訊息 (都給我看光光了! ^O^)
  • 與 mmap() 及單行捲動相關的修正:
    • xo_load() 改成使用 MAP_PRIVATEmmap(),一次 map 整個列表,
      由系統決定載入時機,緩解全站使用者一齊瘋狂上捲下捲時 IO 爆炸的危機;
      移除原先的 buffer read 程式碼,
      並解除 xover record 的 byte 大小不能大於 XO_RSIZ (256) 的限制
    • ❗️ 將 xo_pool 的型別改變了,請全部重新編譯,否則列表會出現黑洞項目。
    • 消除 xo_thread() 中的列表重新載入
    • 消除 xo_thread() (thread 模式) 沒找到文章時的無用的換頁
    • ✨ 串接模式改成一次載入整個列表,避免使用者瘋狂換頁時大量呼叫 mmap()
    • 簡化 post_history() 中找上一篇與下一篇文章的邏輯
    • 將所有 xover callback 函數改成直接使用列表游標的絕對位置
    • 列表換頁時不再呼叫 xo_load(),而是直接呼叫重繪列表的函數
    • ✨ 增加 XO_SCRL 來以行作單位捲動列表
    • ✨ 改寫列表換頁時,畫面最上方的行的位置的計算,解決只能成倍數對齊的問題

與主選單系統 (maple/menu.c domenu()) 有關的修正

  • 將原先的 menu() 分離成 main_menu() & domenu() 兩函數
  • 延續原先邏輯,增加選單函數回傳 QUITSKIN 的處理
  • 將登出程序從 goodbye() 移到 maple/bbsd.c tn_main()
  • ✨ 改寫選單函數資料結構 MENU
    讓 callback 函數可以自帶一個 const void * 參數,放什麼都可,
    免去換個參數就要寫個新函數的不便
  • ✨ 增加第一個選項開始的座標參數,可以動態指定選項開始的座標位置
  • ✨ 支援多字元的指令開頭配對;超過 1 個字元時不儲存停留選項
  • ✨ 快速鍵功能改成只在按鍵由鍵盤輸入時才執行,
    避免進入選單時,先前儲存的選項剛好是快速鍵時會誤執行對應功能的問題
  • ✨ 加上動態看板被遮蔽時隱藏之功能,方便顯示全螢幕選單
  • ✨ 支援多個 column 的選單的顯示,像 FireBird BBS 那樣
  • ✨ 擴充 MENU::desc,有 '\n' 字元時,就將後面的文字顯示在畫面下方作為說明,
    目前選項沒有說明時,使用目前選單的說明,再沒有就不顯示。
  • 使用畫面大小參考座標系,解決座標改成參數後不能適應畫面縮放的問題

與 BBS-Lua (maple/bbslua.c) 有關的修正

  • 將先前遺漏的編譯選項加到檔案開頭的環境選項列表中
  • ❗️ 印出 Lua 錯誤前重設游標色彩,修正錯誤訊息的文字與背景可能同色而隱形的問題
  • 修正 visio 版的 read_vin() 移動 vi_pool[] 內的資料時大小算錯的問題
  • 讓按鍵轉字串的函數 (bl_k2s()) 支援 '\0' (Ctrl-Space)

與 BBS-Ruby (maple/bbsruby.c) 有關的修正

  • 移除 signal handling
  • 消除不必要的 buffer allocations
  • 修正執行前沒有清除螢幕的問題
  • ❗️ 印出 Ruby 錯誤前重設游標色彩,修正錯誤訊息的文字與背景可能同色而隱形的問題
  • 為支援 mruby 作準備:
    • 從函數 ruby_script_range_detect() 獨立出新函數 bbsruby_load_TOC()
    • 將 Ruby class BBS 改成 Ruby module
    • 用型別安全的 rb_funcallv() 取代 rb_funcall()
    • Variadic BBS-Ruby API functions 原本接受 Ruby array,改接受 C array
    • Ruby 解釋器還沒初始化的時候,不要 print exception
  • ✨ 利用幾個 macro 來同時支援 CRuby 與 mruby,
    解決 BBS-Ruby 不能在 CRuby 2.3 後的版本上安全執行的問題,
    以及完美解決 Ruby 全域物件不會重設的問題
  • 增加讓 BBS-Ruby 改使用 mruby 的編譯選項
  • 針對使用 mruby 的修正
    • ✨ 使用白名單,只 load 安全的 mruby gem libraries

與編輯器有關的修正

  • 修正先前修正 ANSI 模式下的 delete 與 backspace 後,跨行刪除會出錯的問題
  • 修正因為先前的修正,在非 ANSI 模式下頁面左右捲動後使用 delete 會出錯的問題

✨ 系統設定介面的修正

  • bitset() (多重選項設定): 防止使用者選擇系統保留的選項,並暗化其顯示
  • [acct|bm]_setup() (帳號/版主資料查詢與設定):
    在輸入查詢理由前維持隱藏隱私資料;查詢完立即清除螢幕
  • x_file() (編個人檔案/編系統檔案): 用主選單系統 (domenu()) 重寫介面

與星空戰鬥雞 (so/pip.h & so/pip.c) 有關的修正

  • 消除不必要的 indirect buffers
  • 💥 修正 pip_play_outing() (郊遊) 的特殊事件忘了輸出標題的問題
  • 將被當作 boolean 值的字串 "Y" & "N" 使用標準的 true & false 取代
  • 將許多 1-indexed 的資料結構改成 0-indexed,並移除無用的欄位,避免浪費記憶體
  • 將許多 1-indexed 的函數邏輯改成 0-indexed
  • ✨ 隱藏 pip_weapon_doing_menu() (武器購買) 選單中的 0 號道具 (沒有裝備);
    統一 <part>list[n].nameweapon<part>[n];移除 weapon<part> 陣列
  • 💥 修正 pip_endingcombat() (戰鬥結局) 符合特定條件時,產生未定義結果的問題
  • 💥 修正 pip_getworkmax() (最大工作點數) 在點數都過低時,產生未定義結果的問題
  • 💥 修正 pip_getworkmax()workO (酒家) 誤當作 workP (夜總會) 的問題
  • 💥 修正 pip_marriage_offer() (求婚) 在小雞性別不明時會 buffer overrun 的問題
    • 先假定小雞為母,作為 workaround (你是不是假定了我的性別)
  • 💥 移除多餘的條件檢查;
    修正點數都在某範圍內才會給中等評價,任一點數超出就會給最低評價的邏輯問題
  • 💥 修正 twice() (計算升級點數) 使用 float 變數,計算精度卻為 int 的問題
  • ✨ 將小雞資料結構 struct chicken 中性質相近的點數欄位改用陣列重寫,
    將需要一次操作多個點數的函數用迴圈改寫
  • ✨ 消除部分重複又冗長的 code,將程式碼從 778 + 9003 = 9781 行,
    刪減成 779 + 8458 = 9237 行,少了 544 行,也就是約原先 5% 的行數

✨ 其它影響使用者介面的雜項修正

  • board_outs(): 避免看板分類的色彩為黑色,改顯示成亮黑色
  • hdr_outs(): 修正文章標題的括號 highlight 沒有處理 DBCS 的問題
  • 修正 xover 列表中的某些操作產生的符號與直接重繪的符號樣式不符的問題

與 IP、socket、及 DNS 有關的修正

  • 從函數 dns_open() 獨立出 dns_openip() 函數,消除有問題的 goto
  • 一律改用 AF_* macros,不使用 PF_* macros
  • ✨ 讓轉信程式 (innbbsd/)、聊天室 (maple/xchatd)、BBS 主程式 (maple/bbsd)
    支援 IPv6
  • ❗️ 將 UTMP::in_addr 的型別改成 include/dns.h 中的 ip_addr
    (已重新定義為 struct sockaddr_instruct sockaddr_in6 的 union);
    大小改變了,請重開 UTMPSHM
  • ✨ 讓 DNS library (include/dns.h & lib/dns.c) 支援 IPv6 的 DNS 查詢
  • ✨ 加寬使用者名單中的「故鄉」欄位
  • dns_ident() & dns_name() 加上 buffer 長度參數,防止 buffer overflow
  • 修正 dns_mx() & dns_smtp() 使用的分隔符號 : 與 IPv6 格式衝突的問題
  • ✨ 增加取消定義 NOIDENT 就能啟用進站反查的設定

與轉信程式 (innbbsd) 有關的修正

  • 重新引用 RFC-822 & RFC-1123 中的 Date and Time Specification 一節
  • ✨ 改寫時間的 parsing logic (parse_date()),
    允許 2 位數年份以及秒的省略,並正確處理連續空格及可省略的空格,
    使其更符合 RFC-1123 (但不處理文字時區與括號註解)
  • ✨ 移除 ARPA 格式時間產生函數 (Atime()) 所產生的括號時區,
    因為括號內文字是註解 (見 RFC-822),需要被處理程式忽略
  • ✨ 增加會被自動推導的 BBSUTCZONE 編譯設定,以解決時區被 hardcoded 的問題

與 daolib (lib/) 有關的修正

  • 繞過 C/C++ 中 signed integer overflow 會造成 undefined behavior 的問題

與 shared libraries (so/) 有關的修正

  • 將 shared libraries 對標準函數庫 link,以解決用 C++ 編譯,link 時的錯誤
  • 在用 GNU C 或 ISO C++11 編譯時,檢查 dynamic load 的物件型別是否正確
  • 減少 external functions;將 internal functions 都改成 static
  • ✨ 動態載入失敗時,下次要載入時,原本會直接放棄,改成再試一次 (DL_get())
  • ✨ 讓所有的 dynamic loading libraries 支援 hot-swapping (dynamic reloading),
    並加上防止 library 還在使用時就被 unload 的保護機制
  • ✨ 增加定義 DL_HOTSWAP 啟用 dynamic loading library 的 hot-swapping 的設定
    • 使用 hot-swapping 的話,更改程式碼並安裝後,不用重新登入即可看到改變。

與測試程式 (test/) 有關的修正

  • 修正 lib_splaysplay_free() 會造成存取違規以及 double free 的問題
  • 將好用的 splay_out()splay_free() 擴充後,移到 lib/splay.c
  • 修正 lib_xsort 主函數中的 memory leak
  • ✨ 改用 assert() 及 C11/C++11 的 static_assert() 檢查運作結果

與 BBS 維護工具 (util/) 有關的修正

  • ✨ 將分類看板 image 的建立工作從 account 移到 acpro 中,
    解除在某些時段不能重設分類看板的限制
  • 移除與先前已移除的工具相關的殘留 code
  • ✨ 重新審視並啟用 readBENZreadFRIENZ、以及 readUSR 工具
  • 💥 修正 utmp-dump 先前用 getopt() 重寫的 command-line option parsing
    有邏輯錯誤,而導致無法進入主程式的問題
  • splay_free() 消除 acl-sortpoststat 中的 memory leaks
  • 💥 修正 acl-sort 中的 at_cmp(x, y) 比較函數,在 xy 相同時,
    會造成 buffer overrun,甚至進入無限迴圈的問題

與程式資訊 (so/xyz.c: x_siteinfo()) 有關的修正

  • BBS-Ruby 使用 mruby 時,顯示 mruby 的版本
  • ✨ 簡短化程式資訊,避免超出畫面
  • ✨ 增加模組作者資訊;加亮已啟用的模組資訊
  • ✨ 增加 git 資訊,參考 PttBBS 為基礎
  • 將程式資訊移到主程式中,成全域變數 (include/global.h),
    以應付不同版本或啟用不同功能的 bbsd 可能載入同版本的 xyz 的情況

✨ 與上站紀錄有關的修正

  • 為了方便支援 IPv6,不再將連線地址印成 binary hex;一律印成標準格式
  • 記錄連線類型 (BBS: telnet; WSP: WebSocket proxy)

雜項

  • 移除全域變數 now 以及函數 syncnow(),因為現在的 Linux 有 vDSO
  • 利用未定義的 macro 不會展開的原理,消除部分程式碼中大量的 #ifdef
  • 假設 C 的最低標準是 C99,C++ 的最低標準是 C++11
  • Deprecate ACCT::ident
  • 假設 mmap() 可以用;移除 HAVE_MMAP macro 及其相關 code

與 coding style 有關的修正

  • Reduce variable scope,可以減少複用變數也減少使用記憶體
  • 修改 hdr_stamp() 前對 token 的註解,從 A / F / 0 改成 'A' / 'F' / 0
    以免有人看了之後真的 pass 字元 '0' 進去爆炸
  • ✨ 重新審視 bitwise operation 的使用,
    不要用 bitwise operation 取代 2 的冪次的乘法/除法/取餘法,
    (不過還是可以取代 2 的冪次的「向負無限大取整數」的除法/取餘法)
    應該用一般的乘法以及 unsigned type 的除法/取餘法,
    因為現代的編譯器會嘗試把乘除運算取代成位元運算
  • xo_thread(): 不要在 code 中假設 macro 的值 (RS_FORWARD),
    這樣不容易看懂,而且一改就會爆
  • 讓 12 個在 pure function 中的 local pointers 指向 const
  • 將超過 37 個 array 變成 static const
  • 讓超過 150 個在 xover callback 函數中的 local pointers 指向 const
  • 移除函數宣告前多餘的 extern
  • ✨ 重新檢視所有資料結構,加入註解標籤 DISKDATASHMDATA
    方便快速知道改了某資料結構的後果;
    加入註解標籤 Hashable 方便之後改成 C++ 的 hash table
  • 移除 macro STR4(),用函數 strncmp() 取代,以免處理短字串時出錯

其它與相容 C++ 標準有關的修正

  • 補上遺漏的函數宣告,以避免用 C++ 編譯時的 link 錯誤
  • 修正誤用字串搜尋函數更改 const 字串的問題(無法通過 C++ 編譯)
  • 移除程式碼中所有的 register 關鍵字 (在 C++ 中沒用,C++17 後不能用)
  • 為了方便使用 C99 及 C++11 中的語法不盡相容的進階功能,增加了相應的 macros

與編譯工具有關的修正

  • 修正使用 BSD-make 定義的函數 GETVAR 沒有正確移除參數引號的問題
  • 💥 修正無法正確取得 Unix user 的 gid 的問題
  • 修正用 bmake 編譯時的 NO_SO flag (強制 static link) 不被正確處理的問題

@IepIweidieng IepIweidieng force-pushed the fixpack003-LUNATIC-FORCE-stage6 branch 2 times, most recently from ae300e0 to 320f45b Compare February 10, 2020 13:39
@IepIweidieng
Copy link
Member Author

IepIweidieng commented Feb 10, 2020

Currently there is file size inconsistency issue about xover list system with mmap().
The PR should not be merged for now and is temporary closed until the issue is solved.

Updated 2020-02-12:
The reason behind the file size inconsistency issue is that performing ftruncate() on mmap()ed file fails on WSL1.
Relevant bug report: microsoft/WSL#902

@IepIweidieng
Copy link
Member Author

IepIweidieng commented Feb 12, 2020

After some investigation, the aforementioned issue only occurs on WSL1 and does not affect normal Linux.

A workaround mechanism for broken ftruncate() on WSL1 is currently being designed:

  • Add function xo_preload(XO *xo, int pos_begin, int pos_end) for ensure a range of record item is loaded.
    • xo_preload() can also be used to estimate the physical memory usage of the mmap() memory segment.
  • Add a test program to test whether ftruncate() works on files currently loaded with mmap(); define BROKEN_MMAP_TRUNCATE if the test failed.
  • In this workaround:
    • Use mmap() with flag MAP_ANONYMOUS and size of the file of list records to simulate file-backed mmap().
    • xo_preload() loads the required part of the file into the corresponding virtual memory segment allocated by the mmap() call.

The mechanism will be implemented in future PRs, and therefore the issue is no longer relevant to this PR.

This PR is now reopen and available to be merged again.

@IepIweidieng IepIweidieng reopened this Feb 12, 2020
@IepIweidieng IepIweidieng force-pushed the fixpack003-LUNATIC-FORCE-stage6 branch 3 times, most recently from 8014083 to 88d8528 Compare February 12, 2020 11:23
- include/bbs_script.h:
   Redefine `RUBY_RELEASE_STR` as `MRUBY_RUBY_VERSION` for mruby.
- so/xyz.c: `x_siteinfo()`: Show mruby version if mruby is used.
…with empty `backtrace`, e.g., syntax error exceptions.
…tion.

Found with `ack 'memcpy\([^,]*?(\b\w+\b)[^,]*?,[^,]*\1'`

- maple/more.c: `mgets()` & `mread()`
- maple/talk.c: `bmw_rqst()`
- maple/xover.c: `Tagger()`
- so/chat.c: `t_chat()`
IepIweidieng and others added 21 commits February 13, 2020 23:46
…he last page which is full of items.

- Add the local variable `top_prev`
   to determine whether to display the message.
- Move the code of the message display logic
   from special operations to cursor redraw handling.
- maple/talk.c: `pal_search()` & `ulist_search()`.
- maple/xover.c: `xo_jump()`.
- so/innbbs.c: `innbbs_search()`.
- so/list.c: `list_search()`.
…acks.

- `XO_HEAD` & `XO_BODY` are required for scrolling
- `XO_NONE` cannot be used as xover callback key
…pping and redraw prompt on screen size changes.
…ghtbar system for new users and guests.

Guests can be used for system demonstration.
New users should inherit the UI behavior for guest to avoid confusion.
- Downgrade most network logging to debug.
- Use ngx.exit(444), a special code for nginx to close connection
  directly, to close request after websocket connection has been
  established.

Fixes: ptt/pttbbs#71

(cherry picked from commit ptt/pttbbs@a3431e4)
- `xo_load()`: Use `mmap()` for loading xover records.
- Make `xo_pool` a pointer to the xover record of the screen top item
- Add `xo_pool_base` for the xover record of the beginning item of the list
- Lift the restriction that the size of a xover record should not bigger than `XO_RSIZ`
- maple/xover.c: `xo_get()`:
   Initialize `xo->top` to perform the initial alignment.
- maple/post.c: `xypost_pick()` & maple/xover.c: `xo_load()` & `xo_thread()`:
   Refine the calculation of the position of the list top.
@holishing holishing merged commit b58f120 into ccns:master Feb 13, 2020
@github-pages github-pages bot temporarily deployed to github-pages February 13, 2020 16:25 Inactive
@IepIweidieng IepIweidieng deleted the fixpack003-LUNATIC-FORCE-stage6 branch February 14, 2020 05:00
IepIweidieng added a commit that referenced this pull request Apr 29, 2021
IepIweidieng added a commit that referenced this pull request May 3, 2021
@IepIweidieng IepIweidieng restored the fixpack003-LUNATIC-FORCE-stage6 branch November 26, 2021 06:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants