]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/client.c
Remove various obsolete ConfItem statuses (types) and flags.
[irc/rqf/shadowircd.git] / src / client.c
index 6279a5660587d7bb064932694ac003bb09e35fab..012076be8ebfa5e1fcc1243847b161249e7f28e0 100644 (file)
@@ -1,10 +1,11 @@
 /*
- *  ircd-ratbox: A slightly useful ircd.
+ *  charybdis: an advanced ircd.
  *  client.c: Controls clients.
  *
  *  Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
  *  Copyright (C) 1996-2002 Hybrid Development Team
  *  Copyright (C) 2002-2005 ircd-ratbox development team
+ *  Copyright (C) 2007 William Pitcock
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -21,7 +22,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
  *
- *  $Id: client.c 3167 2007-01-26 18:52:11Z jilles $
+ *  $Id: client.c 3514 2007-06-06 16:25:21Z nenolod $
  */
 #include "stdinc.h"
 #include "config.h"
@@ -58,6 +59,9 @@
 #include "msg.h"
 #include "monitor.h"
 #include "blacklist.h"
+#include "reject.h"
+#include "scache.h"
+#include "irc_dictionary.h"
 
 #define DEBUG_EXITED_CLIENTS
 
@@ -81,6 +85,8 @@ extern BlockHeap *pclient_heap;
 
 extern char current_uid[IDLEN];
 
+struct Dictionary *nd_dict = NULL;
+
 enum
 {
        D_LINED,
@@ -123,6 +129,8 @@ init_client(void)
        eventAddIsh("check_pings", check_pings, NULL, 30);
        eventAddIsh("free_exited_clients", &free_exited_clients, NULL, 4);
        eventAddIsh("exit_aborted_clients", exit_aborted_clients, NULL, 1);
+
+       nd_dict = irc_dictionary_create(irccmp);
 }
 
 
@@ -154,7 +162,7 @@ make_client(struct Client *from)
 
                client_p->localClient->lasttime = client_p->localClient->firsttime = CurrentTime;
 
-               client_p->localClient->fd = -1;
+               client_p->localClient->F = NULL;
                client_p->localClient->ctrlfd = -1;
 
                client_p->preClient = (struct PreClient *) BlockHeapAlloc(pclient_heap);
@@ -214,8 +222,8 @@ free_local_client(struct Client *client_p)
                client_p->localClient->listener = 0;
        }
 
-       if(client_p->localClient->fd >= 0)
-               comm_close(client_p->localClient->fd);
+       if(client_p->localClient->F->fd >= 0)
+               comm_close(client_p->localClient->F->fd);
 
        if(client_p->localClient->passwd)
        {
@@ -296,10 +304,6 @@ check_pings_list(dlink_list * list)
        {
                client_p = ptr->data;
 
-               /*
-                ** Note: No need to notify opers here. It's
-                ** already done when "FLAGS_DEADSOCKET" is set.
-                */
                if(!MyConnect(client_p) || IsDead(client_p))
                        continue;
 
@@ -331,10 +335,7 @@ check_pings_list(dlink_list * list)
                        }
                }
 
-               if(!IsRegistered(client_p))
-                       ping = ConfigFileEntry.connect_timeout;
-               else
-                       ping = get_client_ping(client_p);
+               ping = get_client_ping(client_p);
 
                if(ping < (CurrentTime - client_p->localClient->lasttime))
                {
@@ -345,9 +346,9 @@ check_pings_list(dlink_list * list)
                        if(((CurrentTime - client_p->localClient->lasttime) >= (2 * ping)
                            && (client_p->flags & FLAGS_PINGSENT)))
                        {
-                               if(IsAnyServer(client_p))
+                               if(IsServer(client_p))
                                {
-                                       sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) && !IsServer(client_p) ? L_NETWIDE : L_ALL,
+                                       sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                                             "No response from %s, closing link",
                                                             get_server_name(client_p, HIDE_IP));
                                        ilog(L_SERVER,
@@ -391,6 +392,7 @@ check_unknowns_list(dlink_list * list)
 {
        dlink_node *ptr, *next_ptr;
        struct Client *client_p;
+       int timeout;
 
        DLINK_FOREACH_SAFE(ptr, next_ptr, list->head)
        {
@@ -404,8 +406,20 @@ check_unknowns_list(dlink_list * list)
                 * for > 30s, close them.
                 */
 
-               if((CurrentTime - client_p->localClient->firsttime) > 30)
+               timeout = IsAnyServer(client_p) ? ConfigFileEntry.connect_timeout : 30;
+               if((CurrentTime - client_p->localClient->firsttime) > timeout)
+               {
+                       if(IsAnyServer(client_p))
+                       {
+                               sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL,
+                                                    "No response from %s, closing link",
+                                                    get_server_name(client_p, HIDE_IP));
+                               ilog(L_SERVER,
+                                    "No response from %s, closing link",
+                                    log_client_name(client_p, HIDE_IP));
+                       }
                        exit_client(client_p, client_p, &me, "Connection timed out");
+               }
        }
 }
 
@@ -1099,7 +1113,7 @@ free_exited_clients(void *unused)
                                                target_p->name, (unsigned int) target_p->status,
                                                target_p->flags, target_p->flags2, target_p->handler);
                                        sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                               "Please report this to the ratbox developers!");
+                                               "Please report this to the charybdis developers!");
                                        found++;
                                }
                        }
@@ -1284,7 +1298,7 @@ exit_aborted_clients(void *unused)
                                        abt->client->name, (unsigned int) abt->client->status,
                                        abt->client->flags, abt->client->flags2, abt->client->handler);
                                sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                       "Please report this to the ratbox developers!");
