mirror of
https://github.com/matrix-construct/construct
synced 2024-11-20 08:51:18 +01:00
Porting accept callback functions
This commit is contained in:
parent
f691939a17
commit
0d89d5cd46
1 changed files with 77 additions and 0 deletions
|
@ -164,6 +164,7 @@ static int
|
||||||
inetport(listener_t *listener)
|
inetport(listener_t *listener)
|
||||||
{
|
{
|
||||||
rb_fde_t *F;
|
rb_fde_t *F;
|
||||||
|
int ret;
|
||||||
int opt = 1;
|
int opt = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -477,3 +478,79 @@ add_connection(listener_t *listener, int fd, struct sockaddr *sai, int exempt)
|
||||||
|
|
||||||
start_auth(new_client);
|
start_auth(new_client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, void *data)
|
||||||
|
{
|
||||||
|
struct Listener *listener = (struct Listener *)data;
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
struct ConfItem *aconf;
|
||||||
|
|
||||||
|
if((maxconnections - 10) < rb_get_fd(F)) /* XXX this is kinda bogus */
|
||||||
|
{
|
||||||
|
++ServerStats->is_ref;
|
||||||
|
/*
|
||||||
|
* slow down the whining to opers bit
|
||||||
|
*/
|
||||||
|
if((last_oper_notice + 20) <= rb_current_time())
|
||||||
|
{
|
||||||
|
sendto_realops_flags(SNO_GENERAL, L_ALL,
|
||||||
|
"All connections in use. (%s)",
|
||||||
|
get_listener_name(listener));
|
||||||
|
last_oper_notice = rb_current_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
rb_write(F, "ERROR :All connections in use\r\n", 32);
|
||||||
|
rb_close(F);
|
||||||
|
/* Re-register a new IO request for the next accept .. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
aconf = find_dline(addr);
|
||||||
|
if(aconf != NULL && (aconf->status & CONF_EXEMPTDLINE))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Do an initial check we aren't connecting too fast or with too many
|
||||||
|
* from this IP... */
|
||||||
|
if(aconf != NULL)
|
||||||
|
{
|
||||||
|
ServerStats->is_ref++;
|
||||||
|
|
||||||
|
if(ConfigFileEntry.dline_with_reason)
|
||||||
|
{
|
||||||
|
if (rb_snprintf(buf, sizeof(buf), "ERROR :*** Banned: %s\r\n", aconf->passwd) >= (int)(sizeof(buf)-1))
|
||||||
|
{
|
||||||
|
buf[sizeof(buf) - 3] = '\r';
|
||||||
|
buf[sizeof(buf) - 2] = '\n';
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strcpy(buf, "ERROR :You have been D-lined.\r\n");
|
||||||
|
|
||||||
|
rb_write(F, buf, strlen(buf));
|
||||||
|
rb_close(F);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
accept_callback(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t addrlen, void *data)
|
||||||
|
{
|
||||||
|
struct Listener *listener = data;
|
||||||
|
struct rb_sockaddr_storage lip;
|
||||||
|
unsigned int locallen = sizeof(struct rb_sockaddr_storage);
|
||||||
|
|
||||||
|
ServerStats->is_ac++;
|
||||||
|
|
||||||
|
if(getsockname(rb_get_fd(F), (struct sockaddr *) &lip, &locallen) < 0)
|
||||||
|
{
|
||||||
|
/* this shouldn't fail so... */
|
||||||
|
/* XXX add logging of this */
|
||||||
|
rb_close(F);
|
||||||
|
}
|
||||||
|
|
||||||
|
add_connection(listener, F, addr, (struct sockaddr *)&lip, NULL);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue