2 #include "structdefs.h"
3 #include <sys/socket.h>
9 #include "SimpleHash.h"
10 #include "GenericHashtable.h"
12 extern struct RuntimeHash *fdtoobject;
14 int CALL23(___Socket______nativeConnect____I__AR_B_I, int ___fd___, int ___port___, int ___fd___, struct ArrayObject * ___address___ ,int ___port___) {
15 struct sockaddr_in sin;
18 bzero(&sin, sizeof(sin));
19 sin.sin_family= AF_INET;
20 sin.sin_port=htons(___port___);
21 sin.sin_addr.s_addr=htonl(*(((char *)&VAR(___address___)->___length___)+sizeof(int)));
23 rc = connect(___fd___, (struct sockaddr *) &sin, sizeof(sin));
24 } while (rc<0 && errno==EINTR); /* repeat if interrupted */
35 int CALL12(___Socket______nativeBind_____AR_B_I, int ___port___, struct ArrayObject * ___address___, int ___port___) {
39 struct sockaddr_in sin;
40 bzero(&sin, sizeof(sin));
41 sin.sin_family= AF_INET;
42 sin.sin_port=htons(___port___);
43 sin.sin_addr.s_addr=htonl(*(((char *) &VAR(___address___)->___length___)+sizeof(int)));
45 fd=socket(AF_INET, SOCK_STREAM, 0);
49 printf("createSocket error in nativeBind\n");
52 longjmp(error_handler,12);
64 fcntl(fd, F_SETFD, 1);
65 fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK);
68 rc = bind(fd, (struct sockaddr *) &sin, sizeof(sin));
71 sa_size = sizeof(sin);
72 rc = getsockname(fd, (struct sockaddr *) &sin, &sa_size);
81 printf("createSocket error #2 in nativeBind\n");
84 longjmp(error_handler,13);
94 struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct ___ArrayObject___ * ___hostname___) {
95 int length=VAR(___hostname___)->___length___;
97 char * str=malloc(length+1);
99 struct ArrayObject * arraybytearray;
101 for(i=0;i<length;i++) {
102 str[i]=(((char *)&VAR(___hostname___)->___length___)+sizeof(int))[i];
105 h=gethostbyname(str);
108 for (n=0; h->h_addr_list[n]; n++) /* do nothing */ ;
111 arraybytearray=allocate_newarray(___params___,BYTEARRAYARRAYTYPE,n);
113 arraybytearray=allocate_newarray(BYTEARRAYARRAYTYPE,n);
116 struct ArrayObject *bytearray;
119 int ptrarray[]={1, (int) ___params___, (int)arraybytearray};
120 bytearray=allocate_newarray(&ptrarray,BYTEARRAYTYPE,h->h_length);
121 arraybytearray=(struct ArrayObject *) ptrarray[2];
124 bytearray=allocate_newarray(BYTEARRAYTYPE,h->h_length);
126 ((void **)&((&arraybytearray->___length___)[1]))[i]=bytearray;
127 for(j=0;j<h->h_length;j++) {
128 ((char *)&((&bytearray->___length___)[1]))[j]=h->h_addr_list[i][j];
132 return arraybytearray;
136 int CALL12(___ServerSocket______createSocket____I, int port, struct ___ServerSocket___ * ___this___, int port) {
140 struct sockaddr_in sin;
142 bzero(&sin, sizeof(sin));
143 sin.sin_family = AF_INET;
144 sin.sin_port = htons (port);
145 sin.sin_addr.s_addr = htonl (INADDR_ANY);
146 fd=socket(AF_INET, SOCK_STREAM, 0);
150 printf("createSocket error #1\n");
153 longjmp(error_handler,5);
163 if (setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *)&n, sizeof (n)) < 0) {
167 printf("createSocket error #2\n");
170 longjmp(error_handler,6);
181 fcntl(fd, F_SETFD, 1);
182 fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK);
186 if (bind(fd, (struct sockaddr *) &sin, sizeof(sin))<0) {
190 printf("createSocket error #3\n");
193 longjmp(error_handler,7);
204 if (listen(fd, 5)<0) {
208 printf("createSocket error #4\n");
211 longjmp(error_handler,8);
221 /* Store the fd/socket object mapping */
223 RuntimeHashadd(fdtoobject, fd, (int) VAR(___this___));
229 int CALL02(___ServerSocket______nativeaccept____L___Socket___,struct ___ServerSocket___ * ___this___, struct ___Socket___ * ___s___) {
230 struct sockaddr_in sin;
231 unsigned int sinlen=sizeof(sin);
232 int fd=VAR(___this___)->___fd___;
236 struct listitem *tmp=stopforgc((struct garbagelist *)___params___);
239 newfd=accept(fd, (struct sockaddr *)&sin, &sinlen);
248 printf("acceptSocket error #1\n");
251 longjmp(error_handler,9);
261 fcntl(newfd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK);
262 RuntimeHashadd(fdtoobject, newfd, (int) VAR(___s___));
264 flagorand(VAR(___this___),0,0xFFFFFFFE);
269 void CALL02(___Socket______nativeWrite_____AR_B, struct ___Socket___ * ___this___, struct ArrayObject * ___b___) {
270 int fd=VAR(___this___)->___fd___;
271 int length=VAR(___b___)->___length___;
272 char * charstr=((char *)& VAR(___b___)->___length___)+sizeof(int);
274 int bytewritten=write(fd, charstr, length);
275 if (bytewritten==-1&&errno==EAGAIN)
278 if (bytewritten!=length) {
279 perror("ERROR IN NATIVEWRITE");
285 int CALL02(___Socket______nativeRead_____AR_B, struct ___Socket___ * ___this___, struct ArrayObject * ___b___) {
286 int fd=VAR(___this___)->___fd___;
287 int length=VAR(___b___)->___length___;
289 char * charstr=malloc(length);
293 struct listitem *tmp=stopforgc((struct garbagelist *)___params___);
296 int byteread=read(fd, charstr, length);
305 for(i=0;i<byteread;i++) {
306 (((char *)& VAR(___b___)->___length___)+sizeof(int))[i]=charstr[i];
313 printf("ERROR IN NATIVEREAD\n");
317 flagorand(VAR(___this___),0,0xFFFFFFFE);
322 void CALL01(___Socket______nativeClose____, struct ___Socket___ * ___this___) {
323 int fd=VAR(___this___)->___fd___;
326 RuntimeHashget(fdtoobject, fd, &data);
327 RuntimeHashremove(fdtoobject, fd, data);
329 flagorand(VAR(___this___),0,0xFFFFFFFE);