[BACK]Return to oxmain.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

Diff for /OpenXM/src/kxx/oxmain.c between version 1.3 and 1.14

version 1.3, 1999/11/04 02:12:31 version 1.14, 2003/11/20 07:18:41
Line 1 
Line 1 
 /*  $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.2 1999/10/30 02:24:27 takayama Exp $  */  /*  $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.13 2003/11/18 11:08:27 takayama Exp $  */
 /* nullserver01 */  /* nullserver01 */
 #include <stdio.h>  #include <stdio.h>
   #include <fcntl.h>
   #include <unistd.h>
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/socket.h>  #include <sys/socket.h>
 #include <sys/time.h>  #include <sys/time.h>
Line 8 
Line 10 
 #include <netdb.h>  #include <netdb.h>
 #include <signal.h>  #include <signal.h>
 #include <setjmp.h>  #include <setjmp.h>
   #include <stdlib.h>
 /* -lnsl -lsocket /usr/ucblib/libucb.a */  /* -lnsl -lsocket /usr/ucblib/libucb.a */
 #include "ox_kan.h"  #include "ox_kan.h"
 #include "serversm.h"  #include "serversm.h"
   
 #define SERVERNAME "/usr/local/OpenXM/bin/ox_sm1"  #define SERVERNAME "ox_sm1"
   
   extern char **environ;
 int OxCritical = 0;  int OxCritical = 0;
 int OxInterruptFlag = 0;  int OxInterruptFlag = 0;
   int OxTerminateMode = 0;
   
 int SerialCurrentControl;  int SerialCurrentControl;
   
 int MyServerPid;  int MyServerPid;
 char ServerName[1024];  #define SERVERNAME_SIZE 4096
   char ServerName[SERVERNAME_SIZE];
 int PacketMonitor = 0;  int PacketMonitor = 0;
 int Quiet = 0;  int Quiet = 0;
   
 int LocalMode = 1;  int LocalMode = 1;
 int NotifyPortnumber = 0;  int NotifyPortnumber = 0;
   int Do_not_use_control_stream_to_tell_no_server = 1;
   static void errorToStartEngine(void);
   static int findOxServer(char *server);
   static void couldNotFind(char *s);
   #if defined(__CYGWIN__)
   int errno;
   #endif
   /*  gcc -v -c hoge.c */
   
   
 main(int argc, char *argv[]) {  main(int argc, char *argv[]) {
   int fd;    int fd;
   int size;    int size;
Line 40  main(int argc, char *argv[]) {
Line 53  main(int argc, char *argv[]) {
   int reverse = 0;    int reverse = 0;
   extern int OpenedSocket;    extern int OpenedSocket;
   char portfile[1024];    char portfile[1024];
   char *pass;    char *pass = NULL;
     int result;
     int sleepingTime = 0;
     extern int OxTerminateMode;
   
   strcpy(sname,"localhost");    strcpy(sname,"localhost");
   strcpy(ServerName,SERVERNAME);    strcpy(ServerName,SERVERNAME);
   i = 1;    i = 1;
   if (argc == 1) {    if (argc == 1) {
     oxmainUsage();      oxmainUsage();
     exit();      exit(10);
   }    }
   while (i<argc) {    while (i<argc) {
     if (strcmp(argv[i],"-host") == 0) {      if (strcmp(argv[i],"-host") == 0) {
Line 68  main(int argc, char *argv[]) {
Line 84  main(int argc, char *argv[]) {
       LocalMode = 0;        LocalMode = 0;
     }else if (strcmp(argv[i],"-reverse") == 0) {      }else if (strcmp(argv[i],"-reverse") == 0) {
       reverse = 1;        reverse = 1;
       }else if (strcmp(argv[i],"-finish") == 0) {
         OxTerminateMode = 1;
     }else if (strcmp(argv[i],"-portfile") == 0) {      }else if (strcmp(argv[i],"-portfile") == 0) {
       i++;        i++;
       if (i<argc) {        if (i<argc) {
         sscanf(argv[i],"%s",portfile);          sscanf(argv[i],"%s",portfile);
         portControl = 0;          portControl = 0;
         portStream = 0;          portStream = 0;
         NotifyPortnumber = 1;          NotifyPortnumber = 1;
       }        }
     }else if (strcmp(argv[i],"-pass") == 0) {      }else if (strcmp(argv[i],"-pass") == 0) {
       i++;        i++;
       if (i<argc) {        if (i<argc) {
         pass = argv[i];          pass = argv[i];
       }        }
       }else if (strcmp(argv[i],"-wait") == 0) {
         i++;
         if (i<argc) {
           sscanf(argv[i],"%d",&sleepingTime);
         }
     }else {      }else {
       fprintf(stderr,"Unknown option %s.\n",argv[i]);        fprintf(stderr,"Unknown option %s.\n",argv[i]);
       oxmainUsage(); exit(10);        oxmainUsage(); exit(10);
Line 88  main(int argc, char *argv[]) {
Line 111  main(int argc, char *argv[]) {
     i++;      i++;
   }    }
   
     if (Do_not_use_control_stream_to_tell_no_server) {
       if (findOxServer(ServerName) < 0) {
         fprintf(stderr,"Sleeping five seconds...\n");
         sleep(5);
         exit(-1);
       }
     }
   
     if (sleepingTime) {
       fprintf(stderr,"Waiting to connect for %d seconds...\n",sleepingTime);
       sleep(sleepingTime);
       fprintf(stderr,"\nTrying to connect\n");
     }
   
   if (reverse) {    if (reverse) {
     /* The order is very important. */      /* The order is very important. */
     fdControl = socketConnectWithPass(sname,portControl,pass);      fdControl = socketConnectWithPass(sname,portControl,pass);
     fdStream = socketConnectWithPass(sname,portStream,pass);      fdStream = socketConnectWithPass(sname,portStream,pass);
   
     fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream);      fprintf(stderr,"Connected: control = %d, data = %d.\n",fdControl,fdStream);
       result = 0;
   
   
     if (portControl != -1) {      if (portControl != -1) {
       MyServerPid = fork();        MyServerPid = fork();
       if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream);        if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream);
       else childServerMain(fdControl,fdStream);        else result=childServerMain(fdControl,fdStream);
     }else{      }else{
       childServerMain(fdControl,fdStream);        result=childServerMain(fdControl,fdStream);
     }      }
     /* This line will be never executed. */      /* This line will be never executed in case of success */
       if (result < 0 ) {
         errorToStartEngine();
       }
   }    }
   
   /* non-reverse case. */    /* non-reverse case. */
Line 116  main(int argc, char *argv[]) {
Line 159  main(int argc, char *argv[]) {
       fdControl = socketOpen(sname,portControl);        fdControl = socketOpen(sname,portControl);
       portControl = OpenedSocket;        portControl = OpenedSocket;
       if (NotifyPortnumber) {        if (NotifyPortnumber) {
         oxWritePortFile(0,portControl,portfile);          oxWritePortFile(0,portControl,portfile);
       }        }
       fdControl = socketAcceptLocal(fdControl);        fdControl = socketAcceptLocal(fdControl);
       fprintf(stderr,"\n control port %d : Connected.\n",portControl);        fprintf(stderr,"\n control port %d : Connected.\n",portControl);
Line 125  main(int argc, char *argv[]) {
Line 168  main(int argc, char *argv[]) {
       fdStream = socketOpen(sname,portStream);        fdStream = socketOpen(sname,portStream);
       portStream = OpenedSocket;        portStream = OpenedSocket;
       if (NotifyPortnumber) {        if (NotifyPortnumber) {
         oxWritePortFile(1,portStream,portfile);          oxWritePortFile(1,portStream,portfile);
       }        }
       fdStream = socketAcceptLocal(fdStream);        fdStream = socketAcceptLocal(fdStream);
       fprintf(stderr,"\n stream port %d : Connected.\n",portStream);        fprintf(stderr,"\n stream port %d : Connected.\n",portStream);
Line 135  main(int argc, char *argv[]) {
Line 178  main(int argc, char *argv[]) {
       fdControl = socketOpen(sname,portControl);        fdControl = socketOpen(sname,portControl);
       portControl = OpenedSocket;        portControl = OpenedSocket;
       if (NotifyPortnumber) {        if (NotifyPortnumber) {
         oxWritePortFile(0,portControl,portfile);          oxWritePortFile(0,portControl,portfile);
       }        }
       fdControl = socketAccept(fdControl);        fdControl = socketAccept(fdControl);
       fprintf(stderr,"\n control port %d : Connected.\n",portControl);        fprintf(stderr,"\n control port %d : Connected.\n",portControl);
Line 144  main(int argc, char *argv[]) {
Line 187  main(int argc, char *argv[]) {
       fdStream = socketOpen(sname,portStream);        fdStream = socketOpen(sname,portStream);
       portStream = OpenedSocket;        portStream = OpenedSocket;
       if (NotifyPortnumber) {        if (NotifyPortnumber) {
         oxWritePortFile(1,portStream,portfile);          oxWritePortFile(1,portStream,portfile);
       }        }
       fdStream = socketAccept(fdStream);        fdStream = socketAccept(fdStream);
       fprintf(stderr,"\n stream port %d : Connected.\n",portStream);        fprintf(stderr,"\n stream port %d : Connected.\n",portStream);
Line 152  main(int argc, char *argv[]) {
Line 195  main(int argc, char *argv[]) {
   }    }
   
   
     result = 0;
   if (portControl != -1) {    if (portControl != -1) {
     MyServerPid = fork();      MyServerPid = fork();
     if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream);      if (MyServerPid > 0 ) parentServerMain(fdControl,fdStream);
     else childServerMain(fdControl,fdStream);      else result = childServerMain(fdControl,fdStream);
   }else{    }else{
     childServerMain(fdControl,fdStream);      result = childServerMain(fdControl,fdStream);
   }    }
     if (result < 0) errorToStartEngine();
   }
   
   static void errorToStartEngine(void) {
     fprintf(stderr,"Failed to start the engine. Childing process is terminating.\n");
     /* You have to tell to the control server that there is no engine.
        And, the control server must tell the client that there is no
        engine.
        This part has not yet been implemented.
        If you implement this, set Do_not_use_control_stream_to_tell_no_server to
        zero.
     */
     sleep(2);
     exit(-1);
 }  }
   
 oxmainUsage() {  oxmainUsage() {
   fprintf(stderr,"Usage: \n");    fprintf(stderr,"Usage: \n");
   fprintf(stderr,"  ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n");    fprintf(stderr,"  ox [-ox serverprogram -host name -data portnum -control portnum -monitor]\n");
   fprintf(stderr," [-insecure -portfile fname -reverse -pass xxxyyyzzz]");    fprintf(stderr," [-insecure -portfile fname -reverse -pass xxxyyyzzz]");
     fprintf(stderr," [-finish]");
   fprintf(stderr,"\n");    fprintf(stderr,"\n");
   fprintf(stderr,"-reverse: ox server connects to the client.\n");    fprintf(stderr,"-reverse: ox server connects to the client.\n");
   fprintf(stderr,"          The client must give a one time password to ox server to connect to the client with -pass option.\n");    fprintf(stderr,"          The client must give a one time password to ox server to connect to the client with -pass option.\n");
Line 176  oxmainUsage() {
Line 233  oxmainUsage() {
   fprintf(stderr,"          See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n");    fprintf(stderr,"          See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\n");
   fprintf(stderr,"-insecure : \n");    fprintf(stderr,"-insecure : \n");
   fprintf(stderr,"          If you access to the server from a localhost, you do not need one time password. However, if you access outside of the localhost, a one time password is required. To turn off this restriction, -insecure option is used.\n");    fprintf(stderr,"          If you access to the server from a localhost, you do not need one time password. However, if you access outside of the localhost, a one time password is required. To turn off this restriction, -insecure option is used.\n");
     fprintf(stderr,"\n");
     fprintf(stderr,"If ox fails to find the serverprogram, it tries to look for it in /usr/local/OpenXM/bin and $OpenXM_HOME/bin.\n");
     fprintf(stderr,"\n");
   fprintf(stderr,"Example 1:\n");    fprintf(stderr,"Example 1:\n");
   fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1200 -data 1300\n");    fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1200 -data 1300\n");
   fprintf(stderr,"(client):  sm1\n ");    fprintf(stderr,"(client):  sm1\n ");
Line 197  parentServerMain(int fdControl, int fdStream) {
Line 257  parentServerMain(int fdControl, int fdStream) {
   int r;    int r;
   int message = 1;    int message = 1;
   int controlByteOrder;    int controlByteOrder;
     extern OxTerminateMode;
   extern void myServerExit();    extern void myServerExit();
   
   controlByteOrder = oxTellMyByteOrder(fdControl);    if (OxTerminateMode) {
           /*
             OxTerminateMode cannot be used if you run ox by xterm -exec ox ...
            */
           if (fork()) {
             close(fdControl); close(fdStream);
             /* Parent */
             exit(0);  /*Tell the caller that launching is successfully finished.*/
           }
     }
   
     controlByteOrder = oxTellMyByteOrder(fdControl,fdControl);
   /* Set the network byte order. */    /* Set the network byte order. */
   fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder);    fprintf(stderr,"controlByteOrder=%x\n",controlByteOrder);
   
Line 225  parentServerMain(int fdControl, int fdStream) {
Line 296  parentServerMain(int fdControl, int fdStream) {
       r=kill(MyServerPid,SIGUSR1);        r=kill(MyServerPid,SIGUSR1);
       if (message) printf("Result = %d\n",r);        if (message) printf("Result = %d\n",r);
       fflush(NULL);        fflush(NULL);
       oxSendResultOfControlInt32(fdControl,0);        /*      oxSendResultOfControlInt32(fdControl,0); */
       break;        break;
     default:      default:
       fprintf(stderr,"[control] Unknown control message.\n");        fprintf(stderr,"[control] Unknown control message.\n");
Line 239  parentServerMain(int fdControl, int fdStream) {
Line 310  parentServerMain(int fdControl, int fdStream) {
 void myServerExit() {  void myServerExit() {
   printf("Sending the kill signal to the child.\n");    printf("Sending the kill signal to the child.\n");
   kill(MyServerPid,SIGKILL);    kill(MyServerPid,SIGKILL);
   exit();    exit(0);
 }  }
   
 childServerMain(int fdControl, int fdStream) {  childServerMain(int fdControl, int fdStream) {
Line 247  childServerMain(int fdControl, int fdStream) {
Line 318  childServerMain(int fdControl, int fdStream) {
   close(fdControl);   /* close(0); dup(fdStream); */    close(fdControl);   /* close(0); dup(fdStream); */
   dup2(fdStream,3);    dup2(fdStream,3);
   dup2(fdStream,4);    dup2(fdStream,4);
 /*close(0);    /*close(0);
   #include <sys/param.h>      #include <sys/param.h>
   for (i=5; i<NOFILE; i++) close(i);      for (i=5; i<NOFILE; i++) close(i);
 */    */
     if (!Do_not_use_control_stream_to_tell_no_server) {
       if (findOxServer(ServerName) < 0) {
         return(-1);
       }
     }
     fprintf(stderr,"childServerMain: Starting the server %s\n",ServerName); fflush(NULL);
   
     /*
     {
           int i;
           i=0;
           while (environ[i] != NULL) {
             fprintf(stderr,"%s ",environ[i++]);
           }
           fprintf(stderr,"\n");
     }
     */
     /* bug: xterm of potato does not seem to pass the LD_LIBRARY_PATH.
         So, the new gc does not work.
        it is an workaround for OpenXM */
     if (getenv("LD_LIBRARY_PATH") == (char *)NULL) {
           char *s,*o;
       fprintf(stderr,"Hmm... LD_LIBRARY_PATH does not seem to be set.\n");
       o = getenv("OpenXM_HOME");
           if (o == NULL) {
             fprintf(stderr,"Giving up to set the LD_LIBRARY_PATH variable.\n");
           }else{
             s = (char *)malloc(strlen(o)+64);
             sprintf(s,"LD_LIBRARY_PATH=%s/lib",o);
             putenv(s);
           }
     }
   
   if (PacketMonitor) {    if (PacketMonitor) {
     if (execl(ServerName,ServerName,"-monitor",NULL)) {      if (execle(ServerName,ServerName,"-monitor",NULL,environ)) {
       fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName);        fprintf(stderr,"%s cannot be executed with -monitor.\n",ServerName);
         fflush(NULL);
         return(-1);
     }      }
   }else {    }else {
     if (execl(ServerName,ServerName,NULL)) {      if (execle(ServerName,ServerName,NULL,environ)) {
       fprintf(stderr,"%s cannot be executed.\n",ServerName);        fprintf(stderr,"%s cannot be executed.\n",ServerName);
         fflush(NULL);
         return(-1);
     }      }
   }    }
     /* never reached. */
 }  }
   
   
Line 267  childServerMain(int fdControl, int fdStream) {
Line 376  childServerMain(int fdControl, int fdStream) {
 unlockCtrlCForOx() { ; }  unlockCtrlCForOx() { ; }
 restoreLockCtrlCForOx() { ; }  restoreLockCtrlCForOx() { ; }
   
   static int findOxServer(char *server) {
     char *p;
     char *p2;
     if (strlen(server) == 0) return(-1);
     /* fd = open(server,O_RDONLY); */
     if (access(server,X_OK&R_OK) == 0) {
       fprintf(stderr,"Starting OX server : %s\n",server);
       return(0);
     }
     if (server[0] == '/') {
       couldNotFind(server);
       return(-1);
     }
     fprintf(stderr,"The server %s was not found. Trying to find it under OpenXM/bin\n",server);
     p = getenv("OpenXM_HOME");
     if (p == NULL) {
       p = "/usr/local/OpenXM";
     }
     p2 = (char *) malloc(sizeof(char)*(strlen(p)+strlen("/bin/")+3+strlen(server)));
     if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); }
     strcpy(p2,p); strcat(p2,"/bin/"); strcat(p2,server);
     /* fd = open(p2,O_RDONLY); */
     if (access(p2,X_OK&R_OK) == 0) {
       fprintf(stderr,"Starting OX server : %s\n",p2);
       if (strlen(p2) < SERVERNAME_SIZE) strcpy(server,p2);
       else {
         couldNotFind("Too long ox server name.");
         return(-1);
       }
       return(0);
     }
     couldNotFind(p2);
     return(-1);
   }
   
   static void couldNotFind(char *s) {
     fprintf(stderr,"OX server %s could not be found.\n",s);
   }
   
   
   

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.14

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>