version 1.2, 2000/01/16 07:55:48 |
version 1.22, 2020/10/06 11:33:47 |
|
|
/* $OpenXM$ */ |
/* $OpenXM: OpenXM/src/kan96xx/plugin/sm1Socket.c,v 1.21 2015/10/10 11:29:46 takayama Exp $ */ |
/* msg0s.c */ |
/* msg0s.c */ |
#include <stdio.h> |
#include <stdio.h> |
|
#include <string.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> |
#include <netinet/in.h> |
#include <netinet/in.h> |
#include <netdb.h> |
#include <netdb.h> |
|
#include <errno.h> |
|
#include <stdlib.h> |
|
#include <unistd.h> |
|
|
|
|
#include "datatype.h" |
#include "datatype.h" |
#include "stackm.h" |
#include "stackm.h" |
#include "extern.h" |
#include "extern.h" |
#include "sm1Socket.h" |
#include "sm1Socket.h" |
|
|
extern int Quiet; |
extern int Quiet; |
|
static int Post_debug=0; |
static void errorMsg1s(char *s); |
static void errorMsg1s(char *s); |
|
static int getContentLength(char *s); |
|
static int getReceivedContentLength(char *s); |
|
#define MAX_LISTEN_QUEUE 3 |
|
|
/* [(sm1.socket) (open) [optional integer port, optional string name] ] extension ; */ |
/* [(sm1.socket) (open) [optional integer port, optional string name] ] extension ; */ |
struct object KsocketOpen(struct object obj) { |
struct object KsocketOpen(struct object obj) { |
Line 26 struct object KsocketOpen(struct object obj) { |
|
Line 33 struct object KsocketOpen(struct object obj) { |
|
int s_waiting; |
int s_waiting; |
int on; |
int on; |
int tt; |
int tt; |
extern int errno; |
extern int Post_debug; |
|
|
|
if ((char *)getenv("OXWEB_DEBUG") != NULL) { |
|
Post_debug = 1; |
|
} |
|
|
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
errorMsg1s("KsocketOpen([optional integer,optional string name])"); |
errorMsg1s("KsocketOpen([optional integer,optional string name])"); |
} |
} |
Line 52 struct object KsocketOpen(struct object obj) { |
|
Line 63 struct object KsocketOpen(struct object obj) { |
|
|
|
/* fprintf(stderr,"Hello from open.\n"); */ |
/* fprintf(stderr,"Hello from open.\n"); */ |
if ((myhost = gethostbyname(serverName)) == NULL) { |
if ((myhost = gethostbyname(serverName)) == NULL) { |
errorMsg1s("Bad server name."); |
perror("gethostbyname"); errorMsg1s("Bad server name."); |
} |
} |
bzero((char *)&me,sizeof(me)); |
bzero((char *)&me,sizeof(me)); |
me.sin_family = AF_INET; |
me.sin_family = AF_INET; |
me.sin_port = htons(portNumber); |
me.sin_port = htons(portNumber); |
bcopy(myhost->h_addr, |
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) { |
if ((s_waiting = socket(AF_INET,SOCK_STREAM,0)) < 0) { |
errorMsg1s("Socket allocation is failed."); |
perror("socket"); errorMsg1s("Socket allocation is failed."); |
} |
} |
|
|
on=1; setsockopt(s_waiting,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); |
on=1; setsockopt(s_waiting,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); |
/* important */ |
/* important */ |
if (bind(s_waiting,(struct sockaddr *) &me,sizeof(me)) == -1) { |
if (bind(s_waiting,(struct sockaddr *) &me,sizeof(me)) == -1) { |
fprintf(stderr,"Bind error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
fprintf(stderr,"Bind error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
errorMsg1s("cannot bind"); |
perror("bind"); errorMsg1s("cannot bind"); |
} |
} |
|
|
tt = sizeof(me); |
tt = sizeof(me); |
if (getsockname(s_waiting,(struct sockaddr *)&me,&tt) < 0) { |
if (getsockname(s_waiting,(struct sockaddr *)&me,&tt) < 0) { |
fprintf(stderr,"getsockname error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
fprintf(stderr,"getsockname error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
errorMsg1s("cannot getsockname"); |
perror("getsockname"); errorMsg1s("cannot getsockname"); |
} |
} |
|
|
|
|
if (listen(s_waiting,1) < 0) { |
if (listen(s_waiting,MAX_LISTEN_QUEUE) < 0) { |
errorMsg1s("Listen failed"); |
perror("listen"); errorMsg1s("Listen failed"); |
} |
} |
/* |
/* |
fprintf(stderr,"Done the initialization. port =%d\n",ntohs(me.sin_port)); |
fprintf(stderr,"Done the initialization. port =%d\n",ntohs(me.sin_port)); |
fprintf(stderr,"socket id = %d",accept(s_waiting,NULL,NULL)); */ |
fprintf(stderr,"socket id = %d",accept(s_waiting,NULL,NULL)); */ |
rob = newObjectArray(2); |
rob = newObjectArray(2); |
putoa(rob,0,KpoInteger(s_waiting)); |
putoa(rob,0,KpoInteger(s_waiting)); |
putoa(rob,1,KpoInteger(ntohs(me.sin_port))); |
putoa(rob,1,KpoInteger(ntohs(me.sin_port))); |
Line 126 struct object KsocketConnect(struct object obj) { |
|
Line 137 struct object KsocketConnect(struct object obj) { |
|
|
|
|
|
if ((servhost = gethostbyname(serverName)) == NULL) { |
if ((servhost = gethostbyname(serverName)) == NULL) { |
errorMsg1s("bad server name.\n"); |
perror("gethostbyname"); errorMsg1s("bad server name.\n"); |
} |
} |
bzero((char *)&server,sizeof(server)); |
bzero((char *)&server,sizeof(server)); |
server.sin_family = AF_INET; |
server.sin_family = AF_INET; |
server.sin_port = htons(portNumber); |
server.sin_port = htons(portNumber); |
bcopy(servhost->h_addr, |
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) { |
if ((socketid = socket(AF_INET,SOCK_STREAM,0)) <0) { |
errorMsg1s("socket allocation is failed.\n"); |
perror("socket"); errorMsg1s("socket allocation is failed.\n"); |
} |
} |
if (!Quiet) { |
if (!Quiet) { |
fprintf(stderr,"Trying to connect port %d, ip=%x\n",ntohs(server.sin_port),server.sin_addr); |
fprintf(stderr,"Trying to connect port %d, ip=%lx\n",ntohs(server.sin_port),(long) server.sin_addr.s_addr); |
} |
} |
if (connect(socketid,(struct sockaddr *)&server,sizeof(server)) == -1) { |
if (connect(socketid,(struct sockaddr *)&server,sizeof(server)) == -1) { |
errorMsg1s("cannot connect"); |
perror("connect"); errorMsg1s("cannot connect"); |
} |
} |
/* fprintf(stderr,"connected.\n"); */ |
/* fprintf(stderr,"connected.\n"); */ |
robj = newObjectArray(2); |
robj = newObjectArray(2); |
Line 153 struct object KsocketConnect(struct object obj) { |
|
Line 164 struct object KsocketConnect(struct object obj) { |
|
/* [ integer socketid ] |
/* [ integer socketid ] |
[ integer newsocketid ] */ |
[ integer newsocketid ] */ |
struct object KsocketAccept(struct object obj) { |
struct object KsocketAccept(struct object obj) { |
struct object obj1; |
struct object obj1 = OINIT; |
struct object obj2; |
struct object obj2 = OINIT; |
struct object robj; |
struct object robj = OINIT; |
int s, news; |
int s, news; |
|
|
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
Line 170 struct object KsocketAccept(struct object obj) { |
|
Line 181 struct object KsocketAccept(struct object obj) { |
|
} |
} |
s = KopInteger(obj1); |
s = KopInteger(obj1); |
if ((news = accept(s,NULL,NULL)) < 0) { |
if ((news = accept(s,NULL,NULL)) < 0) { |
errorMsg1s("Error in accept."); |
fprintf(stderr,"Error in accept. Retrying (KsocketAccept).\n"); |
|
/* Code added for strange behavior on cygwin. */ |
|
if ((news = accept(s,NULL,NULL)) < 0) { |
|
perror("accept"); errorMsg1s("Error in accept. Retry failed."); |
|
} |
} |
} |
if (close(s) < 0) { |
if (close(s) < 0) { |
errorMsg1s("Error in closing the old socket."); |
perror("close"); errorMsg1s("Error in closing the old socket."); |
} |
} |
robj = newObjectArray(1); |
robj = newObjectArray(1); |
putoa(robj,0,KpoInteger(news)); |
putoa(robj,0,KpoInteger(news)); |
return(robj); |
return(robj); |
} |
} |
|
|
|
/* [ integer socketid ] |
|
[ integer newsocketid ] */ |
|
/* It does not close the listening socket. You can call it as |
|
ls = open. |
|
fd=accept2(ls). close(fd). |
|
fd=accept2(ls). close(fd). |
|
.... |
|
*/ |
|
struct object KsocketAccept2(struct object obj) { |
|
struct object obj1 = OINIT; |
|
struct object obj2 = OINIT; |
|
struct object robj = OINIT; |
|
int s, news; |
|
|
|
if (obj.tag != Sarray) { |
|
errorMsg1s("KsocketAccept([integer socketid])"); |
|
} |
|
if (getoaSize(obj) < 1) { |
|
errorMsg1s("KsocketAccept([integer socketid])"); |
|
} |
|
obj1 = getoa(obj,0); |
|
if (obj1.tag != Sinteger ) { |
|
errorMsg1s("KsocketAccept([integer socketid]), argument must be integer."); |
|
} |
|
s = KopInteger(obj1); |
|
if ((news = accept(s,NULL,NULL)) < 0) { |
|
fprintf(stderr,"Error in accept. Retrying (KsocketAccept2).\n"); |
|
/* Code added for strange behavior on cygwin. */ |
|
if ((news = accept(s,NULL,NULL)) < 0) { |
|
perror("accept"); errorMsg1s("Error in accept. Retry failed."); |
|
} |
|
} |
|
if (close(s) < 0) { |
|
perror("close"); errorMsg1s("Error in closing the old socket."); |
|
} |
|
robj = newObjectArray(1); |
|
putoa(robj,0,KpoInteger(news)); |
|
return(robj); |
|
} |
|
|
int KsocketSelect0(int fd,int t) { |
int KsocketSelect0(int fd,int t) { |
fd_set readfds; |
fd_set readfds; |
struct timeval timeout; |
struct timeval timeout; |
extern int errno; |
|
FD_ZERO(&readfds); |
FD_ZERO(&readfds); |
FD_SET(fd,&readfds); |
FD_SET(fd,&readfds); |
timeout.tv_sec = 0; |
timeout.tv_sec = 0; |
Line 192 int KsocketSelect0(int fd,int t) { |
|
Line 246 int KsocketSelect0(int fd,int t) { |
|
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) { |
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) { |
/* It must be fd+1 !, Not fd. */ |
/* It must be fd+1 !, Not fd. */ |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
errorMsg1s("KsocketSelect0() : select failed."); |
perror("select"); errorMsg1s("KsocketSelect0() : select failed."); |
return(0); |
return(0); |
} |
} |
}else{ /* block */ |
}else{ /* block */ |
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL)<0) { |
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL)<0) { |
errorMsg1s("KsocketSelect0() : select failed."); |
perror("select"); errorMsg1s("KsocketSelect0() : select failed."); |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
return(0); |
return(0); |
} |
} |
Line 210 int KsocketSelect0(int fd,int t) { |
|
Line 264 int KsocketSelect0(int fd,int t) { |
|
integer true or false |
integer true or false |
*/ |
*/ |
struct object KsocketSelect(struct object obj) { |
struct object KsocketSelect(struct object obj) { |
struct object robj; |
struct object robj = OINIT; |
struct object ob1; |
struct object ob1 = OINIT; |
struct object ob2; |
struct object ob2 = OINIT; |
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
errorMsg1s("KsocketSelect([ integer socketid optional integer timeout default 0]"); |
errorMsg1s("KsocketSelect([ integer socketid optional integer timeout default 0]"); |
} |
} |
Line 237 struct object KsocketSelect(struct object obj) { |
|
Line 291 struct object KsocketSelect(struct object obj) { |
|
} |
} |
|
|
struct object KsocketSelectMulti(struct object obj) |
struct object KsocketSelectMulti(struct object obj) |
/* [ [integer socketid1, integer socketid2, ...] |
/* [ [integer socketid1, integer socketid2, ...] |
optional integer timeout default 0] |
optional integer timeout default 0] |
[ result1, result2, ....] |
[ result1, result2, ....] |
*/ |
*/ |
{ |
{ |
struct object robj; |
struct object robj = OINIT; |
struct object ob1; |
struct object ob1 = OINIT; |
struct object ob2; |
struct object ob2 = OINIT; |
struct object ob3; |
struct object ob3 = OINIT; |
int size,i,fd,p,t; |
int size,i,fd,p,t; |
fd_set readfds; |
fd_set readfds; |
struct timeval timeout; |
struct timeval timeout; |
extern errno; |
|
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
errorMsg1s("KsocketSelectMulti([[sid1, sid2,...] optional integer timeout default 0]"); |
errorMsg1s("KsocketSelectMulti([[sid1, sid2,...] optional integer timeout default 0]"); |
} |
} |
Line 294 struct object KsocketSelectMulti(struct object obj) |
|
Line 347 struct object KsocketSelectMulti(struct object obj) |
|
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) { |
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) { |
/* It must be fd+1 !, Not fd. */ |
/* It must be fd+1 !, Not fd. */ |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
errorMsg1s("KsocketSelectMulti() : select failed."); |
perror("select"); errorMsg1s("KsocketSelectMulti() : select failed."); |
} |
} |
}else{ /* block */ |
}else{ /* block */ |
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL)<0) { |
if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL)<0) { |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
fprintf(stderr,"Select error. Error no is %d. See /usr/include/sys/errno.h.\n",errno); |
errorMsg1s("KsocketSelectMulti() : (block) select failed."); |
perror("select"); errorMsg1s("KsocketSelectMulti() : (block) select failed."); |
} |
} |
} |
} |
robj = newObjectArray(size); |
robj = newObjectArray(size); |
Line 322 static char Data00[1024]; |
|
Line 375 static char Data00[1024]; |
|
string data |
string data |
*/ |
*/ |
struct object KsocketRead(struct object obj) { |
struct object KsocketRead(struct object obj) { |
struct object ob1; |
struct object ob1 = OINIT; |
struct object robj = NullObject; |
struct object robj = NullObject; |
static int datasize = 1024; |
static int datasize = 1024; |
static char *data = Data00; |
static char *data = Data00; |
Line 350 struct object KsocketRead(struct object obj) { |
|
Line 403 struct object KsocketRead(struct object obj) { |
|
if (datasize - totalsize > 0) { |
if (datasize - totalsize > 0) { |
n = read(socketid,data+totalsize,datasize-totalsize); |
n = read(socketid,data+totalsize,datasize-totalsize); |
if (n < 0) { |
if (n < 0) { |
errorMsg1s("Read error."); |
perror("read"); |
|
errorMsg1s("Read error."); |
} |
} |
if (n < datasize-totalsize) { |
if (n < datasize-totalsize) { |
totalsize += n; |
totalsize += n; |
break; |
break; |
}else{ totalsize += n; } |
}else{ totalsize += n; } |
if (totalsize == 0) { |
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 */ |
}else { /* increase the datasize */ |
tmp = (char *)GC_malloc(sizeof(char)*2*datasize); |
tmp = (char *)sGC_malloc(sizeof(char)*2*datasize); |
/*I should use GC_malloc_atomic and free after finishing this function?*/ |
/*I should use sGC_malloc_atomic and free after finishing this function?*/ |
if (tmp == (char *)NULL) errorMsg1s("Out of Memory."); |
if (tmp == (char *)NULL) errorMsg1s("Out of Memory."); |
bcopy(data,tmp,totalsize); |
bcopy(data,tmp,totalsize); |
data = tmp; |
data = tmp; |
Line 369 struct object KsocketRead(struct object obj) { |
|
Line 423 struct object KsocketRead(struct object obj) { |
|
} |
} |
} |
} |
|
|
r = (char *)GC_malloc(sizeof(char)*(n+1)); |
r = (char *)sGC_malloc(sizeof(char)*(totalsize+1)); |
if (r == (char *)NULL) errorMsg1s("Out of Memory."); |
if (r == (char *)NULL) errorMsg1s("Out of Memory."); |
bcopy(data,r,totalsize); |
bcopy(data,r,totalsize); |
robj = KpoString(r); |
r[totalsize] = 0; |
|
robj = KpoString(r); /* BUG: it works only for reading string from TCP/IP |
|
stream. */ |
|
|
return(robj); |
return(robj); |
|
|
Line 381 struct object KsocketRead(struct object obj) { |
|
Line 437 struct object KsocketRead(struct object obj) { |
|
/* [ integer socketid, string data ] |
/* [ integer socketid, string data ] |
integer */ |
integer */ |
struct object KsocketWrite(struct object obj) { |
struct object KsocketWrite(struct object obj) { |
struct object ob1; |
struct object ob1 = OINIT; |
struct object ob2; |
struct object ob2 = OINIT; |
int socketid; |
int socketid; |
int r; |
int r; |
|
int k,k0; |
|
char *s; |
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
errorMsg1s("KsocketWrite([integer socketid, string data])"); |
errorMsg1s("KsocketWrite([integer socketid, string data])"); |
} |
} |
Line 400 struct object KsocketWrite(struct object obj) { |
|
Line 458 struct object KsocketWrite(struct object obj) { |
|
if (ob2.tag != Sdollar) { |
if (ob2.tag != Sdollar) { |
errorMsg1s("KsocketWrite([integer socketid, string data]) : the second argument must be a string."); |
errorMsg1s("KsocketWrite([integer socketid, string data]) : the second argument must be a string."); |
} |
} |
r = write(socketid,KopString(ob2), strlen(KopString(ob2))); |
s = KopString(ob2); |
return(KpoInteger(r)); |
k0 = k = strlen(s); |
|
while (1) { |
|
r = write(socketid,s,k); |
|
if (r < 0) { |
|
perror("write"); errorMsg1s("KsocketWrite: write failed."); |
|
} |
|
if (r >= k) break; |
|
k -= r; |
|
s = &(s[r]); |
|
} |
|
return(KpoInteger(k0)); |
|
|
} |
} |
struct object KsocketClose(struct object obj) { |
struct object KsocketClose(struct object obj) { |
int socketid; |
int socketid; |
struct object ob1; |
struct object ob1 = OINIT; |
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
errorMsg1s("KsocketClose([ integer socketid ])"); |
errorMsg1s("KsocketClose([ integer socketid ])"); |
} |
} |
Line 433 struct object KsocketReadByte(struct object obj); |
|
Line 501 struct object KsocketReadByte(struct object obj); |
|
struct object KsocketWriteByte(struct object obj); |
struct object KsocketWriteByte(struct object obj); |
|
|
struct object KsocketReadByte(struct object obj) { |
struct object KsocketReadByte(struct object obj) { |
struct object ob1; |
struct object ob1 = OINIT; |
struct object robj = NullObject; |
struct object robj = NullObject; |
char data[2]; |
char data[2]; |
char *tmp; |
char *tmp; |
Line 457 struct object KsocketReadByte(struct object obj) { |
|
Line 525 struct object KsocketReadByte(struct object obj) { |
|
|
|
n = read(socketid,data,1); |
n = read(socketid,data,1); |
if (n < 0) { |
if (n < 0) { |
|
perror("read"); |
errorMsg1s("Read error."); |
errorMsg1s("Read error."); |
robj = KpoInteger(-1); |
robj = KpoInteger(-1); |
return(robj); |
return(robj); |
Line 473 struct object KsocketReadByte(struct object obj) { |
|
Line 542 struct object KsocketReadByte(struct object obj) { |
|
/* [ integer socketid, int ] |
/* [ integer socketid, int ] |
integer */ |
integer */ |
struct object KsocketWriteByte(struct object obj) { |
struct object KsocketWriteByte(struct object obj) { |
struct object ob1; |
struct object ob1 = OINIT; |
struct object ob2; |
struct object ob2 = OINIT; |
int socketid; |
int socketid; |
int r; |
int r,i,n,kk,r0; |
char data[2]; |
#define DATA_SIZE 1024 |
|
char data[DATA_SIZE]; |
if (obj.tag != Sarray) { |
if (obj.tag != Sarray) { |
errorMsg1s("KsocketWriteByte([integer socketid, int])"); |
errorMsg1s("KsocketWriteByte([integer socketid, int | array of int])"); |
} |
} |
if (getoaSize(obj) < 2) { |
if (getoaSize(obj) < 2) { |
errorMsg1s("KsocketWriteByte([integer socketid, int])"); |
errorMsg1s("KsocketWriteByte([integer socketid, int | array of int])"); |
} |
} |
ob1 = getoa(obj,0); |
ob1 = getoa(obj,0); |
ob2 = getoa(obj,1); |
ob2 = getoa(obj,1); |
if (ob1.tag != Sinteger) { |
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); |
socketid = KopInteger(ob1); |
if (ob2.tag != Sinteger) { |
if (ob2.tag != Sinteger && ob2.tag != Sarray) { |
errorMsg1s("KsocketWriteByte([integer socketid, int]) : the second argument must be a string."); |
errorMsg1s("KsocketWriteByte([integer socketid, int | array of int]) : the second argument must be an integer or an array of integers."); |
} |
} |
data[0] = KopInteger(ob2); |
if (ob2.tag == Sinteger) { |
r = write(socketid,data, 1); |
data[0] = KopInteger(ob2); |
|
r = write(socketid,data, 1); |
|
if (r < 0) { |
|
perror("write"); errorMsg1s("KsocketWriteByte: write error"); |
|
} |
|
}else{ |
|
n = getoaSize(ob2); kk = 0; r = 0; |
|
for (i=0; i<n; i++) { |
|
if (getoa(ob2,i).tag != Sinteger) |
|
errorMsg1s("KsocketWriteByte([integer socketid, int | array of int]) : elements of the second argument must be integers."); |
|
data[kk] = KopInteger(getoa(ob2,i)); |
|
kk++; |
|
if (kk >= DATA_SIZE) { |
|
r0 = write(socketid,data,kk); |
|
if (r0 < 0) { perror("write"); errorMsg1s("write failed."); } |
|
if (r0 != kk) { |
|
fprintf(stderr,"Warning: Could not write to the socket.\n"); |
|
return(KpoInteger(r+r0)); /* bug: we should retry. */ |
|
} |
|
r += r0; |
|
kk = 0; |
|
} |
|
} |
|
if (kk > 0) { |
|
r0 = write(socketid,data,kk); |
|
if (r0 < 0) { perror("write"); errorMsg1s("write failed."); } |
|
if (r0 != kk) { |
|
fprintf(stderr,"Warning: Could not write to the socket.\n"); |
|
return(KpoInteger(r+r0)); |
|
} |
|
r += r0; |
|
} |
|
} |
return(KpoInteger(r)); |
return(KpoInteger(r)); |
} |
} |
|
|
|
struct object KsocketReadHTTP(struct object socketObj) { |
|
/* Read until two empty line appears. */ |
|
struct object ob = OINIT; |
|
struct object ob1 = OINIT; |
|
struct object nob = OINIT; |
|
char *s; |
|
char *sss; |
|
char *tmp; |
|
int i; |
|
int flag; |
|
int flagmax = 1; |
|
int datasize; |
|
int last; |
|
int contentLength=-1; |
|
int socketid; |
|
extern int Post_debug; |
|
nob = NullObject; |
|
|
|
if (socketObj.tag != Sarray) { |
|
errorMsg1s("KsocketReadHTTP([integer socketid])"); |
|
} |
|
if (getoaSize(socketObj) < 1) { |
|
errorMsg1s("KsocketReadHTTP([integer socketid])"); |
|
} |
|
ob1 = getoa(socketObj,0); |
|
if (ob1.tag != Sinteger) { |
|
errorMsg1s("KsocketReadHTTP([integer socketid]) : the argument must be integer."); |
|
} |
|
socketid = KopInteger(ob1); |
|
|
|
if (KsocketSelect0(socketid,-1) != 1) { |
|
return(nob); |
|
} |
|
ob = KsocketRead(socketObj); |
|
s = KopString(ob); |
|
if (strncmp(s,"POST",4) == 0) flagmax=2; /* for IE */ |
|
else flagmax=1; |
|
flag = 0; |
|
for (i=strlen(s)-1; i>=0; i--) { |
|
if ((s[i] == '\n') && (i==0)) { |
|
++flag; |
|
}else if ((s[i] == '\n') && (s[i-1] == '\n')) { |
|
++flag; |
|
}else if ((s[i] == 0xd) && (s[i+1] == 0xa) && (i == 0)) { |
|
++flag; |
|
}else if ((s[i] == 0xa) && (s[i-1] == 0xd) && (s[i+1] == 0xd) && (s[i+2] == 0xa)) { |
|
++flag; |
|
} |
|
} |
|
if (flag >= flagmax) return ob; |
|
datasize = strlen(s); |
|
sss = s; |
|
if ((s[strlen(s)-1] == '\n') || |
|
(s[strlen(s)-2] == 0xd) && (s[strlen(s)-1] == 0xa)) { |
|
last = 1; |
|
}else last = 0; |
|
|
|
while (flag < flagmax) { |
|
contentLength = getContentLength(sss); |
|
if (contentLength != -1) { |
|
if (contentLength <= getReceivedContentLength(sss)) { |
|
break; |
|
} |
|
} |
|
if (Post_debug) { |
|
fprintf(stderr,"Waiting in socketReadBlock. flagmax(0d,0a)=%d, content-length=%d, received content-length=%d\n",flagmax,contentLength,getReceivedContentLength(sss)); |
|
} |
|
if (strlen(s) == 0) { |
|
fprintf(stderr,"No data. Perhaps connection is closed by foreign host.\n"); |
|
return nob; |
|
}else{ |
|
/* for debugging. */ |
|
if (Post_debug) { |
|
for (i=0; i<strlen(sss); i++) { |
|
if ((sss[i] >= ' ') && (sss[i] < 0x7f)) { |
|
fprintf(stderr,"%c",sss[i]); |
|
}else{ |
|
fprintf(stderr,"(%3x)",sss[i]); |
|
if (sss[i] == 0xa) fprintf(stderr,"\n"); |
|
} |
|
|
|
} |
|
fprintf(stderr,"\n"); |
|
} |
|
} |
|
|
|
if (KsocketSelect0(socketid,-1) != 1) { |
|
return nob; |
|
} |
|
ob = KsocketRead(socketObj); |
|
s = KopString(ob); |
|
for (i=strlen(s)-1; i>=0; i--) { |
|
if ((s[i] == '\n') && (i==0) && last) { |
|
++flag; |
|
}else if ((s[i] == '\n') && (s[i-1] == '\n')) { |
|
++flag; |
|
}else if ((s[i] == 0xd) && (s[i+1] == 0xa) && (i==0) && last) { |
|
++flag; |
|
}else if ((s[i] == 0xa) && (s[i-1] == 0xd) && (s[i+1] == 0xd) && (s[i+2] == 0xa)) { |
|
++flag; |
|
} |
|
} |
|
if (datasize-1 <= strlen(sss)+strlen(s)) { |
|
tmp = (char *)sGC_malloc(sizeof(char)*2*(datasize+strlen(s))+1); |
|
if (tmp == (char *)NULL) errorMsg1s("Out of Memory."); |
|
strcpy(tmp,sss); |
|
strcat(tmp,s); |
|
datasize = 2*(datasize+strlen(s)); |
|
sss = tmp; |
|
}else{ |
|
strcat(sss,s); |
|
} |
|
|
|
if ((s[strlen(s)-1] == '\n') || |
|
(s[strlen(s)-2] == 0xd) && (s[strlen(s)-1] == 0xa)) { |
|
last = 1; |
|
}else last = 0; |
|
|
|
} |
|
|
|
return KpoString(sss); |
|
|
|
} |
|
|
struct object Kplugin_sm1Socket(char *key,struct object obj) { |
struct object Kplugin_sm1Socket(char *key,struct object obj) { |
struct object robj = NullObject; |
struct object robj = NullObject; |
if (strcmp(key,"open") == 0) { |
if (strcmp(key,"open") == 0) { |
Line 506 struct object Kplugin_sm1Socket(char *key,struct objec |
|
Line 732 struct object Kplugin_sm1Socket(char *key,struct objec |
|
robj = KsocketConnect(obj); |
robj = KsocketConnect(obj); |
}else if (strcmp(key,"accept") == 0) { |
}else if (strcmp(key,"accept") == 0) { |
robj = KsocketAccept(obj); |
robj = KsocketAccept(obj); |
|
}else if (strcmp(key,"accept2") == 0) { |
|
robj = KsocketAccept2(obj); |
}else if (strcmp(key,"select") == 0) { |
}else if (strcmp(key,"select") == 0) { |
robj = KsocketSelect(obj); |
robj = KsocketSelect(obj); |
}else if (strcmp(key,"mselect") == 0) { |
}else if (strcmp(key,"mselect") == 0) { |
robj = KsocketSelectMulti(obj); |
robj = KsocketSelectMulti(obj); |
}else if (strcmp(key,"read") == 0) { |
}else if (strcmp(key,"read") == 0) { |
robj = KsocketRead(obj); |
robj = KsocketRead(obj); |
|
}else if (strcmp(key,"readHTTP") == 0) { |
|
robj = KsocketReadHTTP(obj); |
|
}else if (strcmp(key,"gethostname") == 0) { |
|
robj = KsocketGetHostName(); |
}else if (strcmp(key,"write") == 0) { |
}else if (strcmp(key,"write") == 0) { |
robj = KsocketWrite(obj); |
robj = KsocketWrite(obj); |
}else if (strcmp(key,"read") == 0) { |
}else if (strcmp(key,"read") == 0) { |
Line 529 struct object Kplugin_sm1Socket(char *key,struct objec |
|
Line 761 struct object Kplugin_sm1Socket(char *key,struct objec |
|
} |
} |
|
|
|
|
|
static int getContentLength(char *s) { |
|
int n; |
|
int i,j; |
|
int len = -1; |
|
char *s1 = "content-length:"; |
|
char s0[256]; |
|
int m; |
|
m = strlen(s1); |
|
n = strlen(s); |
|
for (i=0; i<n; i++) { |
|
strncpy(s0,&(s[i]),m+1); |
|
for (j=0; j<m; j++) { |
|
if ((s0[j] >= 'A') && (s0[j] <= 'Z')) s0[j] = s0[j]+0x20; |
|
} |
|
if (strncmp(s0,s1,strlen(s1)) == 0) { |
|
sscanf(&(s[i+strlen(s1)]),"%d",&len); |
|
break; |
|
} |
|
} |
|
return len; |
|
} |
|
static int getReceivedContentLength(char *s) { |
|
int n; |
|
int i; |
|
int start; |
|
start = -1; |
|
n = strlen(s); |
|
for (i=0; i<n; i++) { |
|
if ((s[i] == '\n') && (s[i+1] == '\n')) { |
|
start = i+2; break; |
|
}else if ((s[i] == 0xd) && (s[i+1] == 0xa) && (s[i+2] == 0xd) && (s[i+3] == 0xa)) { |
|
start = i+4; |
|
} |
|
} |
|
if (start == -1) return 0; |
|
return (n-start); |
|
} |
|
|
|
|
|
struct object KsocketGetHostName(void) { |
|
char name[1024]; |
|
char *s; |
|
struct object rob = NullObject; |
|
if (gethostname(name,1023) != 0) { |
|
return rob; |
|
} |
|
s = (char *)sGC_malloc(sizeof(char)*(strlen(name)+2)); |
|
if (s == (char *)NULL) errorMsg1s("Out of Memory."); |
|
strcpy(s,name); |
|
return(KpoString(s)); |
|
} |
|
|
|
|
|
|