]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conn.c
Remove Proc_Kill(), use timeout to kill child processes
[ngircd-alex.git] / src / ngircd / conn.c
index 4df1e9e4f88e644b3df309f5bb1007c2aee44be3..58a3cbfd20d7159903776a3d6060258becbb4aae 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"
 
@@ -420,6 +419,23 @@ Conn_Exit( void )
 } /* Conn_Exit */
 
 
+/**
+ * Close all sockets (file descriptors) of open connections.
+ * This is useful in forked child processes, for example, to make sure that
+ * they don't hold connections open that the main process wants to close.
+ */
+GLOBAL void
+Conn_CloseAllSockets(void)
+{
+       CONN_ID idx;
+
+       for(idx = 0; idx < Pool_Size; idx++) {
+               if(My_Connections[idx].sock > NONE)
+                       close(My_Connections[idx].sock);
+       }
+}
+
+
 static unsigned int
 ports_initlisteners(array *a, const char *listen_addr, void (*func)(int,short))
 {
@@ -1075,10 +1091,6 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie
                    in_k, out_k);
        }
 
-       /* 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 );
 
@@ -1953,7 +1965,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;
 
@@ -2006,7 +2018,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
        }
 
        /* Read result from pipe */
-       len = Resolve_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1);
+       len = Proc_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1);
        if (len == 0)
                return;
 
@@ -2049,8 +2061,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 */
 
 
@@ -2101,6 +2111,22 @@ 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.