=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/plugin/sm1Socket.c,v retrieving revision 1.1.1.1 retrieving revision 1.4 diff -u -p -r1.1.1.1 -r1.4 --- OpenXM/src/kan96xx/plugin/sm1Socket.c 1999/10/08 02:12:05 1.1.1.1 +++ OpenXM/src/kan96xx/plugin/sm1Socket.c 2001/08/12 03:13:36 1.4 @@ -1,3 +1,4 @@ +/* $OpenXM: OpenXM/src/kan96xx/plugin/sm1Socket.c,v 1.3 2001/05/04 01:06:30 takayama Exp $ */ /* msg0s.c */ #include #include @@ -57,7 +58,7 @@ struct object KsocketOpen(struct object obj) { me.sin_family = AF_INET; me.sin_port = htons(portNumber); bcopy(myhost->h_addr, - &me.sin_addr,myhost->h_length); + &me.sin_addr,myhost->h_length); if ((s_waiting = socket(AF_INET,SOCK_STREAM,0)) < 0) { errorMsg1s("Socket allocation is failed."); @@ -81,8 +82,8 @@ struct object KsocketOpen(struct object obj) { errorMsg1s("Listen failed"); } /* - fprintf(stderr,"Done the initialization. port =%d\n",ntohs(me.sin_port)); - fprintf(stderr,"socket id = %d",accept(s_waiting,NULL,NULL)); */ + fprintf(stderr,"Done the initialization. port =%d\n",ntohs(me.sin_port)); + fprintf(stderr,"socket id = %d",accept(s_waiting,NULL,NULL)); */ rob = newObjectArray(2); putoa(rob,0,KpoInteger(s_waiting)); putoa(rob,1,KpoInteger(ntohs(me.sin_port))); @@ -131,7 +132,7 @@ struct object KsocketConnect(struct object obj) { server.sin_family = AF_INET; server.sin_port = htons(portNumber); bcopy(servhost->h_addr, - (char *)&server.sin_addr,servhost->h_length); + (char *)&server.sin_addr,servhost->h_length); if ((socketid = socket(AF_INET,SOCK_STREAM,0)) <0) { errorMsg1s("socket allocation is failed.\n"); @@ -236,7 +237,7 @@ struct object KsocketSelect(struct object obj) { } struct object KsocketSelectMulti(struct object obj) -/* [ [integer socketid1, integer socketid2, ...] + /* [ [integer socketid1, integer socketid2, ...] optional integer timeout default 0] [ result1, result2, ....] */ @@ -349,14 +350,14 @@ struct object KsocketRead(struct object obj) { if (datasize - totalsize > 0) { n = read(socketid,data+totalsize,datasize-totalsize); if (n < 0) { - errorMsg1s("Read error."); + errorMsg1s("Read error."); } if (n < datasize-totalsize) { - totalsize += n; - break; + totalsize += n; + break; }else{ totalsize += n; } if (totalsize == 0) { - errorMsg1s("Select returns 1, but there is no data to read."); + errorMsg1s("Select returns 1, but there is no data to read."); } }else { /* increase the datasize */ tmp = (char *)GC_malloc(sizeof(char)*2*datasize); @@ -475,25 +476,53 @@ struct object KsocketWriteByte(struct object obj) { struct object ob1; struct object ob2; int socketid; - int r; - char data[2]; + int r,i,n,kk,r0; +#define DATA_SIZE 1024 + char data[DATA_SIZE]; if (obj.tag != Sarray) { - errorMsg1s("KsocketWriteByte([integer socketid, int])"); + errorMsg1s("KsocketWriteByte([integer socketid, int | array of int])"); } if (getoaSize(obj) < 2) { - errorMsg1s("KsocketWriteByte([integer socketid, int])"); + errorMsg1s("KsocketWriteByte([integer socketid, int | array of int])"); } ob1 = getoa(obj,0); ob2 = getoa(obj,1); if (ob1.tag != Sinteger) { - errorMsg1s("KsocketWriteByte([integer socketid, int]) : the first argument must be an integer."); + errorMsg1s("KsocketWriteByte([integer socketid, int | array of int]) : the first argument must be an integer."); } socketid = KopInteger(ob1); - if (ob2.tag != Sinteger) { - errorMsg1s("KsocketWriteByte([integer socketid, int]) : the second argument must be a string."); + if (ob2.tag != Sinteger && ob2.tag != Sarray) { + errorMsg1s("KsocketWriteByte([integer socketid, int | array of int]) : the second argument must be an integer or an array of integers."); } - data[0] = KopInteger(ob2); - r = write(socketid,data, 1); + if (ob2.tag == Sinteger) { + data[0] = KopInteger(ob2); + r = write(socketid,data, 1); + }else{ + n = getoaSize(ob2); kk = 0; r = 0; + for (i=0; i= DATA_SIZE) { + r0 = write(socketid,data,kk); + if (r0 != kk) { + fprintf(stderr,"Warning: Could not write to the socket.\n"); + return(KpoInteger(r+r0)); + } + r += r0; + kk = 0; + } + } + if (kk > 0) { + r0 = write(socketid,data,kk); + if (r0 != kk) { + fprintf(stderr,"Warning: Could not write to the socket.\n"); + return(KpoInteger(r+r0)); + } + r += r0; + } + } return(KpoInteger(r)); }