/* * Port of TSX Tinyscheme socket extensions for fortran */ #include #include #include #include #include #include #include #include /* #include */ #include #include #include #include /* * Critical for fortranmakeserversocket */ #include #ifdef __linux__ #include #endif #ifdef __sun__ #include #endif /* * utility function from posixwrapper.c */ char *appendtostring(char *str,int len) { char *res; /* C arrays are from 0:len-1 */ if((res=(char*)malloc(len+1))) { strncpy(res,str,len); res[len]='\0'; } return res; } /* * * open a socket, bind and listen * */ void fortranmakeserversocket_(int *portreq, int *stat, int *portnum) { struct sockaddr_in address; long port; int one = 1; int sock; *stat = -1; *portnum=-1; port = (long) (*portreq); sock = socket(PF_INET, SOCK_STREAM, 0); if(-1==sock) { return; } setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); address.sin_family = AF_INET; address.sin_port = htons(port); memset(&address.sin_addr, 0, sizeof(address.sin_addr)); if(bind(sock, (struct sockaddr *) &address, sizeof(address))) { *stat=-2; return; } if(listen(sock, 1)) { *stat=-3; return; } *stat = 0; *portnum=sock; } void fortranclosesocket_(int *portnum, int *stat) { int sock; int retcode; *stat=-1; sock = *portnum; *stat = close(sock); } /* * * gethostbyname wrapper * */ void fortrangethostbyname_(char *query, int *querylen, int *stat, char *hostnm, int *lenstr, int *q1, int *q2, int *q3, int *q4) { char *qstr="gethostbyname(query)"; char *hostname="gethostbyname(hostnm)"; struct hostent *host; *stat=-1; qstr= appendtostring(query, *querylen); if((host=gethostbyname(qstr))==NULL) { perror("Failed in gethostbyname"); exit(1); } hostname=host->h_name; *lenstr=strlen(hostname); strncpy(hostnm, hostname, *lenstr); printf("h_name: %s\n", host->h_name); printf("h_aliases: %s\n", *host->h_aliases); printf("h_addrtype: %d\n", host->h_addrtype); printf("h_length: %d\n", host->h_length); *q1=(int) (*host->h_addr_list[0]); *q2=(int) (*(host->h_addr_list[0]+1)); *q3=(int) (*(host->h_addr_list[0]+2)); *q4=(int) (*(host->h_addr_list[0]+3)); *stat=0; } /* * accept */ void fortranaccept_(int *portnum, int *connection, int *stat) { int sock; struct sockaddr_in addr; socklen_t addr_len = sizeof(struct sockaddr_in); int retcode; *stat=-1; sock=*portnum; retcode = accept(sock, (struct sockaddr *)&addr, &addr_len); if (-1 != retcode) { *stat=0; *connection = retcode; } } /* * send */ void fortransend_(int *connection, char *ostring, int *ostringlen, int *stat) { int sock; char * buf; int retcode; sock = *connection; buf = appendtostring(ostring, *ostringlen); *stat = send(sock, buf, strlen(buf), 0); } /* * buffered receive */ void fortranreceive_(int *connection, char *istring, int *istringlen, int *stat) { int sock; int lenreceived; char buf[5000]; *stat = -1; sock = *connection; lenreceived = recv(sock, buf, sizeof(buf) - 1, 0); if (-1 == lenreceived) { return; } *stat=0; buf[lenreceived] = 0; strncpy(istring, buf, lenreceived); *istringlen=lenreceived; }