#endif
static listener_t *ListenerPollList = NULL;
+static int accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, void *data);\r
+static void accept_callback(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t addrlen, void *data);
static listener_t *
make_listener(struct rb_sockaddr_storage *addr)
switch(family)
{
case AF_INET:
- SET_SS_LEN(vaddr, sizeof(struct sockaddr_in));
+ SET_SS_LEN(&vaddr, sizeof(struct sockaddr_in));
((struct sockaddr_in *)&vaddr)->sin_port = htons(port);
break;
#ifdef IPV6
case AF_INET6:
- SET_SS_LEN(vaddr, sizeof(struct sockaddr_in6));
+ SET_SS_LEN(&vaddr, sizeof(struct sockaddr_in6));
((struct sockaddr_in6 *)&vaddr)->sin6_port = htons(port);
break;
#endif
* The client is sent to the auth module for verification, and not put in
* any client list yet.
*/
-static void
-add_connection(listener_t *listener, int fd, struct sockaddr *sai, int exempt)
+static void\r
+add_connection(struct Listener *listener, rb_fde_t *F, struct sockaddr *sai, int exempt)
{
struct Client *new_client;
s_assert(NULL != listener);
strlcpy(new_client->host, new_client->sockhost, sizeof(new_client->host));
- new_client->localClient->F = rb_add_fd(fd);
+ new_client->localClient->F = F;
new_client->localClient->listener = listener;
++listener->ref_count;
struct Listener *listener = (struct Listener *)data;\r
char buf[BUFSIZE];\r
struct ConfItem *aconf;\r
+ static time_t last_oper_notice = 0;\r
\r
if((maxconnections - 10) < rb_get_fd(F)) /* XXX this is kinda bogus */\r
{\r
return 0;\r
}\r
\r
- aconf = find_dline(addr);\r
+ aconf = find_dline(addr, addr.ss_family);\r
if(aconf != NULL && (aconf->status & CONF_EXEMPTDLINE))\r
return 1;\r
\r
rb_close(F);\r
}\r
\r
- add_connection(listener, F, addr, (struct sockaddr *)&lip, NULL);\r
+ add_connection(listener, F, addr, (struct sockaddr *)&lip, 1);\r
}