ircdのExcess Floodを無効にする

ircdを自分だけが使用し、大量に書き込みが許される状況では、ircdのExcess Floodの機能が非常に邪魔だ。

数キロバイトのテキストがircdに貯まるだけで、Excess Floodが発動し、強制ログアウトさせられる。

configで機能を削除する方法もあったが、とりあえずソースを弄って、Excess Floodの機能を削除した。

Excess Floodとmsg_readyエラーを削除する必要がある。

以下にソースを弄ったログを。


# less -N irc2.10.3p7+jp6/ircd/s_bsd.c

1935
1936 // READ ERROR キャンセル
1937
1938 /* ここからコメントアウト
1939         else if (msg_ready)
1940                 return exit_client(cptr, cptr, &me, "msg_readyエラーいらね。");
1941 ここまで */
1942
1943         /*
1944         ** For server connections, we process as many as we can without
1945         ** worrying about the time of day or anything :)
1946         */
1947         if (IsServer(cptr) || IsConnecting(cptr) || IsHandshake(cptr) ||
1948             IsService(cptr))
1949             {
1950                 if (length > 0)
1951                     {
1952                         done = dopacket(cptr, readbuf, length);
1953                         if (done && done != 2)
1954                                 return done;
1955                     }
1956             }
1957         else
1958             {
1959                 /*
1960                 ** Before we even think of parsing what we just read, stick
1961                 ** it on the end of the receive queue and do it when its
1962                 ** turn comes around.
1963                 */
1964                 if (length && dbuf_put(&cptr->recvQ, readbuf, length) < 0)
1965                         return exit_client(cptr, cptr, &me, "dbuf_put fail");
1966
1967 // Excess Flood キャンセル↓
1968 /* ここからコメントアウト
1969                 if (IsPerson(cptr) &&
1970                     DBufLength(&cptr->recvQ) > CLIENT_FLOOD)
1971                     {
1972                         cptr->exitc = EXITC_FLOOD;
1973                         return exit_client(cptr, cptr, &me, "Excess Flood");
1974                     }
1975 ここまで */
1976
1977
1978                 return client_packet(cptr);
1979             }
1980         return 1;
1981 }

これで再コンパイルして、無事溢れることなく、大量のテキストをircdに投げることができた。

また、他の方法としては、config.hを弄る方法もある。

以下にそのログを。


# less -N irc2.10.3p7+jp6/i686-pc-linux-gnu/config.h

320  * CLIENT_FLOOD
321  *
322  * this controls the number of bytes the server will allow a client to
323  * send to the server without processing before disconnecting the client for
324  * flooding it.  Values greater than 8000 make no difference to the server.
325  */
326 #define CLIENT_FLOOD    10000000000 //←ここの値をでかく(バイト)
   ・
   ・
544 #if defined(CLIENT_FLOOD)
545 //# if    (CLIENT_FLOOD < 8000) || (CLIENT_FLOOD > 512) ←この例外処理の範囲を
545 # if    (CLIENT_FLOOD > 8000) || (CLIENT_FLOOD < 512) //←こんな風にでも変更
546 error CLIENT_FLOOD needs redefining.
547 # endif
548 #else
549 error CLIENT_FLOOD undefined
550 #endif

これでコンパイルしてもOKだったと思う。
前だったからちょいと忘れたけど・・・