]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conn.c
Don't Proc_Kill() childs after Proc_Read(): done there already.
[ngircd-alex.git] / src / ngircd / conn.c
index 495c54f1d81a34ec00505ad7695f56ca369b3bf5..f059d917b25f4443f900b6d531a0d7643e2c45de 100644 (file)
@@ -68,7 +68,6 @@
 #include "log.h"
 #include "ng_ipaddr.h"
 #include "parse.h"
-#include "proc.h"
 #include "resolve.h"
 #include "tool.h"
 
@@ -755,8 +754,9 @@ Conn_Handler(void)
                        if (SSL_WantWrite(&My_Connections[i]))
                                continue; /* TLS/SSL layer needs to write data; deal with this first */
 #endif
-                       if (Proc_InProgress(&My_Connections[i].res_stat)) {
-                               /* Wait for completion of resolver sub-process ... */
+                       if (Proc_InProgress(&My_Connections[i].proc_stat)) {
+                               /* Wait for completion of forked subprocess
+                                * and ignore the socket in the meantime ... */
                                io_event_del(My_Connections[i].sock,
                                             IO_WANTREAD);
                                continue;
@@ -772,6 +772,7 @@ Conn_Handler(void)
                                             IO_WANTREAD);
                                continue;
                        }
+
                        io_event_add(My_Connections[i].sock, IO_WANTREAD);
                }
 
@@ -1073,9 +1074,9 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie
                    in_k, out_k);
        }
 
-       /* cancel running resolver */
-       if (Proc_InProgress(&My_Connections[Idx].res_stat))
-               Proc_Kill(&My_Connections[Idx].res_stat);
+       /* Kill possibly running subprocess */
+       if (Proc_InProgress(&My_Connections[Idx].proc_stat))
+               Proc_Kill(&My_Connections[Idx].proc_stat);
 
        /* Servers: Modify time of next connect attempt? */
        Conf_UnsetServer( Idx );
@@ -1377,14 +1378,9 @@ New_Connection(int Sock)
                identsock = -1;
 #endif
        if (!Conf_NoDNS)
-               Resolve_Addr(&My_Connections[new_sock].res_stat, &new_addr,
+               Resolve_Addr(&My_Connections[new_sock].proc_stat, &new_addr,
                             identsock, cb_Read_Resolver_Result);
 
-       /* ngIRCd waits up to 4 seconds for the result of the asynchronous
-        * DNS and IDENT resolver subprocess using the "penalty" mechanism.
-        * If there are results earlier, the delay is aborted. */
-       Conn_SetPenalty(new_sock, 4);
-
        Account_Connection();
        return new_sock;
 } /* New_Connection */
@@ -1889,7 +1885,7 @@ Init_Conn_Struct(CONN_ID Idx)
        My_Connections[Idx].signon = now;
        My_Connections[Idx].lastdata = now;
        My_Connections[Idx].lastprivmsg = now;
-       Proc_InitStruct(&My_Connections[Idx].res_stat);
+       Proc_InitStruct(&My_Connections[Idx].proc_stat);
 } /* Init_Conn_Struct */
 
 
@@ -1956,7 +1952,7 @@ cb_Connect_to_Server(int fd, UNUSED short events)
        }
 
        /* Read result from pipe */
-       len = Resolve_Read(&Conf_Server[i].res_stat, dest_addrs, sizeof(dest_addrs));
+       len = Proc_Read(&Conf_Server[i].res_stat, dest_addrs, sizeof(dest_addrs));
        if (len == 0)
                return;
 
@@ -1989,7 +1985,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
         * IDENT user name.*/
 
        CLIENT *c;
-       int i;
+       CONN_ID i;
        size_t len;
        char *identptr;
 #ifdef IDENTAUTH
@@ -1999,14 +1995,8 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
 #endif
 
        LogDebug("Resolver: Got callback on fd %d, events %d", r_fd, events );
-
-       /* Search associated connection ... */
-       for( i = 0; i < Pool_Size; i++ ) {
-               if(( My_Connections[i].sock != NONE )
-                 && (Proc_GetPipeFd(&My_Connections[i].res_stat) == r_fd))
-                       break;
-       }
-       if( i >= Pool_Size ) {
+       i = Conn_GetFromProc(r_fd);
+       if (i == NONE) {
                /* Ops, none found? Probably the connection has already
                 * been closed!? We'll ignore that ... */
                io_close( r_fd );
@@ -2015,7 +2005,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
        }
 
        /* Read result from pipe */
-       len = Resolve_Read(&My_Connections[i].res_stat, readbuf, sizeof readbuf -1);
+       len = Proc_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1);
        if (len == 0)
                return;
 
@@ -2058,8 +2048,6 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
 #ifdef DEBUG
                else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i );
 #endif
-       /* Reset penalty time */
-       Conn_ResetPenalty( i );
 } /* cb_Read_Resolver_Result */
 
 
@@ -2110,6 +2098,42 @@ Conn_GetClient( CONN_ID Idx )
        return c ? c->client : NULL;
 }
 
+/**
+ * Get PROC_STAT sub-process structure of a connection.
+ * @param Idx Connection index number
+ * @return PROC_STAT structure
+ */
+GLOBAL PROC_STAT *
+Conn_GetProcStat(CONN_ID Idx)
+{
+       CONNECTION *c;
+
+       assert(Idx >= 0);
+       c = array_get(&My_ConnArray, sizeof (CONNECTION), (size_t)Idx);
+       assert(c != NULL);
+       return &c->proc_stat;
+} /* Conn_GetProcStat */
+
+
+/**
+ * Get CONN_ID from file descriptor associated to a subprocess structure.
+ * @param fd File descriptor
+ * @return CONN_ID or NONE (-1)
+ */
+GLOBAL CONN_ID
+Conn_GetFromProc(int fd)
+{
+       int i;
+
+       assert(fd > 0);
+       for (i = 0; i < Pool_Size; i++) {
+               if ((My_Connections[i].sock != NONE)
+                   && (Proc_GetPipeFd(&My_Connections[i].proc_stat) == fd))
+                       return i;
+       }
+       return NONE;
+} /* Conn_GetFromProc */
+
 
 #ifdef SSL_SUPPORT