]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/listener.c
Add helpfiles for all extensions that provide commands.
[irc/rqf/shadowircd.git] / src / listener.c
index 0849ab63d265d3203e989d9f1971ff88490e92b0..3b8a1fbc83d1d2bcc67514922837cd6ddbc56ce8 100644 (file)
@@ -52,14 +52,14 @@ static const struct in6_addr in6addr_any =
 { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } };
 #endif 
 
-static listener_t *ListenerPollList = NULL;
+static struct Listener *ListenerPollList = NULL;
 static int accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, void *data);
 static void accept_callback(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t addrlen, void *data);
 
-static listener_t *
+static struct Listener *
 make_listener(struct rb_sockaddr_storage *addr)
 {
-       listener_t *listener = (listener_t *) rb_malloc(sizeof(listener_t));
+       struct Listener *listener = (struct Listener *) rb_malloc(sizeof(struct Listener));
        s_assert(0 != listener);
        listener->name = me.name;
        listener->F = NULL;
@@ -70,7 +70,7 @@ make_listener(struct rb_sockaddr_storage *addr)
 }
 
 void
-free_listener(listener_t *listener)
+free_listener(struct Listener *listener)
 {
        s_assert(NULL != listener);
        if(listener == NULL)
@@ -82,7 +82,7 @@ free_listener(listener_t *listener)
                ListenerPollList = listener->next;
        else
        {
-               listener_t *prev = ListenerPollList;
+               struct Listener *prev = ListenerPollList;
                for (; prev; prev = prev->next)
                {
                        if(listener == prev->next)
@@ -104,7 +104,7 @@ free_listener(listener_t *listener)
  * returns "host.foo.org:6667" for a given listener
  */
 const char *
-get_listener_name(const listener_t *listener)
+get_listener_name(const struct Listener *listener)
 {
        static char buf[HOSTLEN + HOSTLEN + PORTNAMELEN + 4];
        int port = 0;
@@ -133,7 +133,7 @@ get_listener_name(const listener_t *listener)
 void
 show_ports(struct Client *source_p)
 {
-       listener_t *listener = 0;
+       struct Listener *listener = 0;
 
        for (listener = ListenerPollList; listener; listener = listener->next)
        {
@@ -165,7 +165,7 @@ show_ports(struct Client *source_p)
 #endif
 
 static int
-inetport(listener_t *listener)
+inetport(struct Listener *listener)
 {
        rb_fde_t *F;
        int ret;
@@ -245,11 +245,11 @@ inetport(listener_t *listener)
        return 1;
 }
 
-static listener_t *
+static struct Listener *
 find_listener(struct rb_sockaddr_storage *addr)
 {
-       listener_t *listener = NULL;
-       listener_t *last_closed = NULL;
+       struct Listener *listener = NULL;
+       struct Listener *last_closed = NULL;
 
        for (listener = ListenerPollList; listener; listener = listener->next)
        {
@@ -307,7 +307,7 @@ find_listener(struct rb_sockaddr_storage *addr)
 void
 add_listener(int port, const char *vhost_ip, int family, int ssl)
 {
-       listener_t *listener;
+       struct Listener *listener;
        struct rb_sockaddr_storage vaddr;
 
        /*
@@ -389,7 +389,7 @@ add_listener(int port, const char *vhost_ip, int family, int ssl)
  * close_listener - close a single listener
  */
 void
-close_listener(listener_t *listener)
+close_listener(struct Listener *listener)
 {
        s_assert(listener != NULL);
        if(listener == NULL)
@@ -414,8 +414,8 @@ close_listener(listener_t *listener)
 void
 close_listeners()
 {
-       listener_t *listener;
-       listener_t *listener_next = 0;
+       struct Listener *listener;
+       struct Listener *listener_next = 0;
        /*
         * close all 'extra' listening ports we have
         */
@@ -435,7 +435,7 @@ close_listeners()
  * any client list yet.
  */
 static void
-add_connection(struct Listener *listener, rb_fde_t *F, struct sockaddr *sai, void *ssl_ctl)
+add_connection(struct Listener *listener, rb_fde_t *F, struct sockaddr *sai, struct sockaddr *lai, void *ssl_ctl)
 {
        struct Client *new_client;
        s_assert(NULL != listener);
@@ -447,6 +447,7 @@ add_connection(struct Listener *listener, rb_fde_t *F, struct sockaddr *sai, voi
        new_client = make_client(NULL);
 
        memcpy(&new_client->localClient->ip, sai, sizeof(struct rb_sockaddr_storage));
+       memcpy(&new_client->preClient->lip, lai, sizeof(struct rb_sockaddr_storage));
 
        /* 
         * copy address to 'sockhost' as a string, copy it to host too
@@ -479,6 +480,7 @@ accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, voi
        char buf[BUFSIZE];
        struct ConfItem *aconf;
        static time_t last_oper_notice = 0;
+       int len;
 
        if(listener->ssl && (!ssl_ok || !get_ssld_count()))
        {
@@ -518,7 +520,8 @@ accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, voi
                        
                if(ConfigFileEntry.dline_with_reason)
                {
-                       if (rb_snprintf(buf, sizeof(buf), "ERROR :*** Banned: %s\r\n", aconf->passwd) >= (int)(sizeof(buf)-1))
+                       len = rb_snprintf(buf, sizeof(buf), "ERROR :*** Banned: %s\r\n", get_user_ban_reason(aconf));
+                       if (len >= (int)(sizeof(buf)-1))
                        {
                                buf[sizeof(buf) - 3] = '\r';
                                buf[sizeof(buf) - 2] = '\n';
@@ -551,9 +554,14 @@ accept_ssld(rb_fde_t *F, struct sockaddr *addr, struct sockaddr *laddr, struct L
 {
        ssl_ctl_t *ctl;
        rb_fde_t *xF[2];
-       rb_socketpair(AF_UNIX, SOCK_STREAM, 0, &xF[0], &xF[1], "Incoming ssld Connection");
+       if(rb_socketpair(AF_UNIX, SOCK_STREAM, 0, &xF[0], &xF[1], "Incoming ssld Connection") == -1)
+       {
+               ilog_error("creating SSL/TLS socket pairs");
+               rb_close(F);
+               return;
+       }
        ctl = start_ssld_accept(F, xF[1], rb_get_fd(xF[0])); /* this will close F for us */
-       add_connection(listener, xF[0], addr, ctl);
+       add_connection(listener, xF[0], addr, laddr, ctl);
 }
 
 static void
@@ -567,13 +575,13 @@ accept_callback(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t add
 
        if(getsockname(rb_get_fd(F), (struct sockaddr *) &lip, &locallen) < 0)
        {
-               /* this shouldn't fail so... */
-               /* XXX add logging of this */
+               /* this can fail if the connection disappeared in the meantime */
                rb_close(F);
+               return;
        }
        
        if(listener->ssl)
                accept_ssld(F, addr, (struct sockaddr *)&lip, listener);
        else
-               add_connection(listener, F, addr, NULL);
+               add_connection(listener, F, addr, (struct sockaddr *)&lip, NULL);
 }