/* * Copyright © 2001 Novell, Inc. All Rights Reserved. * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * */ /* * FILENAME : nw5sck.c * DESCRIPTION : Socket related functions. * Author : SGP * Date : January 2001. * Date Modified: June 26th 2001. */ #include "EXTERN.h" #include "perl.h" #include "nw5iop.h" #include "nw5sck.h" #include #include // This is defined here since arpa\inet.h defines this array as an extern, // and arpa\inet.h gets included by the inet_ntoa call. char nwinet_scratch[18] = {'\0'}; u_long nw_htonl(u_long hostlong) { return htonl(hostlong); } u_short nw_htons(u_short hostshort) { return htons(hostshort); } u_long nw_ntohl(u_long netlong) { return ntohl(netlong); } u_short nw_ntohs(u_short netshort) { return ntohs(netshort); } SOCKET nw_accept(SOCKET s, struct sockaddr *addr, int *addrlen) { return ((SOCKET)(accept(s, addr, addrlen))); } int nw_bind(SOCKET s, const struct sockaddr *addr, int addrlen) { return ((int)bind(s, (struct sockaddr *)addr, addrlen)); } int nw_connect(SOCKET s, const struct sockaddr *addr, int addrlen) { return((int)connect(s, (struct sockaddr *)addr, addrlen)); } void nw_endhostent() { endhostent(); } void nw_endnetent() { endnetent(); } void nw_endprotoent() { endprotoent(); } void nw_endservent() { endservent(); } struct hostent * nw_gethostent() { return(gethostent()); } struct netent * nw_getnetent(void) { return ((struct netent *) getnetent()); } struct protoent * nw_getprotoent(void) { return ((struct protoent *) getprotoent()); } struct hostent * nw_gethostbyname(const char *name) { return(gethostbyname((char*)name)); } int nw_gethostname(char *name, int len) { return(gethostname(name, len)); } struct hostent * nw_gethostbyaddr(const char *addr, int len, int type) { return(gethostbyaddr((char*)addr, len, type)); } struct netent * nw_getnetbyaddr(long net, int type) { return(getnetbyaddr(net,type)); } struct netent * nw_getnetbyname(char *name) { return (struct netent *)getnetbyname(name); } int nw_getpeername(SOCKET s, struct sockaddr *addr, int *addrlen) { return((int)getpeername(s, addr, addrlen)); } struct protoent * nw_getprotobyname(const char *name) { return ((struct protoent *)getprotobyname((char*)name)); } struct protoent * nw_getprotobynumber(int num) { return ((struct protoent *)getprotobynumber(num)); } struct servent * nw_getservbyname(const char *name, const char *proto) { return (struct servent *)getservbyname((char*)name, (char*)proto); } struct servent * nw_getservbyport(int port, const char *proto) { return (struct servent *)getservbyport(port, (char*)proto); } struct servent * nw_getservent(void) { return (struct servent *) getservent(); } void nw_sethostent(int stayopen) { #ifdef HAS_SETHOSTENT sethostent(stayopen); #endif } void nw_setnetent(int stayopen) { #ifdef HAS_SETNETENT setnetent(stayopen); #endif } void nw_setprotoent(int stayopen) { #ifdef HAS_SETPROTENT setprotoent(stayopen); #endif } void nw_setservent(int stayopen) { #ifdef HAS_SETSERVENT setservent(stayopen); #endif } int nw_setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen) { return setsockopt(s, level, optname, (char*)optval, optlen); } int nw_getsockname(SOCKET s, struct sockaddr *addr, int *addrlen) { return getsockname(s, addr, addrlen); } int nw_getsockopt(SOCKET s, int level, int optname, char *optval, int *optlen) { return ((int)getsockopt(s, level, optname, optval, optlen)); } unsigned long nw_inet_addr(const char *cp) { return inet_addr((char*)cp); } char * nw_inet_ntoa(struct in_addr in) { return inet_ntoa(in); } SOCKET nw_socket(int af, int type, int protocol) { SOCKET s; #ifndef USE_SOCKETS_AS_HANDLES s = socket(af, type, protocol); #else if((s = socket(af, type, protocol)) == INVALID_SOCKET) //errno = WSAGetLastError(); else s = s; #endif /* USE_SOCKETS_AS_HANDLES */ return s; } int nw_listen(SOCKET s, int backlog) { return(listen(s, backlog)); } int nw_send(SOCKET s, const char *buf, int len, int flags) { return(send(s,(char*)buf,len,flags)); } int nw_recv(SOCKET s, char *buf, int len, int flags) { return (recv(s, buf, len, flags)); } int nw_sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen) { return(sendto(s, (char*)buf, len, flags, (struct sockaddr *)to, tolen)); } int nw_recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen) { int r; int frombufsize = *fromlen; r = recvfrom(s, buf, len, flags, from, fromlen); //Not sure if the is required - chksgp if (r && frombufsize == *fromlen) (void)nw_getpeername(s, from, fromlen); return r; } int nw_select(int nfds, fd_set* rd, fd_set* wr, fd_set* ex, const struct timeval* timeout) { return(select(nfds, rd, wr, ex, (struct timeval*)timeout)); } int nw_shutdown(SOCKET s, int how) { return (shutdown(s, how)); }