version 1.10, 2002/10/22 00:53:51 |
version 1.13, 2002/10/24 02:12:35 |
|
|
/* $OpenXM: OpenXM/src/kan96xx/plugin/sm1Socket.c,v 1.9 2002/10/21 01:59:16 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kan96xx/plugin/sm1Socket.c,v 1.12 2002/10/24 01:29:00 takayama Exp $ */ |
/* msg0s.c */ |
/* msg0s.c */ |
#include <stdio.h> |
#include <stdio.h> |
#include <sys/types.h> |
#include <sys/types.h> |
Line 183 struct object KsocketAccept(struct object obj) { |
|
Line 183 struct object KsocketAccept(struct object obj) { |
|
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; |
|
struct object obj2; |
|
struct object robj; |
|
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) { |
|
errorMsg1s("Error in accept."); |
|
} |
|
if (close(s) < 0) { |
|
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; |
Line 534 struct object KsocketWriteByte(struct object obj) { |
|
Line 570 struct object KsocketWriteByte(struct object obj) { |
|
struct object KsocketReadHTTP(struct object socketObj) { |
struct object KsocketReadHTTP(struct object socketObj) { |
/* Read until two empty line appears. */ |
/* Read until two empty line appears. */ |
struct object ob; |
struct object ob; |
|
struct object ob1; |
|
struct object nob; |
char *s; |
char *s; |
char *sss; |
char *sss; |
char *tmp; |
char *tmp; |
Line 543 struct object KsocketReadHTTP(struct object socketObj) |
|
Line 581 struct object KsocketReadHTTP(struct object socketObj) |
|
int datasize; |
int datasize; |
int last; |
int last; |
int contentLength=-1; |
int contentLength=-1; |
|
int socketid; |
|
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); |
ob = KsocketRead(socketObj); |
s = KopString(ob); |
s = KopString(ob); |
if (strncmp(s,"POST",4) == 0) flagmax=2; /* for IE */ |
if (strncmp(s,"POST",4) == 0) flagmax=2; /* for IE */ |
Line 574 struct object KsocketReadHTTP(struct object socketObj) |
|
Line 630 struct object KsocketReadHTTP(struct object socketObj) |
|
break; |
break; |
} |
} |
} |
} |
fprintf(stderr,"Waiting in socketReadBlock (spin lock to wait an empty line). flagmax(0d,0a)=%d, content-length=%d, received content-length=%d\n",flagmax,contentLength,getReceivedContentLength(sss)); |
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,"but I'm not receiving data. Expecting a bug.\n"); |
if (strlen(s) == 0) { |
|
fprintf(stderr,"No data. Perhaps connection is closed by foreign host.\n"); |
|
return nob; |
}else{ |
}else{ |
/* for debugging. */ |
/* for debugging. */ |
for (i=0; i<strlen(sss); i++) { |
for (i=0; i<strlen(sss); i++) { |
Line 589 struct object KsocketReadHTTP(struct object socketObj) |
|
Line 647 struct object KsocketReadHTTP(struct object socketObj) |
|
} |
} |
fprintf(stderr,"\n"); |
fprintf(stderr,"\n"); |
} |
} |
sleep(2); |
|
|
if (KsocketSelect0(socketid,-1) != 1) { |
|
return nob; |
|
} |
ob = KsocketRead(socketObj); |
ob = KsocketRead(socketObj); |
s = KopString(ob); |
s = KopString(ob); |
for (i=strlen(s)-1; i>=0; i--) { |
for (i=strlen(s)-1; i>=0; i--) { |
Line 633 struct object Kplugin_sm1Socket(char *key,struct objec |
|
Line 694 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) { |
Line 641 struct object Kplugin_sm1Socket(char *key,struct objec |
|
Line 704 struct object Kplugin_sm1Socket(char *key,struct objec |
|
robj = KsocketRead(obj); |
robj = KsocketRead(obj); |
}else if (strcmp(key,"readHTTP") == 0) { |
}else if (strcmp(key,"readHTTP") == 0) { |
robj = KsocketReadHTTP(obj); |
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 697 static int getReceivedContentLength(char *s) { |
|
Line 762 static int getReceivedContentLength(char *s) { |
|
} |
} |
|
|
|
|
|
struct object KsocketGetHostName(void) { |
|
char name[1024]; |
|
char *s; |
|
struct object rob = NullObject; |
|
if (gethostname(name,1023) != 0) { |
|
return rob; |
|
} |
|
s = (char *)GC_malloc(sizeof(char)*(strlen(name)+2)); |
|
if (s == (char *)NULL) errorMsg1s("Out of Memory."); |
|
strcpy(s,name); |
|
return(KpoString(s)); |
|
} |
|
|
|
|
|
|