Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

修正 Pure-ftpd 1.0.21 無法正確使用 -y (--peruserlimits) 參數來限制連線數的問題
post by tommy @ 12 九月, 2006 12:44
昨天把 pure-ftpd 加上 -y 參數來執行, 想限制同一個使用者同時間的連線數, 不過, 今天早上發現並沒有效果. 似乎這個參數在我的環境 (Debian Etch, X86-64) 下頭, 沒有辦法正常使用.

早上 trace 了一下, 發現在有新的連線登入時, 會把舊的連線的暫存檔都刪除,  所以算來算去, 都被認為是第一個連線, 當然不會有限制.

這個問題發生在 pure-ftpd 使用

kill(pid, 0) == 0

來判斷該行程是否仍然存在, 如果不存在, 則表示那個暫存檔的行程已經結束, 就把那個檔案刪除. 當然, 如果那個判斷是正常的話, 這樣子處理並不會有問題, 但是... 在我的系統上頭, 不論該行程是否存在, 上頭那個 kill 函式, 都會傳回 -1, 所以... 都會被認為是不存在.

查了一下 kill() 的說明, 在傳回 -1 時, 可以由 errno 的值來判斷原因. 而在我的系統上頭, 如果該行程不存在, errno 會是 ESRCH (3), 如果該行程存在, errno 會是 EPERM (1). 所以, 只要把上頭的指令, 修改一下, 當 kill() 傳回 -1 時, 如果 errno 值為 3 的時候, 才表示該行程不存在.

diff -Nur src.orig/ftpwho-read.c src/ftpwho-read.c
--- src.orig/ftpwho-read.c 2006-02-16 05:35:02.000000000 +0800
+++ src/ftpwho-read.c 2006-09-13 11:21:15.670109231 +0800
@@ -12,7 +12,7 @@

static inline int checkproc(const pid_t proc)
{
- return kill(proc, 0) == 0;
+ return (kill(proc, 0) == -1 && errno == ESRCH) ? 0 : 1;
}

static int scoreboard_cleanup(const char * const file)

這個 patch 可以由這兒抓取: http://www.teatime.com.tw/~tommy/mypatch/pureftpd_peruserlimits.patch 

經過這樣子的修正之後, 就可以正常的限制使用者的連線數了.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 92 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS