50#define basocklen_t socklen_t
54#define SocketHandle int
58#define socketAccept accept
62#define socketBind bind
66#define socketClose close
70#define socketShutdown shutdown
74#define socketErrno(s) errno
79#define socketIoctl ioctl
82#ifndef socketGetPeerName
83#define socketGetPeerName getpeername
86#ifndef socketGetSockName
87#define socketGetSockName getsockname
91#define socketListen listen
95#define socketRecv recv
99#define socketSelect select
103#define socketSend send
107#define socketSendto sendto
110#ifndef socketRecvfrom
111#define socketRecvfrom recvfrom
114#ifndef socketGetsockopt
115#define socketGetsockopt getsockopt
118#ifndef socketSetsockopt
119#define socketSetsockopt setsockopt
123#define socketSocket socket
126#ifndef socketInetAddr
127#define socketInetAddr inet_addr
130#ifndef socketInetPton
131#define socketInetPton inet_pton
134#ifndef socketGethostbyname
135#define socketGethostbyname gethostbyname
138#ifndef socketInetNtoa
139#define socketInetNtoa inet_ntoa
142#ifndef socketWouldBlock
143#define socketWouldBlock(s) (EWOULDBLOCK == socketErrno(s))
146#ifndef socketInProgress
148#define socketInProgress(s) (EINPROGRESS == socketErrno(s))
150#define socketInProgress(s) 0
155#define socketConnect connect
158#ifndef BaSockAddrStorage
159#define BaSockAddrStorage struct sockaddr_storage
165#ifndef HttpSocket_setcloexec
166#define HttpSocket_setcloexec(x)
168#ifndef HttpSocket_clearcloexec
169#define HttpSocket_clearcloexec(x)
172#define basocketpair(x)
180#ifndef HttpSocket_accept
181#define HttpSocket_accept(o, conSock, status) do { \
182 (conSock)->hndl=socketAccept((o)->hndl, NULL, NULL); \
183 *(status) = (HttpSocket_isValid(conSock)) ? 0 : -1; \
184 HttpSocket_setcloexec(o); \
189#ifndef HttpSocket_bind
190#define HttpSocket_bindIp4(o, sockAddr, port, status) do { \
191 struct sockaddr_in in; \
192 memset(&in, 0, sizeof(struct sockaddr_in)); \
193 in.sin_family = AF_INET; \
194 in.sin_port = baHtons(port); \
195 memcpy(&in.sin_addr.s_addr,(sockAddr)->addr, 4); \
196 *(status) = socketBind((o)->hndl, (struct sockaddr *)&in, \
197 sizeof(struct sockaddr_in)); \
200#define HttpSocket_bindIp6(o, sockAddr, port, status) do { \
201 struct sockaddr_in6 in6; \
202 memset(&in6, 0, sizeof(struct sockaddr_in6)); \
203 in6.sin6_family = AF_INET6; \
204 in6.sin6_port = baHtons(port); \
205 memcpy(&in6.sin6_addr, (sockAddr)->addr, 16); \
206 *(status) = socketBind((o)->hndl, (struct sockaddr*)&in6, \
207 sizeof(struct sockaddr_in6)); \
210#define HttpSocket_bindIp6(o, sockAddr, port, status) *status=-1
212#define HttpSocket_bind(o, sockAddr, port, status) do { \
213 if((sockAddr)->isIp6) \
214 HttpSocket_bindIp6(o, sockAddr, port, status); \
216 HttpSocket_bindIp4(o, sockAddr, port, status); \
220#ifndef HttpSocket_close
221#define HttpSocket_close(o) do {\
223 HttpSocket_setNonblocking(o,&status);\
225 socketClose((o)->hndl);\
226 HttpSocket_invalidate(o);\
232#ifndef HttpSocket_hardClose
233#define HttpSocket_hardClose(o) do {\
235 l.l_onoff = 1; l.l_linger = 0;\
236 socketSetsockopt((o)->hndl,SOL_SOCKET,SO_LINGER, \
237 (char*)&l,sizeof(struct linger)); \
238 socketClose((o)->hndl);\
239 HttpSocket_invalidate(o);\
245#ifndef HttpSocket_shutdown
246#define HttpSocket_shutdown(o) do {\
248 HttpSocket_setBlocking(o,&status);\
250 socketShutdown((o)->hndl,2);\
251 socketClose((o)->hndl);\
252 HttpSocket_invalidate(o);\
257#ifndef HttpSocket_constructor
258#define HttpSocket_constructor(o) do { \
259 memset(o, 0, sizeof(HttpSocket)); \
260 HttpSocket_invalidate(o); \
264#ifndef HttpSocket_errno
265#define HttpSocket_errno(o, status, ecode) (void)status,*(ecode) = socketErrno((o)->hndl)
268#ifndef HttpSocket_getId
269#define HttpSocket_getId(o) (int)(o)->hndl
272#ifndef HttpSocket_getPeerName
274#define HttpSocket_getPeerName(o, addrMA, port, isIp6MA, status) do {\
275 BaSockAddrStorage a;\
276 basocklen_t aLen = sizeof(a);\
277 if( !(*(status) = socketGetPeerName((o)->hndl, (struct sockaddr *)&a, &aLen)) )\
280 memcpy(&(addrMA)->addr, &((struct sockaddr_in6*)&a)->sin6_addr, 16);\
281 if(port) *(port)=baHtons(((struct sockaddr_in6*)&a)->sin6_port);\
284 *((U32*)(addrMA)->addr) = ((struct sockaddr_in*)&a)->sin_addr.s_addr;\
285 if(port) *(port)=baHtons(((struct sockaddr_in*)&a)->sin_port);\
287 (addrMA)->isIp6=isIp6MA; \
291#define HttpSocket_getPeerName(o, sockAddr, port, isIp6MA, status) do { \
292 struct sockaddr_in in; basocklen_t size=sizeof(struct sockaddr_in);\
294 *(status) = socketGetPeerName((o)->hndl, (struct sockaddr *)&in, &size); \
295 memcpy((sockAddr)->addr, &in.sin_addr.s_addr, 4);\
296 if(port) *(port)=baHtons(in.sin_port);\
297 (sockAddr)->isIp6=FALSE; \
302#ifndef HttpSocket_getSockName
304#define HttpSocket_getSockName(o, addrMA, port, isIp6MA, status) do {\
305 BaSockAddrStorage a;\
306 basocklen_t aLen = sizeof(a);\
307 if( !(*(status) = socketGetSockName((o)->hndl,(struct sockaddr*)&a,&aLen)) )\
310 memcpy(&(addrMA)->addr, &((struct sockaddr_in6*)&a)->sin6_addr, 16);\
311 if(port) *(port)=baHtons(((struct sockaddr_in6*)&a)->sin6_port);\
314 *((U32*)(addrMA)->addr) = ((struct sockaddr_in*)&a)->sin_addr.s_addr;\
315 if(port) *(port)=baHtons(((struct sockaddr_in*)&a)->sin_port);\
317 (addrMA)->isIp6=isIp6MA; \
321#define HttpSocket_getSockName(o, sockAddr, port, isIp6MA, status) do { \
322 struct sockaddr_in in; basocklen_t size=sizeof(struct sockaddr_in);\
324 *(status) = socketGetSockName((o)->hndl, (struct sockaddr *)&in, &size); \
325 memcpy((sockAddr)->addr, &in.sin_addr.s_addr, 4);\
326 if(port) *(port)=baHtons(in.sin_port);\
327 (sockAddr)->isIp6=FALSE; \
332#ifndef HttpSocket_invalidate
333#define HttpSocket_invalidate(o) (o)->hndl = -1
336#ifndef HttpSocket_isValid
337#define HttpSocket_isValid(o) ((o)->hndl >= 0)
340#ifndef HttpSocket_listen
341#define HttpSocket_listen(o, sockaddrNotUsed, queueSize, status) do { \
342 *(status)=socketListen((o)->hndl, queueSize); \
343 HttpSocket_setcloexec(o); \
347#ifndef HttpSocket_move
348#define HttpSocket_move(o, newS) do{ \
349 (newS)->hndl=(o)->hndl;HttpSocket_invalidate(o);}while(0)
352#ifndef HttpSocket_recv
353#define HttpSocket_recv(o, data, len, retLen) do { \
354 *(retLen)=(int)socketRecv((o)->hndl,data,len,0); \
355 if(*(retLen) <= 0) { \
356 if(*(retLen) < 0) { \
358 HttpSocket_wouldBlock(o, &wb); \
362 else *(retLen) = -1; \
367#ifndef HttpSocket_send
368#define HttpSocket_send(o, m, isTerminated, data, len, retLen) do { \
369 if(m && ThreadMutex_isOwner(m)) { \
370 ThreadMutex_release(m); \
371 *(retLen)=(int)socketSend((o)->hndl,data,len,0); \
372 ThreadMutex_set(m); \
375 *(retLen)=(int)socketSend((o)->hndl,data,len,0); \
377 if(*(retLen) < 0) { \
379 HttpSocket_wouldBlock(o, &wb); \
387#ifndef HttpSocket_sendto
388#define HttpSocket_sendto(o, data, len, addr, addrlen, retLen) do { \
389 *(retLen)=(int)socketSendto((o)->hndl,data,len,0, addr, addrlen); \
393#ifndef HttpSocket_sendto
394#define HttpSocket_sendtoV4(o, data, len, addrMA, port, status) \
395 struct sockaddr_in sin; \
396 memset((char *)&sin, 0, sizeof(sin)); \
397 sin.sin_family = AF_INET; \
398 sin.sin_port = baHtons(port); \
399 memcpy(&sin.sin_addr.s_addr, (addrMA)->addr, 4); \
400 *(status) = (int)socketSendto((o)->hndl,data,len,0, \
401 (struct sockaddr *)&sin, sizeof(sin));
403#define HttpSocket_sendtoV6(o, data, len, addrMA, port, status) \
404 struct sockaddr_in6 sin6; \
405 memset((char *)&sin6, 0, sizeof(sin6)); \
406 sin6.sin6_family = (addrMA)->isIp6 ? AF_INET6 : AF_INET; \
407 sin6.sin6_port = baHtons(port); \
408 memcpy(&sin6.sin6_addr, (addrMA)->addr, 16); \
409 *(status)=(int)socketSendto((o)->hndl,data,len,0, \
410 (struct sockaddr *)&sin6,sizeof(sin6));
411#define HttpSocket_sendto(o, data, len, addrMA, port, status) do {\
412 if((addrMA)->isIp6) {\
413 HttpSocket_sendtoV6(o, data, len, addrMA, port, status)\
416 HttpSocket_sendtoV4(o, data, len, addrMA, port, status)\
420#define HttpSocket_sendto(o, data, len, addrMA, port, status) do { \
421 HttpSocket_sendtoV4(o, data, len, addrMA, port, status) } while(0)
427#define baIoctlArg size_t
430#ifndef HttpSocket_setBlocking
431#define HttpSocket_setBlocking(o, status) do { \
433 *(status)=socketIoctl((o)->hndl, FIONBIO, &arg); \
437#ifndef HttpSocket_setNonblocking
438#define HttpSocket_setNonblocking(o, status) \
441 *(status)=socketIoctl((o)->hndl, FIONBIO, &arg); \
445#ifndef HttpSocket_setTCPNoDelay
446#define HttpSocket_setTCPNoDelay(o, enable, status) do { \
447 int enableFlag = enable ? 1 : 0; \
448 *(status) = socketSetsockopt((o)->hndl, IPPROTO_TCP, TCP_NODELAY, \
449 (char*)&enableFlag, sizeof(int)); \
453#if !defined(HttpSocket_getKeepAlive) && defined(SO_KEEPALIVE)
454#define HttpSocket_getKeepAlive(o,enablePtr,statusPtr) do { \
456 socklen_t optlen = sizeof(optval); \
458 socketGetsockopt((o)->hndl,SOL_SOCKET,SO_KEEPALIVE, \
459 (char*)&optval,&optlen)<0 ? \
461 *(enablePtr) = optval; \
465#if !defined(HttpSocket_setKeepAlive) && defined(SO_KEEPALIVE)
466#define HttpSocket_setKeepAlive(o,enable,statusPtr) do { \
468 basocklen_t optlen = sizeof(optval); \
470 socketSetsockopt((o)->hndl,SOL_SOCKET,SO_KEEPALIVE, \
471 (char*)&optval,optlen)<0 ? \
477#ifndef HttpSocket_soReuseaddr
478#ifndef ENABLE_REUSE_ADDR
479#define ENABLE_REUSE_ADDR 0
482#define HttpSocket_soReuseaddr(o, status) do { \
483 int enableFlag = 1; \
484 *(status) = socketSetsockopt((o)->hndl, SOL_SOCKET, SO_REUSEADDR, \
485 (char*)&enableFlag, sizeof(int)); \
488#define HttpSocket_soReuseaddr(o, status)
492#ifndef HttpSocket_soDontroute
493#define HttpSocket_soDontroute(o, enableFlag, status) do { \
494 *(status) = socketSetsockopt((o)->hndl, SOL_SOCKET, SO_DONTROUTE, \
495 (char*)&enableFlag, sizeof(int)); \
499#ifndef HttpSocket_soBroadcast
500#define HttpSocket_soBroadcast(o, enableFlag, status) do { \
501 *(status) = socketSetsockopt((o)->hndl, SOL_SOCKET, SO_BROADCAST, \
502 (char*)&enableFlag, sizeof(int)); \
507#ifndef HttpSocket_sockStream
509#define HttpSocket_sockStreamIp6(o, status) do { \
510 (o)->hndl=socketSocket(AF_INET6, SOCK_STREAM, 0); \
511 *(status) = HttpSocket_isValid(o) ? 0 : -1; \
514#define HttpSocket_sockStreamIp6(o, status) HttpSocket_sockStreamIp4(o, status)
517#define HttpSocket_sockStreamIp4(o, status) do { \
518 (o)->hndl=socketSocket(AF_INET, SOCK_STREAM, 0); \
519 *(status) = HttpSocket_isValid(o) ? 0 : -1; \
522#define HttpSocket_sockStream(o, interfNameNotUsed, useIp6, status) do { \
524 HttpSocket_sockStreamIp6(o, status); \
526 HttpSocket_sockStreamIp4(o, status); \
532#ifndef ba_nametoindex
533#define ba_nametoindex(name, resp,status) *(resp)=if_nametoindex(name)
537#ifndef HttpSocket_sockUdp
539#define HttpSocket_sockUdpIp6(o, status) do { \
540 (o)->hndl=socketSocket(AF_INET6, SOCK_DGRAM, 0); \
541 *(status) = HttpSocket_isValid(o) ? 0 : -1; \
544#define HttpSocket_sockUdpIp6(o, status) HttpSocket_sockUdpIp4(o, status)
547#define HttpSocket_sockUdpIp4(o, status) do { \
548 (o)->hndl=socketSocket(AF_INET, SOCK_DGRAM, 0); \
549 *(status) = HttpSocket_isValid(o) ? 0 : -1; \
552#define HttpSocket_sockUdp(o, interfNameNotUsed, useIp6, status) do { \
554 HttpSocket_sockUdpIp6(o, status); \
556 HttpSocket_sockUdpIp4(o, status); \
560#ifndef HttpSocket_recvfrom
561#define HttpSocket_recvfromIp4(o,data,len,sockAddr,port,status) do { \
562 struct sockaddr_in in; basocklen_t size=sizeof(struct sockaddr_in);\
563 *(status)=socketRecvfrom((o)->hndl,data,len,0,(struct sockaddr*)&in,&size); \
564 memcpy((sockAddr)->addr, &in.sin_addr.s_addr, 4);\
565 *(port)=baHtons(in.sin_port);\
568#define HttpSocket_recvfromIp6(o,data,len,sockAddr,port,status) do { \
569 struct sockaddr_in6 in6; basocklen_t size=sizeof(struct sockaddr_in6);\
570 *(status)=socketRecvfrom((o)->hndl,data,len,0,(struct sockaddr*)&in6,&size);\
571 memcpy(sockAddr, &in6.sin6_addr, 16); \
572 *(port)=baHtons(in6.sin6_port);\
575#define HttpSocket_recvfromIp6(o,data,len,sockAddr,port,status) *status=-1
577#define HttpSocket_recvfrom(o,data,len,sockAddr,port,status) do { \
578 if((sockAddr)->isIp6) \
579 HttpSocket_recvfromIp6(o,data,len,sockAddr,port,status); \
581 HttpSocket_recvfromIp4(o,data,len,sockAddr,port,status); \
586#ifndef HttpSocket_setmembership
587BA_API
int HttpSocket_setmembership(HttpSocket* o,
590 const char* multiAddrName,
591 const char* intfName);
596#ifndef HttpSocket_wouldBlock
597#define HttpSocket_wouldBlock(o, status) do { \
598 *(status)=socketWouldBlock((o)->hndl); \
600 *(status)=socketInProgress((o)->hndl); \
609#ifndef HttpSocket_connect
610#define HttpSocket_connectV4(o, addrMA, port, status) \
611 struct sockaddr_in sin; \
612 memset((char *)&sin, 0, sizeof(sin)); \
613 sin.sin_family = AF_INET; \
614 sin.sin_port = baHtons(port); \
615 memcpy(&sin.sin_addr.s_addr, (addrMA)->addr, 4);\
616 *(status) = socketConnect((o)->hndl,(struct sockaddr *)&sin, sizeof(sin));
618#define HttpSocket_connectV6(o, addrMA, port, status)\
619 struct sockaddr_in6 sin6; \
620 memset((char *)&sin6, 0, sizeof(sin6)); \
621 sin6.sin6_family = (addrMA)->isIp6 ? AF_INET6 : AF_INET; \
622 sin6.sin6_port = baHtons(port); \
623 memcpy(&sin6.sin6_addr, (addrMA)->addr, 16); \
624 *(status)=socketConnect((o)->hndl,(struct sockaddr *)&sin6,sizeof(sin6));
625#define HttpSocket_connect(o, addrMA, port, status) do {\
626 if((addrMA)->isIp6) {\
627 HttpSocket_connectV6(o, addrMA, port, status)\
630 HttpSocket_connectV4(o, addrMA, port, status)\
634#define HttpSocket_connect(o, addr, port, status) do {\
635 HttpSocket_connectV4(o, addr, port, status) } while(0)
646BA_API
int HttpSocket_create(HttpSocket* o,
647 const char* bindIntfName,
652typedef struct HttpSockaddr {
658#ifndef HttpSockaddr_gethostbynameIp6
660#define HttpSockaddr_gethostbynameIp6(o, host, status) do { \
662 struct addrinfo hints, *servinfo; \
663 memset(&hints, 0, sizeof hints); \
664 hints.ai_family = AF_INET6; \
665 hints.ai_socktype = SOCK_STREAM; \
666 *(status) = getaddrinfo(host, 0, &hints, &servinfo); \
667 if( ! *(status) ) { \
669 &((struct sockaddr_in6*)servinfo->ai_addr)->sin6_addr, 16); \
670 freeaddrinfo(servinfo); \
674 memset((o)->addr, 0, 16); \
680#define HttpSockaddr_gethostbynameIp6(o, host, status) \
681 HttpSockaddr_gethostbynameIp4(o, host, status)
685#ifndef HttpSockaddr_gethostbyname
687#define HttpSockaddr_gethostbynameIp4(o, host, status) do { \
691 struct addrinfo hints, *result; \
692 memset(&hints, 0, sizeof(hints)); \
693 hints.ai_family=AF_INET; \
694 *(status)=getaddrinfo(host, 0, &hints, &result); \
696 memcpy((o)->addr, &((struct sockaddr_in*)result->ai_addr)->sin_addr, 4); \
697 freeaddrinfo(result); \
700 else memset((o)->addr, 0, 4); \
703#define HttpSockaddr_gethostbynameIp4(o, host, status) do { \
704 unsigned long ipAddr; \
709 ipAddr = socketInetAddr(host); \
710 if(ipAddr == INADDR_NONE) \
712 struct hostent* hostInfo = socketGethostbyname((char*)host); \
716 memcpy(&ipAddr,&((struct in_addr *)hostInfo->h_addr)->s_addr,4);\
720 ipAddr = baHtonl(INADDR_ANY); \
721 memcpy((o)->addr,&ipAddr, 4); \
727#define HttpSockaddr_gethostbyname(o, host, useIp6, status) do { \
729 HttpSockaddr_gethostbynameIp6(o, host, status); \
731 HttpSockaddr_gethostbynameIp4(o, host, status); \
736#ifndef HttpSockaddr_addr2String
737BA_API
void HttpSockaddr_addr2String(
738 HttpSockaddr* o,
char* buf,
int bufLen,
int* status);
742#ifndef HttpSockaddr_inetAddr
743BA_API
void HttpSockaddr_inetAddr(
744 HttpSockaddr* o,
const char* host,
BaBool useIp6,
int* status);
756typedef struct addrinfo BaAddrinfo;
759#ifndef BaAddrinfo_hintsInit
760#define BaAddrinfo_hintsInit(hints, dgram, ipv6) do { \
761 memset(hints, 0, sizeof(BaAddrinfo)); \
762 (hints)->ai_socktype = dgram ? SOCK_DGRAM : SOCK_STREAM; \
763 (hints)->ai_family = ipv6 ? PF_INET6 : PF_INET; \
767#ifndef BaAddrinfo_get
768#define BaAddrinfo_get(node, service,hints,res,status,errinfo) do { \
769 *(status) = getaddrinfo(node, service, hints, res); \
770 *(errinfo) = *(status) ? (char*)gai_strerror(*(status)) : 0; \
774#ifndef BaAddrinfo_next
775#define BaAddrinfo_next(iter) *((iter)) = (*(iter))->ai_next
778#ifndef BaAddrinfo_free
779#define BaAddrinfo_free(addr) freeaddrinfo(addr)
782#ifndef BaAddrinfo_isIp6
783#define BaAddrinfo_isIp6(addr) (addr)->ai_family == AF_INET6
786#ifndef BaAddrinfo_connect
787int BaAddrinfo_connect(BaAddrinfo* addr, HttpSocket* s,
U32 timeout);
790#ifndef BaAddrinfo_sendto
791#define BaAddrinfo_sendto(addr, s, data, len, status) \
792 HttpSocket_sendto(s, data, len, (addr)->ai_addr, \
793 (socklen_t)(addr)->ai_addrlen, status)
uint16_t U16
Unsigned 16-bit integer.
Definition: GenPrimT.h:91
uint32_t U32
Unsigned 32-bit integer.
Definition: GenPrimT.h:93
U8 BaBool
Boolean stored in an unsigned byte; FALSE is zero and TRUE is one.
Definition: GenPrimT.h:118