/* */
/********************************************************/
#include <sys/wait.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <unistd.h>
#include "subrou.h"
+#include "unisig.h"
+#include "uniprc.h"
#include "gestcp.h"
static _Bool modopen; //boolean module open/close
/*
+\f
+*/
+/********************************************************/
+/* */
+/* Procedure to get the handle related to a remote */
+/* contact. */
+/* */
+/********************************************************/
+static int getcontact(SOCTYP *binding)
+
+{
+#define OPEP "gestcp.c:getcontact"
+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
+}
+/*
+^L
+*/
+/********************************************************/
+/* */
+/* Procedure to wait for an incoming connection */
+/* from a remote client. */
+/* return a socket handle or -1 if trouble. */
+/* */
+/********************************************************/
+static int waitlisten(SOCTYP *binding)
+
+{
+#define OPEP "gesttcp.c:waitlisten"
+
+int contact;
+int phase;
+_Bool proceed;
+
+contact=-1;
+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
+ if (prc_checkprocess(getppid())==false) {
+ (void) rou_alert(0,"%s parent process missing (daemon restart?)",
+ OPEP);
+ phase=999; //exiting
+ }
+ if ((hangup==true)||(reload==true))
+ phase=999; //exiting
+ 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
*/
/********************************************************/
int phase;
_Bool proceed;
-contact=(CONTYP *)0;
+contact=calloc(1,sizeof(CONTYP));
+contact->binding=binding;
phase=0;
proceed=true;
while (proceed==true) {
}
break;
case 1 : //waiting from contact
+ if ((contact->channel=waitlisten(binding))<0) {
+ (void) rou_alert(0,"%s Unable to open contact",OPEP);
+ (void) free(contact);
+ contact=(CONTYP *)0;
+ phase=999; //no contact
+ }
+ break;
+ case 2 : //check is contactis ok
+ (void) dprintf(contact->channel,"JMPDBG Bingo!\n");
break;
default : //SAFE guard
break;
case true :
(void) rou_modesubrou(mode);
(void) soc_modeunisoc(mode);
+ (void) sig_modeunisig(mode);
+ (void) prc_modeuniprc(mode);
break;
case false :
+ (void) sig_modeunisig(mode);
+ (void) prc_modeuniprc(mode);
(void) soc_modeunisoc(mode);
(void) rou_modesubrou(mode);
break;
*/
/********************************************************/
/* */
-/* 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. */
/* */
^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 */