]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Improving unisoc.c (soc_getcontact)
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sun, 14 Jul 2024 15:35:35 +0000 (11:35 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sun, 14 Jul 2024 15:35:35 +0000 (11:35 -0400)
lib/gestcp.c
lib/modrec.c
lib/unisoc.c
lib/unisoc.h

index 67db061b45c473b6306cda129e1e2b91d131873b..9db35fec2c41ff01664bee52f749613eaa662e7e 100644 (file)
@@ -25,10 +25,32 @@ static  _Bool modopen;          //boolean module open/close
 PUBLIC CONTYP *tcp_getcontact(SOCTYP *binding)
 
 {
+#define OPEP    "gestcp.c:tcp_getcontact"
+
 CONTYP *contact;
+int phase;
+_Bool proceed;
 
 contact=(CONTYP *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase){
+    case 0      :       //check for binding
+      if (binding==(SOCTYP *)0) {
+        (void) rou_alert(0,"%s binding pointer is NULL (Bug!?)",OPEP);
+        phase=999;      //not going further
+        }
+      break;
+    case 1      :       //waiting from contact
+      break;
+    default     :       //SAFE guard
+      break;
+    }
+  phase++;
+  }
 return contact;
+#undef  OPEP
 }
 /*
 ^L
index e691a829171c5984c95973a6dc8063582917e7e0..1b3c535dd8d334b8d20463f30c8774329a0bcfde 100644 (file)
@@ -140,7 +140,7 @@ proceed=true;
 while (proceed==true) {
   switch (phase) {
     case 0      :       //making sur the list is defined
-       if (bindings==(SOCTYP **)0) {
+      if (bindings==(SOCTYP **)0) {
         (void) rou_alert(0,"%s bindings list pointer is NULL (Bug!?)",OPEP);
         phase=999;      //not going further
         }
index c9affa2cda48dae5da57d2682fe53b3d5134f331..4b5c6fb05531f6f8c236def3fed808e482f2cf21 100644 (file)
@@ -33,6 +33,52 @@ static  _Bool modopen;        //module open/close status
 */
 /********************************************************/
 /*                                                      */
+/*     Procedure to get the handle related to a remote */
+/*     contact.                                        */
+/*                                                      */
+/********************************************************/
+static int getcontact(SOCTYP *binding)
+
+{
+#define OPEP    "unisoc.c:getcontac"
+int contact;
+socklen_t taille;
+struct sockaddr addr;
+
+contact=-1;
+taille=sizeof(addr);
+if ((contact=accept(binding->handle,&addr,&taille))<0) {
+  switch (errno)  {
+    case EAGAIN         :
+      /*well process not quick enough the handle was already    */
+      /*accepted by another clement???.                         */
+      break;
+    case EINVAL         :       /*no socket avail anymore       */
+      break;
+    default             :
+      (void) rou_alert(0,"%s Unexpected error on IP/PORT <%s/%s> errno=<%s>",
+                         OPEP,binding->ip,binding->port,strerror(errno));
+      break;
+    }
+  }
+else {
+  int flags;
+
+  if ((flags=fcntl(contact,F_GETFL,0))<0)
+    (void) rou_core_dump("%s Unable to get socket descripteur (error='%s')",
+                         OPEP,strerror(errno));
+   if ((flags=fcntl(contact,F_SETFL,flags|O_NONBLOCK|O_ASYNC))<0)
+     (void) rou_core_dump("%s Unable to set socket descripteur (error='%s')",
+                          OPEP,strerror(errno));
+  }
+return contact;
+#undef  OPEP
+}
+/*
+\f
+*/
+/********************************************************/
+/*                                                      */
 /*     Procedure to free memory used by a              */
 /*     binding info.                                   */
 /*                                                     */
@@ -426,6 +472,80 @@ while (proceed==true) {
 ^L
 */
 /********************************************************/
+/*                                                     */
+/*      Procedure to wait for an incoming connecion     */
+/*      from a remote client.                           */
+/*      return a socket handle or -1 if trouble.        */
+/*                                                     */
+/********************************************************/
+PUBLIC int soc_listen(SOCTYP *binding)
+
+{
+#define OPEP    "unisoc.c:soc_listen"
+
+int contact;
+int phase;
+_Bool proceed;
+
+contact=-2;
+phase=0;
+proceed=true;
+while (proceed==true) {
+  switch (phase) {
+    case 0      :       //checking if the point is ready; 
+      if (binding==(SOCTYP *)0) {
+        (void) rou_alert(0,"%s binding pointer is NULL (Bug!?)",OPEP);
+        phase=999;      //not going further
+        }
+      break;
+    case 1      :       //checking if the handle is properly set
+      if (binding->handle<0) {
+        (void) rou_alert(0,"%s trouble with handle (handle value ='%d', Bug!?)",
+                            OPEP,binding->handle);
+        phase=999;      //not going further
+        }
+      break;
+    case 2      :       //listening on the handle
+      fd_set reading;
+      struct timeval relax;
+      FD_ZERO(&reading);
+      FD_SET(binding->handle,&reading);
+      relax.tv_sec=1;   //1 sec relax time
+      relax.tv_usec=0;
+      switch (select(binding->handle+1,&reading,(fd_set *)0,(fd_set *)0,&relax)) {
+        case     -1     :     //got a wrong return
+          switch (errno) {
+            case EINTR  :       //Received a signal, get out! fast!
+              phase=999;
+              break;
+            default     :       //Unexpected error?
+              (void) rou_core_dump("%, Unexpected select status (error=<%s>)",
+                                    OPEP,strerror(errno));
+              break;            //never reached
+            }
+          break;
+        case      0     :       //normal time out.
+          phase--;              //lets continue to wait for incoming
+          break;
+        default         :       //we got a contact
+          if ((contact=getcontact(binding))<0) 
+            phase--;            //not quick enough, lets continue to wait
+          break;
+        }
+      break;
+    default     :       //SAFE Guard
+      proceed=false;
+      break;
+    }
+  phase++;
+  }
+return contact;
+#undef  OPEP
+}
+/*
+^L
+*/
+/********************************************************/
 /*                                                      */
 /*     Procedure to "open/close" module and do         */
 /*      homework purpose                                */
index bb4213585158aa7e27629d9ff8b455699f49993b..4f228fc6a2e66c7287266f4fd92dc5e3d75aa082 100644 (file)
@@ -51,6 +51,9 @@ extern int soc_mullisten(SOCTYP **bindings);
 //procedure to close all sockets
 extern void soc_mulclose(SOCTYP **bindings);
 
+//procedure to wait for a connection from a remote client
+extern int soc_listen(SOCTYP *binding);
+
 //homework to be done before starting/stopping module.
 extern int soc_modeunisoc(_Bool mode);