[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.1 and 1.9

version 1.1, 1999/10/08 02:12:05 version 1.9, 2000/12/05 11:20:26
Line 1 
Line 1 
   /* $OpenXM: OpenXM/src/kan96xx/plugin/oxmisc2.c,v 1.8 2000/12/03 08:19:55 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 67  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 78  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 128  int oxReq(oxclientp client,int func,struct object ob)
Line 136  int oxReq(oxclientp client,int func,struct object ob)
   case SM_setMathCap:    case SM_setMathCap:
     /* ob = [(mathcap-obj) [[version num, system name] [sm tags]      /* ob = [(mathcap-obj) [[version num, system name] [sm tags]
                              ob1                        smtags                               ob1                        smtags
                                                 [[ox numbers] [cmo numbers]]]                                      oxtags      [[ox numbers, [cmo numbers]]]
                                                     ob3         ob2 */                                                      ob3         ob2 */
      /*     oxtags      [[OX_DATA, [cmo numbers]],[OX_DATA_LOCAL,[opt]],...]*/
     {      {
       struct object ob1;        struct object ob1;
       struct object ob2;        struct object ob2;
       struct object ob3;        struct object ob3;
         struct object obm;
       struct object smtags;        struct object smtags;
         struct object oxtags;
         struct object ox;
     int n,i;      int n,i;
     struct mathCap mathcap;      struct mathCap mathcap;
   
Line 143  int oxReq(oxclientp client,int func,struct object ob)
Line 155  int oxReq(oxclientp client,int func,struct object ob)
       client->dstate = DSTATE_ANY;        client->dstate = DSTATE_ANY;
       break;        break;
     }      }
       ob1 = getoa(getoa(ob,1),0);        obm = getoa(ob,1);
       smtags = getoa(getoa(ob,1),1);        ob1 = getoa(obm,0);
       ob2 = getoa(getoa(getoa(ob,1),2),1);        smtags = getoa(obm,1);
       ob3 = getoa(getoa(getoa(ob,1),2),0);        oxtags = getoa(obm,2);
         if (smtags.tag != Sarray || oxtags.tag != Sarray) {
           errorOxmisc2("data format error in oxReqSetMathCap");
         }
       ob1p = (struct object *) sGC_malloc(sizeof(struct object));        ob1p = (struct object *) sGC_malloc(sizeof(struct object));
       *ob1p = ob1;        *ob1p = ob1;
       mathcap.infop = ob1p;        mathcap.infop = ob1p;
       n = getoaSize(ob2);  
       mathcap.n = n;        n = getoaSize(oxtags);
       if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");        if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");
       for (i=0; i<n; i++) {  
         mathcap.cmo[i] = KopInteger(getoa(ob2,i));  
       }  
       n = getoaSize(ob3);  
       if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");  
       mathcap.oxSize = n;        mathcap.oxSize = n;
       for (i=0; i<n; i++) {        for (i=0; i<n; i++) {
         mathcap.ox[i] = KopInteger(getoa(ob3,i));          ox = getoa(oxtags,i);
           if (ox.tag != Sarray) {
             errorOxmisc2("Data format error of the third argument of mathcap.");
           }
           mathcap.ox[i] = KopInteger(getoa(ox,0));
           if (mathcap.ox[i] == OX_DATA) {
             if (getoaSize(ox) < 2) {
               errorOxmisc2("Data format error in an entry of the third argument of mathcap.");
             }
             ob2 = getoa(ox,1);
             if (ob2.tag != Sarray) {
               errorOxmisc2("Data format error in an entry of the third argument of mathcap.");
             }
             mathcap.n = getoaSize(ob2);
             if (n >= MATHCAP_SIZE) errorOxmisc2("Too big mathcap of your peer.");
             for (i=0; i<mathcap.n; i++) {
               mathcap.cmo[i] = KopInteger(getoa(ob2,i));
             }
           }
       }        }
   
       n = getoaSize(smtags);        n = getoaSize(smtags);
