[BACK]Return to oxmisc.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / plugin

Diff for /OpenXM/src/kan96xx/plugin/oxmisc.c between version 1.9 and 1.30

version 1.9, 2001/05/04 01:06:30 version 1.30, 2016/03/31 03:22:55
Line 1 
Line 1 
 /*  $OpenXM: OpenXM/src/kan96xx/plugin/oxmisc.c,v 1.8 2000/12/03 07:29:39 takayama Exp $ */  /*  $OpenXM: OpenXM/src/kan96xx/plugin/oxmisc.c,v 1.29 2015/10/08 11:49:37 takayama Exp $ */
 #include <stdio.h>  #include <stdio.h>
   #include <string.h>
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/stat.h>  #include <sys/stat.h>
 #include <sys/socket.h>  #include <sys/socket.h>
Line 11 
Line 12 
 #include <unistd.h>  #include <unistd.h>
 #include <signal.h>  #include <signal.h>
 #include <setjmp.h>  #include <setjmp.h>
   #include <errno.h>
 #define SET_MYERROROUT { if (MyErrorOut == NULL) MyErrorOut=stdout; }  #define SET_MYERROROUT { if (MyErrorOut == NULL) MyErrorOut=stdout; }
 /* It is also defined in oxmisc2.c */  /* It is also defined in oxmisc2.c */
 FILE *MyErrorOut = NULL;  FILE *MyErrorOut = NULL;
Line 21  FILE *MyErrorOut = NULL;
Line 23  FILE *MyErrorOut = NULL;
 #include "../Kan/extern.h"  #include "../Kan/extern.h"
   
 #include "ox_kan.h"  #include "ox_kan.h"
   #include "mysig.h"
   
   
 #define READBUFSIZE 5000  #define READBUFSIZE 5000
   
 int OxVersion = 200012030;  int OxVersion = 200012030;
Line 177  int oxWaitSyncBall(ox_stream ostream)
Line 181  int oxWaitSyncBall(ox_stream ostream)
     fprintf(stderr,"Looking for the next message tag. mtag=%d\n",mtag);      fprintf(stderr,"Looking for the next message tag. mtag=%d\n",mtag);
     /* or stdout */      /* or stdout */
     fflush(NULL);      fflush(NULL);
           if (mtag == -1) {
             fprintf(stderr,"Your peer seems to be dead.\n"); return 0;
           }
   }    }
 }  }
   
