60 #include <sys/types.h>
65 #include <netinet/in.h>
66 #include <arpa/inet.h>
69 #define _BSD_SOCKLEN_T_
71 #include <sys/socket.h>
72 #include <sys/ioctl.h>
76 #if defined( HAVE_SYS_SELECT_H )
77 #include <sys/select.h>
79 #if defined( HAVE_SYS_FILIO_H )
80 #include <sys/filio.h>
84 #define psock_errno(s) fprintf(stderr, "RxSOCK Error: %s\n", s)
87 #define sock_errno() WSAGetLastError()
89 #define sock_errno() errno
142 RexxRoutine2(
int, SockAccept,
int, sock, OPTIONAL_RexxObjectPtr, stemSource)
147 nameLen =
sizeof(addr);
148 int rc = accept(sock, (
struct sockaddr *)&addr, &nameLen);
196 int rc = bind(sock, (
struct sockaddr *)&addr,
sizeof(addr));
215 int rc = closesocket(sock);
217 int rc = close(sock);
250 int rc = connect(sock,(
struct sockaddr *)&addr,
sizeof(addr));
265 struct hostent *pHostEnt;
275 addr.s_addr = inet_addr(addrArg);
285 pHostEnt = gethostbyaddr((
char*)&addr,
sizeof(addr), domain);
314 struct hostent *pHostEnt;
319 pHostEnt = gethostbyname(name);
350 if (gethostname(pszBuff,
sizeof(pszBuff)))
354 return context->String(
"0.0.0.0");
356 pHostEnt = gethostbyname(pszBuff);
361 return context->String(
"0.0.0.0");
363 ia.s_addr = (*(
uint32_t *)pHostEnt->h_addr);
364 return context->String(inet_ntoa(ia));
366 #if defined(OPSYS_AIX) || defined(OPSYS_LINUX)
367 #define h_addr h_addr_list[0]
370 struct hostent * pHostEnt;
373 if (gethostname(pszBuff,
sizeof(pszBuff)))
377 return context->String(
"0.0.0.0");
379 pHostEnt = gethostbyname(pszBuff);
384 return context->String(
"0.0.0.0");
386 ia.s_addr = (*(
uint32_t *)pHostEnt->h_addr);
387 return context->String(inet_ntoa(ia));
389 ia.s_addr = htonl(gethostid());
392 return context->String(inet_ntoa(ia));
412 int rc = gethostname(pszBuff,
sizeof(pszBuff));
417 return context->String(pszBuff);
440 nameLen =
sizeof(addr);
441 int rc = getpeername(sock,(
struct sockaddr *)&addr,&nameLen);
477 nameLen =
sizeof(addr);
478 int rc = getsockname(sock,(
struct sockaddr *)&addr,&nameLen);
501 struct linger lingStruct;
509 context->InvalidRoutine();
527 len =
sizeof(lingStruct);
538 int rc = getsockopt(sock,SOL_SOCKET,opt,(
char *)ptr,&len);
549 sprintf(buffer,
"%d %d", lingStruct.l_onoff, lingStruct.l_linger);
555 case SOCK_STREAM: strcpy(buffer,
"STREAM");
break;
556 case SOCK_DGRAM: strcpy(buffer,
"DGRAM");
break;
557 case SOCK_RAW: strcpy(buffer,
"RAW");
break;
558 default: strcpy(buffer,
"UNKNOWN");
563 sprintf(buffer,
"%d", intVal);
567 context->SetContextVariable(var, context->String(buffer));
590 if (!context->Int32(var, &temp))
592 context->InvalidRoutine();
595 dataBuff = (int)temp;
603 len =
sizeof(dataBuff);
614 rc = ioctlsocket(sock,cmd,(u_long *)data);
616 rc = ioctl(sock,cmd,data,len);
627 context->SetContextVariable(context->ObjectToStringValue(var), context->Int32(dataBuff));
644 int rc = listen(sock, backlog);
669 char *flagStr = strdup(flagVal);
672 context->InvalidRoutine();
675 const char *pszWord = strtok(flagStr,
" ");
680 pszWord = strtok(NULL,
" ");
688 pBuffer = (
char *)malloc(dataLen);
691 context->InvalidRoutine();
698 rc = recv(sock, pBuffer, dataLen, flags);
712 context->SetContextVariable(var, context->String(pBuffer, dataLen));
729 RexxRoutine5(
int, SockRecvFrom,
int, sock,
CSTRING, var,
int, dataLen,
RexxObjectPtr, flagArg, OPTIONAL_RexxObjectPtr, stemSource)
741 if (stemSource != NULL)
748 char *flagStr = strdup(context->ObjectToStringValue(flagArg));
750 const char *pszWord = strtok(flagStr,
" ");
761 pszWord = strtok(NULL,
" ");
775 addr_size=
sizeof(addr);
780 char *pBuffer = (
char *)malloc(dataLen);
783 context->InvalidRoutine();
790 int rc = recvfrom(sock,pBuffer,dataLen,flags,(
struct sockaddr *)&addr,&addr_size);
806 context->SetContextVariable(var, context->String(pBuffer, dataLen));
823 RexxRoutine4(
int, SockSelect, OPTIONAL_RexxObjectPtr, array1, OPTIONAL_RexxObjectPtr, array2, OPTIONAL_RexxObjectPtr, array3, OPTIONAL_int, timeout)
825 struct timeval timeOutS;
826 struct timeval *timeOutP;
836 #if defined(OPSYS_LINUX)
837 fd_set rSetS, *rSet = &rSetS;
838 fd_set wSetS, *wSet = &wSetS;
839 fd_set eSetS, *eSet = &eSetS;
841 struct fd_set rSetS, *rSet = &rSetS;
842 struct fd_set wSetS, *wSet = &wSetS;
843 struct fd_set eSetS, *eSet = &eSetS;
861 timeOutS.tv_sec = timeout;
862 timeOutS.tv_usec = 0;
863 timeOutP = &timeOutS;
883 for (i=0; i<rCount; i++)
885 FD_SET(rArray[i],rSet);
887 for (i=0; i<wCount; i++)
889 FD_SET(wArray[i],wSet);
891 for (i=0; i<eCount; i++)
893 FD_SET(eArray[i],eSet);
900 for (i=0; i<rCount; i++)
908 for (i=0; i<wCount; i++)
916 for (i=0; i<eCount; i++)
927 rc = select(max+1,rSet,wSet,eSet,timeOutP);
938 for (i=0; i<rCount; i++)
940 if (FD_ISSET(rArray[i],rSet))
942 rArray[j] = rArray[i];
949 for (i=0; i<wCount; i++)
951 if (FD_ISSET(wArray[i],wSet))
953 wArray[j] = wArray[i];
960 for (i=0; i<eCount; i++)
962 if (FD_ISSET(eArray[i],eSet))
964 eArray[j] = eArray[i];
1021 size_t dataLen = context->StringLength(dataObj);
1022 const char *data = context->StringData(dataObj);
1028 if (flagArg != NULL)
1030 char *flagStr = strdup(flagArg);
1031 if (flagStr == NULL)
1033 context->InvalidRoutine();
1037 const char *pszWord = strtok(flagStr,
" ");
1046 flags |= MSG_DONTROUTE;
1049 pszWord = strtok(NULL,
" ");
1057 int rc = send(sock,data,dataLen,flags);
1083 int dataLen = context->StringLength(dataObj);
1084 const char *data = context->StringData(dataObj);
1097 char *flagStr = strdup(context->ObjectToStringValue(flagsOrStem));
1098 if (flagStr == NULL)
1100 context->InvalidRoutine();
1104 const char *pszWord = strtok(flagStr,
" ");
1109 flags |= MSG_DONTROUTE;
1111 pszWord = strtok(NULL,
" ");
1128 int rc = sendto(sock,data,dataLen,flags,(
struct sockaddr *)&addr,
sizeof(addr));
1146 struct linger lingStruct;
1156 context->InvalidRoutine();
1173 sscanf(arg,
"%d", &intVal);
1178 len =
sizeof(lingStruct);
1180 sscanf(arg,
"%d %d", &intVal,&intVal2);
1181 lingStruct.l_onoff = (u_short)intVal;
1182 lingStruct.l_linger = (u_short)intVal2;
1189 len =
sizeof(lenVal);
1191 sscanf(arg,
"%d", &lenVal);
1202 int rc = setsockopt(sock,SOL_SOCKET,opt,(
const char *)ptr,len);
1224 int rc = shutdown(sock, how);
1244 WORD wVersionRequested;
1246 wVersionRequested = MAKEWORD( 1, 1 );
1247 int rc = WSAStartup( wVersionRequested, &wsaData );
1278 pszDomain = strdup(domainArg);
1279 pszType = strdup(typeArg);
1280 pszProtocol = strdup(protocolArg);
1292 context->InvalidRoutine();
1301 context->InvalidRoutine();
1306 protocol = IPPROTO_UDP;
1308 protocol = IPPROTO_TCP;
1313 context->InvalidRoutine();
1320 int rc = socket(domain,
type,protocol);
1342 int rc = closesocket(sock);
1344 int rc = close(sock);
bool resolveStem(RexxObjectPtr source)
#define argumentOmitted(i)
struct _RexxStringObject * RexxStringObject
struct _RexxObjectPtr * RexxObjectPtr
void intArrayToStem(RexxCallContext *context, RexxObjectPtr stem, int count, int *arr)
void stemToIntArray(RexxCallContext *context, RexxObjectPtr stem, int &count, int *&arr)
struct sockaddr_in sockaddr_in
int stringToSockOpt(const char *pszOptName)
void stemToSockAddr(RexxCallContext *context, StemManager &stem, sockaddr_in *pSockAddr)
void hostEntToStem(RexxCallContext *context, struct hostent *pHostEnt, StemManager &stem)
void sockAddrToStem(RexxCallContext *context, sockaddr_in *pSockAddr, StemManager &stem)
int caselessCompare(const char *op1, const char *op2)
void cleanup(RexxCallContext *context)
void stripBlanks(char *string)
RexxRoutine0(int, SockSock_Errno)
RexxRoutine2(int, SockAccept, int, sock, OPTIONAL_RexxObjectPtr, stemSource)
RexxRoutine4(int, SockGetSockOpt, int, sock, CSTRING, level, CSTRING, option, CSTRING, var)
RexxRoutine5(int, SockRecvFrom, int, sock, CSTRING, var, int, dataLen, RexxObjectPtr, flagArg, OPTIONAL_RexxObjectPtr, stemSource)
RexxRoutine1(CSTRING, SockPSock_Errno, OPTIONAL_CSTRING, type)
RexxRoutine3(int, SockGetHostByAddr, CSTRING, addrArg, RexxObjectPtr, stemSource, OPTIONAL_int, domain)