+                                       "Please report this to the charybdis developers!");
                                continue;
                        }
                }
@@ -1419,6 +1433,7 @@ exit_unknown_client(struct Client *client_p, struct Client *source_p, struct Cli
 {
        delete_auth_queries(source_p);
        client_flush_input(source_p);
+       del_unknown_ip(source_p);
        dlinkDelete(&source_p->localClient->tnode, &unknown_list);
 
        if(!IsIOError(source_p))
@@ -1434,7 +1449,6 @@ exit_unknown_client(struct Client *client_p, struct Client *source_p, struct Cli
        del_from_hostname_hash(source_p->host, source_p);
        del_from_client_hash(source_p->name, source_p);
        remove_client_from_list(source_p);
-       free_pre_client(source_p);
        SetDead(source_p);
        dlinkAddAlloc(source_p, &dead_list);
 
@@ -1454,11 +1468,7 @@ exit_remote_server(struct Client *client_p, struct Client *source_p, struct Clie
                strcpy(comment1, "*.net *.split");
        else
        {
-               if((source_p->serv) && (source_p->serv->up))
-                       strcpy(comment1, source_p->serv->up);
-               else
-                       strcpy(comment1, "<Unknown>");
-               
+               strcpy(comment1, source_p->servptr->name);
                strcat(comment1, " ");
                strcat(comment1, source_p->name);
        }
@@ -1490,6 +1500,7 @@ exit_remote_server(struct Client *client_p, struct Client *source_p, struct Clie
 
        del_from_client_hash(source_p->name, source_p);
        remove_client_from_list(source_p);  
+       scache_split(source_p->serv->nameinfo);
        
        SetDead(source_p);
 #ifdef DEBUG_EXITED_CLIENTS
@@ -1554,12 +1565,6 @@ exit_local_server(struct Client *client_p, struct Client *source_p, struct Clien
                           source_p->name, comment);
        }
        
-       if(source_p->localClient->ctrlfd >= 0)
-       {
-               comm_close(source_p->localClient->ctrlfd);
-               source_p->localClient->ctrlfd = -1;
-       }
-
        if(source_p->servptr && source_p->servptr->serv)
                dlinkDelete(&source_p->lnode, &source_p->servptr->serv->servers);
        else
@@ -1572,11 +1577,7 @@ exit_local_server(struct Client *client_p, struct Client *source_p, struct Clien
                strcpy(comment1, "*.net *.split");
        else
        {
-               if((source_p->serv) && (source_p->serv->up))
-                       strcpy(comment1, source_p->serv->up);
-               else
-                       strcpy(comment1, "<Unknown>");
-               
+               strcpy(comment1, source_p->servptr->name);
                strcat(comment1, " ");
                strcat(comment1, source_p->name);
        }
@@ -1596,6 +1597,7 @@ exit_local_server(struct Client *client_p, struct Client *source_p, struct Clien
 
        del_from_client_hash(source_p->name, source_p);
        remove_client_from_list(source_p);
+       scache_split(source_p->serv->nameinfo);
        
        SetDead(source_p);
        dlinkAddAlloc(source_p, &dead_list);
@@ -2095,23 +2097,20 @@ close_connection(struct Client *client_p)
        else
                ServerStats->is_ni++;
 
-       if(-1 < client_p->localClient->fd)
+       if(client_p->localClient->F)
        {
                /* attempt to flush any pending dbufs. Evil, but .. -- adrian */
                if(!IsIOError(client_p))
-                       send_queued_write(client_p->localClient->fd, client_p);
+                       send_queued_write(client_p->localClient->F->fd, client_p);
 
-               comm_close(client_p->localClient->fd);
-               client_p->localClient->fd = -1;
+               comm_close(client_p->localClient->F->fd);
+               client_p->localClient->F = NULL;
        }
 
-       if(HasServlink(client_p))
+       if(-1 < client_p->localClient->ctrlfd)
        {
-               if(client_p->localClient->fd > -1)
-               {
-                       comm_close(client_p->localClient->ctrlfd);
-                       client_p->localClient->ctrlfd = -1;
-               }
+               comm_close(client_p->localClient->ctrlfd);
+               client_p->localClient->ctrlfd = -1;
        }
 
        linebuf_donebuf(&client_p->localClient->buf_sendq);
@@ -2141,14 +2140,12 @@ error_exit_client(struct Client *client_p, int error)
         * for reading even though it ends up being an EOF. -avalon
         */
        char errmsg[255];
-       int current_error = comm_get_sockerr(client_p->localClient->fd);
+       int current_error = comm_get_sockerr(client_p->localClient->F->fd);
 
        SetIOError(client_p);
 
        if(IsServer(client_p) || IsHandshake(client_p))
        {
-               int connected = CurrentTime - client_p->localClient->firsttime;
-
                if(error == 0)
                {
                        sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) && !IsServer(client_p) ? L_NETWIDE : L_ALL,
@@ -2166,13 +2163,6 @@ error_exit_client(struct Client *client_p, int error)
                        ilog(L_SERVER, "Lost connection to %s: %s",
                                log_client_name(client_p, SHOW_IP), strerror(current_error));
                }
-
-               sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                                    "%s had been connected for %d day%s, %2d:%02d:%02d",
-                                    client_p->name, connected / 86400,
-                                    (connected / 86400 == 1) ? "" : "s",
-                                    (connected % 86400) / 3600,
-                                    (connected % 3600) / 60, connected % 60);
        }
 
        if(error == 0)