[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.1.1.1 and 1.6

version 1.1.1.1, 1999/10/08 02:12:13 version 1.6, 2000/12/05 05:58:33
Line 1 
Line 1 
   /*  $OpenXM: OpenXM/src/kxx/oxmain.c,v 1.5 2000/07/30 09:55:40 takayama Exp $  */
 /* nullserver01 */  /* nullserver01 */
 #include <stdio.h>  #include <stdio.h>
   #include <fcntl.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 11 
Line 13 
 #include "ox_kan.h"  #include "ox_kan.h"
 #include "serversm.h"  #include "serversm.h"
   
 #define SERVERNAME "/home/nobuki/kxx/ox_sm1"  #define SERVERNAME "ox_sm1"
 /*  
 #define SERVERNAME "/home/nobuki/kxx/stdserver00"  
 #define SERVERNAME "/home/ftp/pub/OHP/ox_asir"  
 */  
   
 int OxCritical = 0;  int OxCritical = 0;
 int OxInterruptFlag = 0;  int OxInterruptFlag = 0;
Line 23  int OxInterruptFlag = 0;
Line 21  int OxInterruptFlag = 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);
   
   
 main(int argc, char *argv[]) {  main(int argc, char *argv[]) {
Line 44  main(int argc, char *argv[]) {
Line 47  main(int argc, char *argv[]) {
   extern int OpenedSocket;    extern int OpenedSocket;
   char portfile[1024];    char portfile[1024];
   char *pass;    char *pass;
     int result;
   
   strcpy(sname,"localhost");    strcpy(sname,"localhost");
   strcpy(ServerName,SERVERNAME);    strcpy(ServerName,SERVERNAME);
   i = 1;    i = 1;
     if (argc == 1) {
       oxmainUsage();
       exit();
     }
   while (i<argc) {    while (i<argc) {
     if (strcmp(argv[i],"-host") == 0) {      if (strcmp(argv[i],"-host") == 0) {
       i++;        i++;
Line 70  main(int argc, char *argv[]) {
Line 78  main(int argc, char *argv[]) {
     }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 {      }else {
       fprintf(stderr,"Unknown option %s.\n",argv[i]);        fprintf(stderr,"Unknown option %s.\n",argv[i]);
Line 87  main(int argc, char *argv[]) {
Line 95  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 (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 115  main(int argc, char *argv[]) {
Line 137  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 124  main(int argc, char *argv[]) {
Line 146  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 134  main(int argc, char *argv[]) {
Line 156  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 143  main(int argc, char *argv[]) {
Line 165  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 151  main(int argc, char *argv[]) {
Line 173  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() {
Line 167  oxmainUsage() {
Line 202  oxmainUsage() {
   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,"\n");    fprintf(stderr,"\n");
   fprintf(stderr,"Example 1: dc1% ./ox -ox ox_sm1 -host dc1.math.kobe-u.ac.jp -insecure -control 1300 -data 1200\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 one time password can be seen by ps command, so you must not use this one time password system on an untrustful host.\n");
     fprintf(stderr,"          The one time password should be sent by a safe communication line like ssh and the ox server should be started by ssh. Do not use rsh\n");
     fprintf(stderr,"          If -reverse is not given, the client connect to the ox server\n");
     fprintf(stderr,"          See OpenXM/src/SSkan/Doc/ox.sm1, /sm1connectr\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,"\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,"(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,"           (ox.sm1) run ; \n");
   fprintf(stderr,"           sm1>[(dc1.math.kobe-u.ac.jp) 1300 1200] oxconnect /ox.ccc set\n");    fprintf(stderr,"           sm1>[(dc1.math.kobe-u.ac.jp) 1300 1200] oxconnect /ox.ccc set\n");
     fprintf(stderr,"Example 2:\n");
     fprintf(stderr,"(Start the ox server): dc1%% ox -ox ~/OpenXM/bin/ox_sm1\n");
     fprintf(stderr,"(client): dc1%% sm1\n ");
     fprintf(stderr,"           (ox.sm1) run ; \n");
     fprintf(stderr,"           sm1>[(localhost) 1300 1200] oxconnect /ox.ccc set\n");
   fprintf(stderr,"\n");    fprintf(stderr,"\n");
 }  }
   
Line 208  parentServerMain(int fdControl, int fdStream) {
Line 262  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 230  childServerMain(int fdControl, int fdStream) {
Line 284  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);
   if (PacketMonitor) {    if (PacketMonitor) {
     if (execl(ServerName,ServerName,"-monitor",NULL)) {      if (execl(ServerName,ServerName,"-monitor",NULL)) {
       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 (execl(ServerName,ServerName,NULL)) {
       fprintf(stderr,"%s cannot be executed.\n",ServerName);        fprintf(stderr,"%s cannot be executed.\n",ServerName);
             fflush(NULL);
             return(-1);
     }      }
   }    }
     /* never reached. */
 }  }
   
   
Line 250  childServerMain(int fdControl, int fdStream) {
Line 315  childServerMain(int fdControl, int fdStream) {
 unlockCtrlCForOx() { ; }  unlockCtrlCForOx() { ; }
 restoreLockCtrlCForOx() { ; }  restoreLockCtrlCForOx() { ; }
   
   static int findOxServer(char *server) {
     char *p;
     char *p2;
     int fd;
     char *getenv(char *s);
     if (strlen(server) == 0) return(-1);
     fd = open(server,O_RDONLY);
     if (fd >= 0) {
           fprintf(stderr,"Starting OX server : %s\n",server);
           close(fd);
           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 (fd >= 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);
           }
           close(fd);
           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.1.1.1  
changed lines
  Added in v.1.6

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