Line 343  void oxSendResultOfControl(int fd) 
Line 350  void oxSendResultOfControl(int fd) 
 void oxSendMathCap(ox_stream os,struct mathCap *mathcap)  void oxSendMathCap(ox_stream os,struct mathCap *mathcap)
 {  {
   int i,n,infosize,ncmo;    int i,n,infosize,ncmo;
   struct object mathinfo;    struct object mathinfo = OINIT;
   /* printf("ox sending mathcap\n"); fflush(stdout); */    /* printf("ox sending mathcap\n"); fflush(stdout); */
   mathinfo = *((struct object *)(mathcap->infop));    mathinfo = *((struct object *)(mathcap->infop));
   infosize = getoaSize(mathinfo);    infosize = getoaSize(mathinfo);
Line 444  void oxReqExecuteFunction(ox_stream os,char *s)
Line 451  void oxReqExecuteFunction(ox_stream os,char *s)
   fp2fflush(os);    fp2fflush(os);
 }  }
   
   void oxReqExecuteFunctionWithOptionalArgument(ox_stream os,char *s)
   {
     oxSendOXheader(os,OX_DATA,SerialOX++);
     oxSendCmoString(os,s);
     oxSendOXheader(os,OX_COMMAND,SerialOX++);
     oxSendInt32(os,SM_executeFunctionWithOptionalArgument);
     fp2fflush(os);
   }
   
   
 void oxReqPopString(ox_stream os)  void oxReqPopString(ox_stream os)
 {  {
   oxSendOXheader(os,OX_COMMAND,SerialOX++);    oxSendOXheader(os,OX_COMMAND,SerialOX++);
Line 500  int oxclientMultiSelect(oxclientp clients[],int datare
Line 516  int oxclientMultiSelect(oxclientp clients[],int datare
   int humanfd = 0;    int humanfd = 0;
   fd_set readfds;    fd_set readfds;
   struct timeval timeout;    struct timeval timeout;
   extern int errno;  
   
   SET_MYERROROUT;    SET_MYERROROUT;
   /** printf("(1)"); fflush(NULL); */    /** printf("(1)"); fflush(NULL); */
Line 598  int oxInitClient(oxclientp client)
Line 613  int oxInitClient(oxclientp client)
   client->mathcapObjp = NULL;    client->mathcapObjp = NULL;
   client->controlByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;    client->controlByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;
   client->engineByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;    client->engineByteOrder = OX_BYTE_NETWORK_BYTE_ORDER;
     client->engineID = -1;
   return(0);    return(0);
 }  }
   
Line 608  int oxIsThereErrorClient(oxclientp client) {
Line 624  int oxIsThereErrorClient(oxclientp client) {
   return(0);    return(0);
 }  }
   
 oxclientp oxCreateClient(char *sname,int portStream,int portControl)  oxclientp oxCreateClient(char *sname,int portStream,int portControl,
                            char *passControl, char *passData)
      /* you also need to change oxCreateClient2. */       /* you also need to change oxCreateClient2. */
 {  {
   static int clnum = 0;  
   int v = 0;    int v = 0;
   int fdControl = -1;    int fdControl = -1;
   int fdStream = -1;    int fdStream = -1;
Line 633  oxclientp oxCreateClient(char *sname,int portStream,in
Line 649  oxclientp oxCreateClient(char *sname,int portStream,in
     return(NULL);      return(NULL);
   }    }
   
     if (passControl != NULL) {
       if (v) fprintf(stderr,"Sending password %s for the control channel.\n",
                      passControl);
       if (write(fdControl,passControl,strlen(passControl)+1) < 0) {
         fprintf(stderr,"oxCreateClient(): failed to send passControl.\n");
         return(NULL);
       }
     }
     if (passData != NULL) {
       if (v) fprintf(stderr,"Sending password %s for the data channel.\n",
                      passData);
       if (write(fdStream,passData,strlen(passData)+1) < 0) {
         fprintf(stderr,"oxCreateClient(): failed to send passData.\n");
         return(NULL);
       }
     }
   
   controlByteOrder = oxSetByteOrder(fdControl);    controlByteOrder = oxSetByteOrder(fdControl);
   if (v) fprintf(stderr,"Byte order for control process is %s.\n",    if (v) fprintf(stderr,"Byte order for control process is %s.\n",
                  (controlByteOrder == 0? "network byte order":                   (controlByteOrder == 0? "network byte order":
Line 654  oxclientp oxCreateClient(char *sname,int portStream,in
Line 687  oxclientp oxCreateClient(char *sname,int portStream,in
   client->dataport = portStream;    client->dataport = portStream;
   client->controlport = portControl;    client->controlport = portControl;
   client->controlfd = fdControl;    client->controlfd = fdControl;
   client->id = clnum; clnum++;    client->id = oxGetClientID();
   client->type = CLIENT_SOCKET; /* socket */    client->type = CLIENT_SOCKET; /* socket */
   client->engineByteOrder = engineByteOrder;    client->engineByteOrder = engineByteOrder;
   client->controlByteOrder = controlByteOrder;    client->controlByteOrder = controlByteOrder;
Line 869  char *oxGenPass(void) {
Line 902  char *oxGenPass(void) {
   static int seed = 0;    static int seed = 0;
   long p;    long p;
   char *s;    char *s;
   int i;    int i,n;
   if (seed == 0) {    if (seed == 0) {
     seed = (int) time(NULL) + (int) &p;      seed = (int) time(NULL) + (int) &p;
     srandom((unsigned int) seed);      srandom((unsigned int) seed);
   }    }
   for (i=0; i < ((int) &p) % 100 ; i++) random();  
   p = random();  
   s = (char *)malloc(128*sizeof(char));    s = (char *)malloc(128*sizeof(char));
     if (s == NULL) { fprintf(stderr,"No more memory.\n"); return(s); }
     n = (((int) s) + (int) time(NULL)) % 100;
     for (i=0; i < n ; i++) random();
     p = random();
   sprintf(s,"%ld",p);    sprintf(s,"%ld",p);
   return(s);    return(s);
 }  }
   
   
 static void cancelConnection() {  static void cancelConnection() {
   #if defined(__CYGWIN__)
     extern sigjmp_buf MyEnv_oxmisc;
   #else
   extern jmp_buf MyEnv_oxmisc;    extern jmp_buf MyEnv_oxmisc;
   signal(SIGALRM,SIG_IGN);  #endif
     mysignal(SIGALRM,SIG_IGN);
   fprintf(stderr,"Time out in TCP/IP connection.\n");    fprintf(stderr,"Time out in TCP/IP connection.\n");
   longjmp(MyEnv_oxmisc,1);  #if defined(__CYGWIN__)
     MYSIGLONGJMP(MyEnv_oxmisc,1);
   #else
     MYLONGJMP(MyEnv_oxmisc,1);
   #endif
 }  }
   
 oxclientp oxCreateClient2(int fdstream,int portStream,  oxclientp oxCreateClient2(int fdstream,int portStream,
                           int fdcontrol,int portControl,int ipmask,char *pass)                            int fdcontrol,int portControl,int ipmask,
                             char *passControl, char *passData)
 {  {
   static int clnum = 0;  
   int v = 0;    int v = 0;
   int fdControl = -1;    int fdControl = -1;
   int fdStream = -1;    int fdStream = -1;
Line 900  oxclientp oxCreateClient2(int fdstream,int portStream,
Line 943  oxclientp oxCreateClient2(int fdstream,int portStream,
   
   char *s;    char *s;
   oxclientp client;    oxclientp client;
   extern jmp_buf MyEnv_oxmisc ;  #if defined(__CYGWIN__)
     extern sigjmp_buf MyEnv_oxmisc;
   #else
     extern jmp_buf MyEnv_oxmisc;
   #endif
   int controlByteOrder, engineByteOrder;    int controlByteOrder, engineByteOrder;
   
   v = !Quiet;    v = !Quiet;
   if (setjmp(MyEnv_oxmisc)) {  #if defined(__CYGWIN__)
     if (MYSIGSETJMP(MyEnv_oxmisc,1)) {
   #else
     if (MYSETJMP(MyEnv_oxmisc)) {
   #endif
     return(NULL);      return(NULL);
   }else{    }else{
   }    }
   alarm((unsigned int) 10);  /* setup timeout. */    alarm((unsigned int) 20);  /* setup timeout. */
   signal(SIGALRM,cancelConnection);    mysignal(SIGALRM,cancelConnection);
   
   switch(ipmask) {    switch(ipmask) {
   case 0:/* only local */    case 0:/* only local */
Line 925  oxclientp oxCreateClient2(int fdstream,int portStream,
Line 976  oxclientp oxCreateClient2(int fdstream,int portStream,
   if (v) fprintf(stderr,"\nStream port %d : Connected.\n",portStream);    if (v) fprintf(stderr,"\nStream port %d : Connected.\n",portStream);
   
   if (fdStream == -1 || fdControl == -1) {    if (fdStream == -1 || fdControl == -1) {
     fprintf(stderr,"\nOpen error in oxCreateClient.\n");      fprintf(stderr,"\nOpen error in oxCreateClient2.\n");
       fprintf(stderr,"fdStream=%d, fdControl=%d\n",fdStream,fdControl);
     return(NULL);      return(NULL);
   }    }
   
   /* Authentication by password. */    /* Authentication by password. */
   m = strlen(pass);    m = strlen(passControl)+strlen(passData);
   s = (char *)mymalloc(sizeof(char)*(m+1));    if (m > 0) {
   read(fdControl,s,m+1); s[m] = '\0';      s = (char *)mymalloc(sizeof(char)*(m+1));
   if (strcmp(s,pass) != 0) {      m = strlen(passControl); s[0] = 0;
     fprintf(stderr,"oxCreateClient2(): password authentication failed for control channel.\n");      read(fdControl,s,m+1); s[m] = '\0';
     close(fdControl);      if (strcmp(s,passControl) != 0) {
     return(NULL);        fprintf(stderr,"s=%s, passControl=%s\n",s,passControl);
         fprintf(stderr,"oxCreateClient2(): password authentication failed for control channel.\n");
         close(fdControl);
         return(NULL);
       }
       m = strlen(passData); s[0] = 0;
       read(fdStream,s,m+1); s[m] = '\0';
       if (strcmp(s,passData) != 0) {
         fprintf(stderr,"s=%s, passData=%s\n",s,passData);
         fprintf(stderr,"oxCreateClient2(): password authentication failed for data channel.\n");
         close(fdStream);
         return(NULL);
       }
   }    }
   read(fdStream,s,m+1); s[m] = '\0';    mysignal(SIGALRM,SIG_IGN);
   if (strcmp(s,pass) != 0) {  
     fprintf(stderr,"oxCreateClient2(): password authentication failed for data channel.\n");  
     close(fdStream);  
     return(NULL);  
   }  
   signal(SIGALRM,SIG_IGN);  
   
   controlByteOrder = oxSetByteOrder(fdControl);    controlByteOrder = oxSetByteOrder(fdControl);
   if (v) fprintf(stderr,"Byte order for control process is %s.\n",    if (v) fprintf(stderr,"Byte order for control process is %s.\n",
Line 968  oxclientp oxCreateClient2(int fdstream,int portStream,
Line 1026  oxclientp oxCreateClient2(int fdstream,int portStream,
   client->dataport = portStream;    client->dataport = portStream;
   client->controlport = portControl;    client->controlport = portControl;
   client->controlfd = fdControl;    client->controlfd = fdControl;
   client->id = clnum; clnum++;    client->id = oxGetClientID();
   client->type = CLIENT_SOCKET; /* socket */    client->type = CLIENT_SOCKET; /* socket */
   client->engineByteOrder = engineByteOrder;    client->engineByteOrder = engineByteOrder;
   client->controlByteOrder = controlByteOrder;    client->controlByteOrder = controlByteOrder;
Line 990  int oxSetByteOrder(int fd) {
Line 1048  int oxSetByteOrder(int fd) {
   return(OX_BYTE_NETWORK_BYTE_ORDER);    return(OX_BYTE_NETWORK_BYTE_ORDER);
 }  }
   
 int oxTellMyByteOrder(int fd) {  int oxTellMyByteOrder(int fdOut, int fdIn) {
   char data[1];    char data[1];
   int peertype;    int peertype;
   /* It is for server. read and next write. */    /* It is for server. read and next write. */
   
   /* We support only Network byte order */    /* We support only Network byte order */
   data[0] = OX_BYTE_NETWORK_BYTE_ORDER;    data[0] = OX_BYTE_NETWORK_BYTE_ORDER;
   write(fd,data,1);    write(fdOut,data,1);
   fsync(fd);  /* returns 0 if normal. Does it work for socket? */    fsync(fdOut);  /* returns 0 if normal. Does it work for socket? */
   
   read(fd,data,1);    read(fdIn,data,1); /* Read pear's byte order */
   
   return(OX_BYTE_NETWORK_BYTE_ORDER);    return(OX_BYTE_NETWORK_BYTE_ORDER);
 }  }
   
   
   struct object OxClientList[MAX_N_OF_CLIENT];
   int OxClientListn = 0;
   
   int oxGetClientID() {
     extern struct object OxClientList[];
     extern int OxClientListn;
     extern struct object Nobj;
     int i;
     for (i=0; i<OxClientListn; i++) {
           if ((OxClientList[i]).tag == Snull) {
             return i;
           }
     }
     i = OxClientListn;
     (OxClientList[i]).tag = Snull;
     if (OxClientListn < MAX_N_OF_CLIENT-1) {
           OxClientListn++;
           return i;
     }else{
           fprintf(MyErrorOut,"oxGetClientID(): the client table is full. Returns ID = 0.\n");
           return 0;
     }
   }
   
   char *oxFIDtoStr(int id) {
     switch( id ) {
     case SM_mathcap:
       return "SM_mathcap"; break;
     case SM_setMathCap:
       return "SM_setMathCap"; break;
     case SM_pops:
       return "SM_pops"; break;
     case SM_getsp:
       return "SM_getsp"; break;
     case SM_dupErrors:
       return "SM_dupErrors"; break;
     case SM_pushCMOtag:
       return "SM_pushCMOtag"; break;
     case SM_setName:
       return "SM_setName"; break;
     case SM_evalName:
       return "SM_evalName"; break;
     case SM_executeStringByLocalParser:
       return "SM_executeStringByLocalParser"; break;
     case SM_executeFunction:
       return "SM_executeFunction"; break;
     case SM_executeFunctionWithOptionalArgument:
       return "SM_executeFunctionWithOptionalArgument"; break;
     case SM_popCMO:
       return "SM_popCMO"; break;
     case SM_popString:
       return "SM_popString"; break;
     case SM_shutdown:
       return "SM_shutdown"; break;
     case SM_beginBlock:
       return "SM_beginBlock"; break;
     case SM_endBlock:
       return "SM_endBlock"; break;
     default:
       return "Unknown to oxFIDtoStr"; break;
     }
   }

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.30

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