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

Diff for /OpenXM/src/kan96xx/plugin/oxmisc2.c between version 1.4 and 1.11

version 1.4, 1999/11/27 01:41:11 version 1.11, 2000/12/06 00:29:52
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/plugin/oxmisc2.c,v 1.3 1999/11/18 00:54:17 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/plugin/oxmisc2.c,v 1.10 2000/12/05 12:03:43 takayama Exp $ */
 #include <stdio.h>  #include <stdio.h>
 #include "ox_kan.h"  #include "ox_kan.h"
 #include "oxmisc2.h"   /* This file requires sm1 object description. */  #include "oxmisc2.h"   /* This file requires sm1 object description. */
 #include "cmo.h"  #include "cmo.h"
   
 extern FILE *MyErrorOut;  extern FILE *MyErrorOut;
   #define SET_MYERROROUT { if (MyErrorOut == NULL) MyErrorOut=stdout; }
   /* It is also defined in oxmisc.c */
   
 extern int SerialOX; /* defined in SerialOX */  extern int SerialOX; /* defined in SerialOX */
   
 extern int OxVersion;  extern int OxVersion;
Line 68  int oxGet(oxclientp client, struct object *op,int *isO
Line 72  int oxGet(oxclientp client, struct object *op,int *isO
 int oxGetFromControl(oxclientp client)  int oxGetFromControl(oxclientp client)
 {  {
   int ans = -1;    int ans = -1;
     AbortIfRFC_101(client);
   if (client->cstate != -1) {    if (client->cstate != -1) {
     ans = oxGetResultOfControlInt32(client->controlfd);      ans = oxGetResultOfControlInt32(client->controlfd);
     if (ans != -1) {    client->cstate = 0; }      if (ans != -1) {    client->cstate = 0; }
Line 79  int oxGetFromControl(oxclientp client)
Line 84  int oxGetFromControl(oxclientp client)
 int oxReq(oxclientp client,int func,struct object ob)  int oxReq(oxclientp client,int func,struct object ob)
 {  {
   struct object *ob1p;    struct object *ob1p;
     SET_MYERROROUT;
   /* request to the control channel */    /* request to the control channel */
   if (func == SM_control_reset_connection ||    if (func == SM_control_reset_connection ||
       func == SM_control_kill) {        func == SM_control_kill) {
           AbortIfRFC_101(client);
     switch(func) {      switch(func) {
     case SM_control_reset_connection:      case SM_control_reset_connection:
       oxReqControlResetConnection(client->controlfd);        oxReqControlResetConnection(client->controlfd);
       client->cstate = 1;        client->cstate = 0;
       client->dstate = DSTATE_FIRST_SYNC;        client->dstate = DSTATE_FIRST_SYNC;
       break;        break;
     case SM_control_kill:      case SM_control_kill:
Line 677  static int cmoCheck00(struct object obj,int cmo[], int
Line 684  static int cmoCheck00(struct object obj,int cmo[], int
 #define CHECK00_N  4098      /* look up stackm.h and kclass.h */  #define CHECK00_N  4098      /* look up stackm.h and kclass.h */
   static int typeTrans[CHECK00_N];    static int typeTrans[CHECK00_N];
   static int init = 0;    static int init = 0;
   if (n == 0) return(1);  /* For null cmolist, OK. */    /* if n == 0, report the cmo tag of the object obj.
            If it cannot be translated to cmo, then return -1. */
   
   if (!init) {    if (!init) {
     for (i=0; i<CHECK00_N; i++) {      for (i=0; i<CHECK00_N; i++) {
       typeTrans[i] = 0;  /* unknown cmo number */        typeTrans[i] = 0;  /* unknown cmo number */
Line 706  static int cmoCheck00(struct object obj,int cmo[], int
Line 715  static int cmoCheck00(struct object obj,int cmo[], int
   if (obj.tag == Sclass) {    if (obj.tag == Sclass) {
     ttt = typeTrans[ectag(obj)];      ttt = typeTrans[ectag(obj)];
   }    }
     /* Only report the cmo tag. */
     if (n == 0) {
           if (ttt == 0) return(-1);
           else return(ttt);
     }
   
   for (i=0; i<n; i++) {    for (i=0; i<n; i++) {
     if (ttt == cmo[i]) {      if (ttt == cmo[i]) {
Line 903  struct object KoxGetPort(struct object host)
Line 917  struct object KoxGetPort(struct object host)
   putoa(rob,3,KpoInteger(portControl));    putoa(rob,3,KpoInteger(portControl));
   return(rob);    return(rob);
 }  }
   struct object KoxGetPort1(struct object host)
   {
     struct object rob;
     int fdStream;
     int portStream;
     extern int OpenedSocket;
     char *sname;
     rob = NullObject;
     if (host.tag != Sdollar) {
       errorOxmisc2("KoxGetPort1: argument is not a string.");
       return(rob);
     }
     sname = KopString(host);
     fdStream = socketOpen(sname,0);
     portStream = OpenedSocket;
     rob = newObjectArray(2);
     putoa(rob,0,KpoInteger(fdStream));
     putoa(rob,1,KpoInteger(portStream));
     return(rob);
   }
   
 struct object KoxCreateClient2(struct object peer,  struct object KoxCreateClient2(struct object peer,
                                struct object ipmask,                                 struct object ipmask,
Line 951  struct object KoxCreateClient2(struct object peer,
Line 985  struct object KoxCreateClient2(struct object peer,
   return(rob);    return(rob);
 }  }
   
   int KgetCmoTagOfObject(struct object obj) {
     int k;
     k=cmoCheck00(obj,(int *)NULL,0);
     return(k);
   }
   
 errorOxmisc2(char *s) {  errorOxmisc2(char *s) {
     SET_MYERROROUT;
   fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s);    fprintf(MyErrorOut,"error in oxmisc2.c: %s\n",s);
   errorKan1("%s\n","  ");    errorKan1("%s\n","  ");
   }
   
   struct object KoxPushCMD(struct object client,struct object cmd) {
     int ans;
     static oxclientp cc1 = NULL;
     struct object rob;
     rob.tag = Snull;
     if (cc1 == NULL) {
       cc1 = (oxclientp) mymalloc(sizeof(oxclient));
       if (cc1 == NULL) {
         errorOxmisc2("KoxReq(): no more memory.");
         return(rob);
       }
       oxInitClient(cc1);  /* BUG: is it fine? */
     }
   
     if (oxObjectToClient(client,cc1) == -1) return(rob);
     if (cc1 == NULL) {
       errorOxmisc2("KoxReq(): the first argument must be a client object.");
       return(rob);
     }
     if (cmd.tag != Sinteger) {
       errorOxmisc2("KoxReq(): the second argument must be an integer.");
       return(rob);
     }
     /* BUG: check the mathcap */
     oxSendOXheader(cc1->datafp2,OX_COMMAND,SerialOX++);
     oxSendInt32(cc1->datafp2,KopInteger(cmd));
     /* synchronize cc1 and client. */
     oxClientToObject(cc1,client);
     return(cmd);
   }
   
   struct object KoxPushCMO(struct object client,struct object ob) {
     int ans;
     static oxclientp cc1 = NULL;
     struct object rob;
     rob.tag = Snull;
     if (cc1 == NULL) {
       cc1 = (oxclientp) mymalloc(sizeof(oxclient));
       if (cc1 == NULL) {
         errorOxmisc2("KoxReq(): no more memory.");
         return(rob);
       }
       oxInitClient(cc1);  /* BUG: is it fine? */
     }
   
     if (oxObjectToClient(client,cc1) == -1) return(rob);
     if (cc1 == NULL) {
       errorOxmisc2("KoxReq(): the first argument must be a client object.");
       return(rob);
     }
   
     /* request to the data channel */
     if (cc1->dstate != DSTATE_ANY) {
       errorOxmisc2("oxPushCMO: cc1->dstate != DSTATE_ANY, data channel is not ready to send data.\n");
       return(rob);
     }
   
     if (!cmoCheckMathCap(ob,(struct object *)cc1->mathcapObjp)) {
           errorOxmisc2("oxPushCMO: your peer does not understand this cmo.\n");
           return(rob);
     }
     oxSendOXheader(cc1->datafp2,OX_DATA,SerialOX++);
     cmoObjectToStream2(ob,cc1->datafp2);
     /* synchronize cc1 and client. */
     oxClientToObject(cc1,client);
     return(ob);
   }
   
   oxclientp oxCreateControl_RFC_101(int fdstream,int portStream,
                                                 int ipmask,char *pass);
   struct object KoxCreateControl_RFC_101(struct object peer,struct object ipmask,struct object pass)
   {
     struct object rob;
     oxclientp client;
     int fdStream, portStream;
     int i;
     struct object ob1;
     rob.tag = Snull;
     if (peer.tag != Sarray) {
       errorOxmisc2("KoxCreateControl_RFC_101(): The first argument must be an array [fdStream, portStream]");
       return(rob);
     }
     if (getoaSize(peer) != 2 ) {
       errorOxmisc2("KoxCreateControl_RFC_101(): The first argument must be an array [fdStream, portStream] of size 2.");
       return(rob);
     }
     for (i=0; i<getoaSize(peer); i++) {
       ob1 = getoa(peer,i);
       if (ob1.tag != Sinteger) {
         errorOxmisc2("KoxCreateControl_RFC_101(): The element of the first argument must be an integer.");
       }
     }
     fdStream = KopInteger(getoa(peer,0));
     portStream = KopInteger(getoa(peer,1));
   
     if (ipmask.tag != Sinteger) {
       errorOxmisc2("KoxCreateControl_RFC_101(): ipmask must be an integer.");
     }
     if (pass.tag != Sdollar) {
       errorOxmisc2("KoxCreateControl_RFC_101(): pass must be a string.");
     }
   
     client = oxCreateControl_RFC_101(fdStream, portStream,
                              KopInteger(ipmask), KopString(pass));
     if (client == NULL) {
       errorOxmisc2("KoxCreateControl_RFC_101(): Open error.");
       return(rob);
     }
     rob = newObjectArray(N_OF_CLIENT_FIELDS);
     oxClientToObject(client,rob);
     return(rob);
   }
   
   oxclientp oxCreateControl_RFC_101(int fdstream,int portStream,
                                                 int ipmask,char *pass)
   {
     static int clnum = 0;
     int v = 0;
     int fdControl = -1;
     int fdStream = -1;
     int m;
   
     char *s;
     oxclientp client;
     extern jmp_buf MyEnv_oxmisc ;
     int engineByteOrder;
     extern int Quiet;
   
     v = !Quiet;
   
     switch(ipmask) {
     case 0:/* only local */
       fdStream  = socketAcceptLocal(fdstream);
       break;
     default:/* any */
       fdStream  = socketAccept(fdstream);
       break;
     }
     if (v) fprintf(stderr,"\nControl port %d : Connected.\n",portStream);
   
     if (fdStream == -1 ) {
       fprintf(stderr,"\nOpen error in oxCreateControl_RFC_101.\n");
       return(NULL);
     }
   
     /* Authentication by password. */
     m = strlen(pass);
     s = (char *)mymalloc(sizeof(char)*(m+1));
     read(fdStream,s,m+1); s[m] = '\0';
     if (strcmp(s,pass) != 0) {
       fprintf(stderr,"oxCreateControl_RFC_101(): password authentication failed for control channel.\n");
       close(fdStream);
       return(NULL);
     }
   
   
     engineByteOrder = oxSetByteOrder(fdStream);
     if (v) fprintf(stderr,"Byte order for control stackmacine is %s.\n",
                    (engineByteOrder == 0? "network byte order":
                     (engineByteOrder == 1? "little indican":
                      "big indian")));
   
   
     client = (oxclientp) mymalloc(sizeof(oxclient));
     oxInitClient(client);
     client->datafp2 = fp2open(fdStream);
     if (client->datafp2 == NULL) {
       fprintf(stderr,"oxCreateControl_RFC_101(): fp2open(fd) failed.\n");
       return(NULL);
     }
     client->dataport = portStream;
     client->controlport = -1;
     client->controlfd = -1;
     client->id = clnum; clnum++;
     client->type = CLIENT_SOCKET; /* socket */
     client->engineByteOrder = engineByteOrder;
     client->controlByteOrder = -1;
     return(client);
   }
   
   oxclientp oxCreateEngine_RFC_101(int fdstream,int portStream,
                                                 int ipmask,char *pass, int engineID);
   struct object KoxCreateEngine_RFC_101(struct object peer,struct object ipmask,struct object pass, struct object engineID)
   {
     struct object rob;
     oxclientp client;
     int fdStream, portStream;
     int i;
     struct object ob1;
     rob.tag = Snull;
     if (peer.tag != Sarray) {
       errorOxmisc2("KoxCreateEngine_RFC_101(): The first argument must be an array [fdStream, portStream]");
       return(rob);
     }
     if (getoaSize(peer) != 2 ) {
       errorOxmisc2("KoxCreateEngine_RFC_101(): The first argument must be an array [fdStream, portStream] of size 2.");
       return(rob);
     }
     for (i=0; i<getoaSize(peer); i++) {
       ob1 = getoa(peer,i);
       if (ob1.tag != Sinteger) {
         errorOxmisc2("KoxCreateEngine_RFC_101(): The element of the first argument must be an integer.");
       }
     }
     fdStream = KopInteger(getoa(peer,0));
     portStream = KopInteger(getoa(peer,1));
   
     if (ipmask.tag != Sinteger) {
       errorOxmisc2("KoxCreateEngine_RFC_101(): ipmask must be an integer.");
     }
     if (pass.tag != Sdollar) {
       errorOxmisc2("KoxCreateEngine_RFC_101(): pass must be a string.");
     }
     if (engineID.tag != Sinteger) {
       errorOxmisc2("KoxCreateEngine_RFC_101(): engineID must be an integer.");
     }
   
     client = oxCreateEngine_RFC_101(fdStream, portStream,
                              KopInteger(ipmask), KopString(pass),KopInteger(engineID));
     if (client == NULL) {
       errorOxmisc2("KoxCreateEngine_RFC_101(): Open error.");
       return(rob);
     }
     rob = newObjectArray(N_OF_CLIENT_FIELDS);
     oxClientToObject(client,rob);
     return(rob);
   }
   
   oxclientp oxCreateEngine_RFC_101(int fdstream,int portStream,
                                                 int ipmask,char *pass,int engineID)
   {
     int v = 0;
     int fdControl = -1;
     int fdStream = -1;
     int m;
   
     char *s;
     oxclientp client;
     extern jmp_buf MyEnv_oxmisc ;
     int engineByteOrder;
     extern int Quiet;
   
     v = !Quiet;
   
     switch(ipmask) {
     case 0:/* only local */
       fdStream  = socketAcceptLocal(fdstream);
       break;
     default:/* any */
       fdStream  = socketAccept(fdstream);
       break;
     }
     if (v) fprintf(stderr,"\nEngine port %d : Connected.\n",portStream);
   
     if (fdStream == -1 ) {
       fprintf(stderr,"\nOpen error in oxCreateEngine_RFC_101.\n");
       return(NULL);
     }
   
     /* Authentication by password. */
     /*  skip password check for now. BUG.
     m = strlen(pass);
     s = (char *)mymalloc(sizeof(char)*(m+1));
     read(fdStream,s,m+1); s[m] = '\0';
     if (strcmp(s,pass) != 0) {
       fprintf(stderr,"oxCreateEngine_RFC_101(): password authentication failed for control channel.\n");
       close(fdStream);
       return(NULL);
     }
     */
   
     engineByteOrder = oxSetByteOrder(fdStream);
     if (v) fprintf(stderr,"Byte order for engine stackmacine is %s.\n",
                    (engineByteOrder == 0? "network byte order":
                     (engineByteOrder == 1? "little indican":
                      "big indian")));
   
   
     client = (oxclientp) mymalloc(sizeof(oxclient));
     oxInitClient(client);
     client->datafp2 = fp2open(fdStream);
     if (client->datafp2 == NULL) {
       fprintf(stderr,"oxCreateEngine_RFC_101(): fp2open(fd) failed.\n");
       return(NULL);
     }
     client->dataport = portStream;
     client->controlport = -1;
     client->controlfd = -1;
     client->id = engineID;
     client->type = CLIENT_SOCKET; /* socket */
     client->engineByteOrder = engineByteOrder;
     client->controlByteOrder = -1;
     return(client);
 }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.11

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