]> andersk Git - moira.git/blobdiff - gdb/gdb_fserv.c
set keep alives if requested
[moira.git] / gdb / gdb_fserv.c
index 33986ecc4702bfdd0f3e1bec1a53c537ddd41863..c1089c024e057e8e25b48c9e2d171193293c1ce0 100644 (file)
@@ -1,5 +1,4 @@
 /*
- *     $Source$
  *     $Header$
  */
 
@@ -9,36 +8,18 @@ static char *rcsid_gdb_fserv_c = "$Header$";
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/************************************************************************/
-/*     
-/*                        gdb_fserv.c
-/*     
-/*           GDB - Routines to implement forking servers.
-/*     
-/*     Author: Noah Mendelsohn
-/*     Copyright: 1986 MIT Project Athena 
-/*             For copying and distribution information, please see
-/*             the file <mit-copyright.h>.
-/*     
-/************************************************************************/
+/************************************************************************
+ *     
+ *                        gdb_fserv.c
+ *     
+ *           GDB - Routines to implement forking servers.
+ *     
+ *     Author: Noah Mendelsohn
+ *     Copyright: 1986 MIT Project Athena 
+ *             For copying and distribution information, please see
+ *             the file <mit-copyright.h>.
+ *     
+ ************************************************************************/
 
 #include <mit-copyright.h>
 #include <stdio.h>
@@ -50,45 +31,45 @@ static char *rcsid_gdb_fserv_c = "$Header$";
 #include "gdb.h"
 #include <sys/resource.h>
 \f
-/************************************************************************/
-/*     
-/*                     create_forking_server (create_forking_server)
-/*     
-/*     Called by an application to turn itself into a forking model
-/*     server.  Returns from this routine occur only in the forked
-/*     children.  The parent lives in this routine forever, waiting
-/*     for incoming connection requests and doing the appropriate
-/*     forking.
-/*     
-/*     Children are expected to do their own cleanup, but this routine
-/*     does do the work of reaping the resulting zombie processes.
-/*     
-/*     ARGUMENTS:
-/*     ----------
-/*     
-/*             service-id      identifies the port to be used for
-/*                             listening.  Same rules as for
-/*                             create_listening_connection.
-/*     
-/*             validate-rtn    pointer to a function to be called to
-/*                             validate the incoming client.  Should
-/*                             return TRUE if client is acceptable,
-/*                             else false.  If this is NULL, all clients
-/*                             are accepted.
-/*     
-/*     GLOBAL VARIABLES
-/*     ----------------
-/*     
-/*     Children created by this routine inherit the global variables
-/*     gdb_sockaddr_of_client, which is of type sockaddr_in and 
-/*     gdb_socklen, which is the returned length of the sockaddr.
-/*     These are the Berkeley identifiers of the clients as accepted.
-/*     Use of this interface is non-portable to other than Berkeley 
-/*     systems.
-/*     
-/*     The client's request tuple may be found in gdb_client_tuple.
-/*     
-/************************************************************************/
+/************************************************************************
+ *     
+ *                     create_forking_server (create_forking_server)
+ *     
+ *     Called by an application to turn itself into a forking model
+ *     server.  Returns from this routine occur only in the forked
+ *     children.  The parent lives in this routine forever, waiting
+ *     for incoming connection requests and doing the appropriate
+ *     forking.
+ *     
+ *     Children are expected to do their own cleanup, but this routine
+ *     does do the work of reaping the resulting zombie processes.
+ *     
+ *     ARGUMENTS:
+ *     ----------
+ *     
+ *             service-id      identifies the port to be used for
+ *                             listening.  Same rules as for
+ *                             create_listening_connection.
+ *     
+ *             validate-rtn    pointer to a function to be called to
+ *                             validate the incoming client.  Should
+ *                             return TRUE if client is acceptable,
+ *                             else false.  If this is NULL, all clients
+ *                             are accepted.
+ *     
+ *     GLOBAL VARIABLES
+ *     ----------------
+ *     
+ *     Children created by this routine inherit the global variables
+ *     gdb_sockaddr_of_client, which is of type sockaddr_in and 
+ *     gdb_socklen, which is the returned length of the sockaddr.
+ *     These are the Berkeley identifiers of the clients as accepted.
+ *     Use of this interface is non-portable to other than Berkeley 
+ *     systems.
+ *     
+ *     The client's request tuple may be found in gdb_client_tuple.
+ *     
+ ************************************************************************/
 
 
 CONNECTION
@@ -96,7 +77,7 @@ create_forking_server(service, validate)
 char *service;
 int (*validate)();
 {
-
+       void start_accepting_client();
        CONNECTION incoming;                    /* listen for incoming */
                                                /* children here */
        CONNECTION client = NULL;               /* connection to client */
@@ -115,7 +96,7 @@ int (*validate)();
        g_do_signals();                         /* set up signal handling */
 
        incoming = create_listening_connection(service);
-       if (incoming == NULL)
+       if (incoming == NULL || connection_status(incoming) != CON_UP)
                GDB_GIVEUP("create_forking_server: can't create listening connection")
 
        /*----------------------------------------------------------*/
@@ -132,8 +113,12 @@ int (*validate)();
                                       gdb_sockaddr_of_client, &gdb_socklen,
                                       &gdb_client_tuple);
                if(complete_operation(listenop) != OP_COMPLETE ||
-                  client == NULL) 
-                       GDB_GIVEUP("create_forking_server: failed to accept client")
+                  client == NULL) {
+                   gdb_perror("GDB create_forking_server: failed to accept client");
+                   reset_operation(listenop);
+                   (void) sever_connection(client);
+                   continue;
+                 }
                
 
                 /*
@@ -180,7 +165,11 @@ int (*validate)();
 /*     Called on SIGCHILD to reap all dead children.
 /*     
 /************************************************************************/
+#ifndef sun
 int
+#else
+void
+#endif
 gdb_reaper()
 {
        union wait status;
@@ -213,5 +202,14 @@ gdb_reaper()
 int
 g_do_signals()
 {
-       (void) signal(SIGCHLD, gdb_reaper);
+#ifdef sun
+    struct sigvec act;
+
+    act.sv_handler = gdb_reaper;
+    act.sv_mask = 0;
+    act.sv_flags = 0;
+    (void) sigvec(SIGCHLD, &act, NULL);
+#else /* sun */
+    (void) signal(SIGCHLD, gdb_reaper);
+#endif 
 }
This page took 0.04361 seconds and 4 git commands to generate.