2 Copyright (C) 2013 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published by
6 the Free Software Foundation; either version 2.1 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include <sys/types.h>
25 #include <sys/socket.h>
27 #include "aros_compat.h"
29 #include <bsdsocket/socketbasetags.h>
33 int aros_getnameinfo(const struct sockaddr
*sa
, socklen_t salen
,
34 char *host
, size_t hostlen
,
35 char *serv
, size_t servlen
, int flags
)
37 struct sockaddr_in
*sin
= (struct sockaddr_in
*)sa
;
40 snprintf(host
, hostlen
, Inet_NtoA(sin
->sin_addr
.s_addr
));
46 int aros_getaddrinfo(const char *node
, const char*service
,
47 const struct addrinfo
*hints
,
48 struct addrinfo
**res
)
50 struct sockaddr_in
*sin
;
52 sin
= malloc(sizeof(struct sockaddr_in
));
53 sin
->sin_len
= sizeof(struct sockaddr_in
);
54 sin
->sin_family
=AF_INET
;
56 /* Some error checking would be nice */
57 sin
->sin_addr
.s_addr
= inet_addr(node
);
61 sin
->sin_port
=htons(atoi(service
));
64 *res
= malloc(sizeof(struct addrinfo
));
66 (*res
)->ai_family
= AF_INET
;
67 (*res
)->ai_addrlen
= sizeof(struct sockaddr_in
);
68 (*res
)->ai_addr
= (struct sockaddr
*)sin
;
73 void aros_freeaddrinfo(struct addrinfo
*res
)
79 int aros_inet_pton(int af
, char *src
, void *dst
)
81 struct sockaddr_in sin
;
83 sin
.sin_addr
.s_addr
= inet_addr(src
);
84 memcpy(dst
, &sin
.sin_addr
.s_addr
, sizeof(sin
.sin_addr
,s_addr
));
89 /* unix device numbers dont really make much sense on aros ... */
99 struct Library
* SocketBase
= NULL
;
105 void aros_init_socket(void)
107 if (!(SocketBase
= OpenLibrary("bsdsocket.library", 4))) {
108 printf("NoTCP/IP Stack available");
111 if (SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno
))),
113 SBTM_SETVAL(SBTC_HERRNOLONGPTR
),
114 (IPTR
)&h_errno
, TAG_DONE
)) {
115 printf("Failed to set ERRNO");
120 int aros_poll(struct pollfd
*fds
, unsigned int nfds
, int timo
)
122 struct timeval timeout
, *toptr
;
123 fd_set ifds
, ofds
, efds
, *ip
, *op
;
124 unsigned int i
, maxfd
= 0;
127 // Set up the file-descriptor sets in ifds, ofds and efds.
131 for (i
= 0, op
= ip
= 0; i
< nfds
; ++i
)
134 if(fds
[i
].events
& (POLLIN
|POLLPRI
))
137 FD_SET(fds
[i
].fd
, ip
);
139 if(fds
[i
].events
& POLLOUT
)
142 FD_SET(fds
[i
].fd
, op
);
144 FD_SET(fds
[i
].fd
, &efds
);
145 if (fds
[i
].fd
> maxfd
) {
150 // Set up the timeval structure for the timeout parameter
158 timeout
.tv_sec
= timo
/ 1000;
159 timeout
.tv_usec
= (timo
- timeout
.tv_sec
* 1000) * 1000;
162 rc
= WaitSelect(maxfd
+ 1, ip
, op
, &efds
, toptr
, NULL
);
169 for (i
= 0; i
< nfds
; ++i
)
172 if(fds
[i
].events
& (POLLIN
|POLLPRI
) && FD_ISSET(fd
, &ifds
))
173 fds
[i
].revents
|= POLLIN
;
174 if(fds
[i
].events
& POLLOUT
&& FD_ISSET(fd
, &ofds
))
175 fds
[i
].revents
|= POLLOUT
;
176 if(FD_ISSET(fd
, &efds
)) // Some error was detected ... should be some way to know.
177 fds
[i
].revents
|= POLLHUP
;