9 #include <sys/socket.h>
11 #include "aros_compat.h"
13 #include <bsdsocket/socketbasetags.h>
17 int aros_getnameinfo(const struct sockaddr
*sa
, socklen_t salen
,
18 char *host
, size_t hostlen
,
19 char *serv
, size_t servlen
, int flags
)
21 struct sockaddr_in
*sin
= (struct sockaddr_in
*)sa
;
24 snprintf(host
, hostlen
, Inet_NtoA(sin
->sin_addr
.s_addr
));
30 int aros_getaddrinfo(const char *node
, const char*service
,
31 const struct addrinfo
*hints
,
32 struct addrinfo
**res
)
34 struct sockaddr_in
*sin
;
36 sin
= malloc(sizeof(struct sockaddr_in
));
37 sin
->sin_len
= sizeof(struct sockaddr_in
);
38 sin
->sin_family
=AF_INET
;
40 /* Some error checking would be nice */
41 sin
->sin_addr
.s_addr
= inet_addr(node
);
45 sin
->sin_port
=htons(atoi(service
));
48 *res
= malloc(sizeof(struct addrinfo
));
50 (*res
)->ai_family
= AF_INET
;
51 (*res
)->ai_addrlen
= sizeof(struct sockaddr_in
);
52 (*res
)->ai_addr
= (struct sockaddr
*)sin
;
57 void aros_freeaddrinfo(struct addrinfo
*res
)
63 int aros_inet_pton(int af
, char *src
, void *dst
)
65 printf("No inet_pton yet");
70 /* unix device numbers dont really make much sense on aros ... */
80 struct Library
* SocketBase
= NULL
;
86 void aros_init_socket(void)
88 if (!(SocketBase
= OpenLibrary("bsdsocket.library", 4))) {
89 printf("NoTCP/IP Stack available");
92 if (SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno
))),
94 SBTM_SETVAL(SBTC_HERRNOLONGPTR
),
95 (IPTR
)&h_errno
, TAG_DONE
)) {
96 printf("Failed to set ERRNO");
101 int aros_poll(struct pollfd
*fds
, unsigned int nfds
, int timo
)
103 struct timeval timeout
, *toptr
;
104 fd_set ifds
, ofds
, efds
, *ip
, *op
;
105 unsigned int i
, maxfd
= 0;
108 // Set up the file-descriptor sets in ifds, ofds and efds.
112 for (i
= 0, op
= ip
= 0; i
< nfds
; ++i
)
115 if(fds
[i
].events
& (POLLIN
|POLLPRI
))
118 FD_SET(fds
[i
].fd
, ip
);
120 if(fds
[i
].events
& POLLOUT
)
123 FD_SET(fds
[i
].fd
, op
);
125 FD_SET(fds
[i
].fd
, &efds
);
126 if (fds
[i
].fd
> maxfd
) {
131 // Set up the timeval structure for the timeout parameter
139 timeout
.tv_sec
= timo
/ 1000;
140 timeout
.tv_usec
= (timo
- timeout
.tv_sec
* 1000) * 1000;
143 rc
= WaitSelect(maxfd
+ 1, ip
, op
, &efds
, toptr
, NULL
);
150 for (i
= 0; i
< nfds
; ++i
)
153 if(fds
[i
].events
& (POLLIN
|POLLPRI
) && FD_ISSET(fd
, &ifds
))
154 fds
[i
].revents
|= POLLIN
;
155 if(fds
[i
].events
& POLLOUT
&& FD_ISSET(fd
, &ofds
))
156 fds
[i
].revents
|= POLLOUT
;
157 if(FD_ISSET(fd
, &efds
)) // Some error was detected ... should be some way to know.
158 fds
[i
].revents
|= POLLHUP
;