Line 584  struct object KoxWatch(struct object client,struct obj
Line 611  struct object KoxWatch(struct object client,struct obj
   int ans,k;    int ans,k;
   static oxclientp cc1 = NULL;    static oxclientp cc1 = NULL;
   struct object rob;    struct object rob;
     extern int WatchStream;
   rob.tag = Snull;    rob.tag = Snull;
     if (client.tag == Sinteger) {
           if (KopInteger(client)) {
             WatchStream = 1;
           }else{
             WatchStream = 0;
           }
           return;
     }
   if (cc1 == NULL) {    if (cc1 == NULL) {
     cc1 = (oxclientp) mymalloc(sizeof(oxclient));      cc1 = (oxclientp) mymalloc(sizeof(oxclient));
     if (cc1 == NULL) {      if (cc1 == NULL) {
Line 648  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 677  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 713  int cmoCheckMathCap(struct object obj, struct object *
Line 756  int cmoCheckMathCap(struct object obj, struct object *
 {  {
   struct object mathcap;    struct object mathcap;
   struct object cmolist;    struct object cmolist;
     struct object mathcapMain;
     struct object mathcapThird;
     struct object ox;
     struct object oxtag;
     struct object ob0;
     int oxsize;
   int n;    int n;
   int i;    int i;
 #define CMO_CHECK_MATH_CAP_LIST_SIZE 1024  #define CMO_CHECK_MATH_CAP_LIST_SIZE 1024
   int cmo[CMO_CHECK_MATH_CAP_LIST_SIZE];    int cmo[CMO_CHECK_MATH_CAP_LIST_SIZE];
   if (obp == NULL) return(1);    if (obp == NULL) return(1);
     /* printObject(*obp,0,stderr); for debug*/
   if (obp->tag != Sarray) {    if (obp->tag != Sarray) {
     fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");      fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
     printObject(*obp,0,stderr);      printObject(*obp,0,stderr);
Line 725  int cmoCheckMathCap(struct object obj, struct object *
Line 775  int cmoCheckMathCap(struct object obj, struct object *
     errorOxmisc2("cmoCheckMathCap: format error in the client->mathcapObjp field.\n");      errorOxmisc2("cmoCheckMathCap: format error in the client->mathcapObjp field.\n");
   }    }
   mathcap = *obp;    mathcap = *obp;
     /* Example of mathcap
       [    $mathcap-object$ ,
          [    [    199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.991106$ ,
                    $HOSTTYPE=i386$ ]  ,
               [    262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 ,
                    276 ]  ,
               [    [    514  , [    2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 , 25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 16 , 34 ] ] ]  ]  ]
     */
   
   n = getoaSize(mathcap);    n = getoaSize(mathcap);
   if (n < 2) {    if (n < 2) {
     fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");      fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
Line 732  int cmoCheckMathCap(struct object obj, struct object *
Line 791  int cmoCheckMathCap(struct object obj, struct object *
     fprintf(stderr,"\n");      fprintf(stderr,"\n");
     errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n");      errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n");
   }    }
   /* I should check    ob0 = getoa(mathcap,0);
          getoa(getoa(mathcap,2),0)    if (ob0.tag != Sdollar) {
      contains OX_DATA.  
      It has not yet implemented.  
   */  
   mathcap = getoa(getoa(mathcap,1),2);  
   n = getoaSize(mathcap);  
   if (n < 2) {  
     fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");      fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
     printObject(*obp,0,stderr);      printObject(*obp,0,stderr);
     fprintf(stderr,"\n");      fprintf(stderr,"\n");
     errorOxmisc2("cmoCheckMathCap: length of mathcap is wrong in the client->mathcapObjp field.\n");      errorOxmisc2("cmoCheckMathCap: The first field must be the string mathcap-object.\n");
   }    }
   cmolist = getoa(mathcap,1);    if (strcmp(KopString(ob0),"mathcap-object") != 0) {
   if (cmolist.tag != Sarray) {  
     fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");      fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
     printObject(*obp,0,stderr);      printObject(*obp,0,stderr);
     fprintf(stderr,"\n");      fprintf(stderr,"\n");
     errorOxmisc2("cmoCheckMathCap: mathcap[1] must be an array of integers.\n");      errorOxmisc2("cmoCheckMathCap: The mathcap must be of the form [(mathcap-object) [...]]\n");
   }    }
   n = getoaSize(cmolist);  
   if (n > CMO_CHECK_MATH_CAP_LIST_SIZE) {    /* I should check
     errorOxmisc2("cmoCheckMathCap: Too big cmo list.\n");           getoa(getoa(mathcap,1),2)
        contains OX_DATA.
        It has not yet implemented.
     */
     mathcapMain = getoa(mathcap,1);
     if (mathcapMain.tag != Sarray) {
       fprintf(stderr,"cmoCheckMathCap: mathcap[1] is \n");
       printObject(mathcapMain,0,stderr);
       fprintf(stderr,"\n");
       errorOxmisc2("cmoCheckMathCap: format error in the (client->mathcapObjp)[1] field. It should be an array.\n");
   }    }
   for (i=0; i<n; i++) {    if (getoaSize(mathcapMain) < 3) {
     cmo[i] = KopInteger(getoa(cmolist,i));      fprintf(stderr,"cmoCheckMathCap: mathcap[1] is \n");
       printObject(mathcapMain,0,stderr);
       fprintf(stderr,"\n");
       errorOxmisc2("cmoCheckMathCap: format error in the (client->mathcapObjp)[1] field. It should be an array of which length is more than 2.\n");
   }    }
     mathcapThird = getoa(mathcapMain,2);
     oxsize = getoaSize(mathcapThird);
     for (i=0; i<oxsize; i++) {
       ox = getoa(mathcapThird,i);
       if (ox.tag != Sarray) {
         fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
         printObject(*obp,0,stderr);
         fprintf(stderr,"\n");
         errorOxmisc2("cmoCheckMathCap: the third element of mathcap is a list of lists.");
       }
       if (getoaSize(ox) != 0) {
         oxtag = getoa(ox,0);
         if (oxtag.tag != Sinteger) {
           fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
           printObject(*obp,0,stderr);
           fprintf(stderr,"\n");
           errorOxmisc2("cmoCheckMathCap: the third element of mathcap must be [OX_DATA_xxx, [  ]].");
         }
         if (KopInteger(oxtag) == OX_DATA) {
           if (getoaSize(ox) > 1) {
             cmolist = getoa(ox,1);
             if (cmolist.tag != Sarray) {
               fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
               printObject(*obp,0,stderr);
               fprintf(stderr,"\n");
               errorOxmisc2("cmoCheckMathCap: mathcap[1] must be an array of integers.\n");
             }
             n = getoaSize(cmolist);
             if (n > CMO_CHECK_MATH_CAP_LIST_SIZE) {
               errorOxmisc2("cmoCheckMathCap: Too big cmo list.\n");
             }
             for (i=0; i<n; i++) {
               cmo[i] = KopInteger(getoa(cmolist,i));
             }
           }else{
             fprintf(stderr,"cmoCheckMathCap: the mathcap obj is \n");
             printObject(*obp,0,stderr);
             fprintf(stderr,"\nox=");
             printObject(ox,0,stderr);
             errorOxmisc2("cmoCheckMathCap: [OX_DATA, cmolist]");
           }
         }
       }
     }
   return(cmoCheck00(obj,cmo,n));    return(cmoCheck00(obj,cmo,n));
 }  }
   
Line 857  struct object KoxCreateClient2(struct object peer,
Line 965  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);
   }
   
   /* ------------- TODO ----------------- */
   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);
 }  }

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

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