*/
/** @file
* @brief Functions that now (or in the past) relied on BSD APIs.
- * @version $Id: s_bsd.c,v 1.80 2005/07/12 02:13:10 entrope Exp $
+ * @version $Id: s_bsd.c,v 1.80.2.1 2006/03/14 03:45:52 entrope Exp $
*/
#include "config.h"
{
const struct irc_sockaddr *local;
IOResult result;
+ int family = 0;
+
assert(0 != aconf);
assert(0 != cptr);
/*
*/
if (irc_in_addr_valid(&aconf->origin.addr))
local = &aconf->origin;
- else if (irc_in_addr_is_ipv4(&aconf->address.addr))
+ else if (irc_in_addr_is_ipv4(&aconf->address.addr)) {
local = &VirtualHost_v4;
- else
+ family = AF_INET;
+ } else
local = &VirtualHost_v6;
- cli_fd(cptr) = os_socket(local, SOCK_STREAM, cli_name(cptr));
+ cli_fd(cptr) = os_socket(local, SOCK_STREAM, cli_name(cptr), family);
if (cli_fd(cptr) < 0)
return 0;
unsigned int length = 0;
if (socket_ready &&
- !(IsUser(cptr) &&
+ !(IsUser(cptr) && !IsOper(cptr) &&
DBufLength(&(cli_recvQ(cptr))) > feature_int(FEAT_CLIENT_FLOOD))) {
switch (os_recv_nonb(cli_fd(cptr), readbuf, sizeof(readbuf), &length)) {
case IO_SUCCESS:
if (length > 0 && dbuf_put(&(cli_recvQ(cptr)), readbuf, length) == 0)
return exit_client(cptr, cptr, &me, "dbuf_put fail");
- if (DBufLength(&(cli_recvQ(cptr))) > feature_int(FEAT_CLIENT_FLOOD))
+ if (IsUser(cptr)) {
+ if (DBufLength(&(cli_recvQ(cptr))) > feature_int(FEAT_CLIENT_FLOOD)
+ && !IsOper(cptr))
return exit_client(cptr, cptr, &me, "Excess Flood");
+ }
while (DBufLength(&(cli_recvQ(cptr))) && !NoNewLine(cptr) &&
(IsTrusted(cptr) || cli_since(cptr) - CurrentTime < 10))