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/>.
21 #include <sys/types.h>
23 #include <sys/socket.h>
25 #include "aros_compat.h"
27 #include <bsdsocket/socketbasetags.h>
31 int aros_getnameinfo(const struct sockaddr
*sa
, socklen_t salen
,
32 char *host
, size_t hostlen
,
33 char *serv
, size_t servlen
, int flags
)
35 struct sockaddr_in
*sin
= (struct sockaddr_in
*)sa
;
38 snprintf(host
, hostlen
, Inet_NtoA(sin
->sin_addr
.s_addr
));
44 int aros_getaddrinfo(const char *node
, const char*service
,
45 const struct addrinfo
*hints
,
46 struct addrinfo
**res
)
48 struct sockaddr_in
*sin
;
50 sin
= malloc(sizeof(struct sockaddr_in
));
51 sin
->sin_len
= sizeof(struct sockaddr_in
);
52 sin
->sin_family
=AF_INET
;
54 /* Some error checking would be nice */
55 sin
->sin_addr
.s_addr
= inet_addr(node
);
59 sin
->sin_port
=htons(atoi(service
));
62 *res
= malloc(sizeof(struct addrinfo
));
64 (*res
)->ai_family
= AF_INET
;
65 (*res
)->ai_addrlen
= sizeof(struct sockaddr_in
);
66 (*res
)->ai_addr
= (struct sockaddr
*)sin
;
71 void aros_freeaddrinfo(struct addrinfo
*res
)
77 int aros_inet_pton(int af
, char *src
, void *dst
)
79 struct sockaddr_in sin
;
81 sin
.sin_addr
.s_addr
= inet_addr(src
);
82 memcpy(dst
, &sin
.sin_addr
.s_addr
, sizeof(sin
.sin_addr
.s_addr
));
87 /* unix device numbers dont really make much sense on aros ... */
97 struct Library
* SocketBase
= NULL
;
103 void aros_init_socket(void)
105 if (!(SocketBase
= OpenLibrary("bsdsocket.library", 4))) {
106 printf("NoTCP/IP Stack available");
109 if (SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno
))),
111 SBTM_SETVAL(SBTC_HERRNOLONGPTR
),
112 (IPTR
)&h_errno
, TAG_DONE
)) {
113 printf("Failed to set ERRNO");
118 int aros_poll(struct pollfd
*fds
, unsigned int nfds
, int timo
)
120 struct timeval timeout
, *toptr
;
121 fd_set ifds
, ofds
, efds
, *ip
, *op
;
122 unsigned int i
, maxfd
= 0;
125 // Set up the file-descriptor sets in ifds, ofds and efds.
129 for (i
= 0, op
= ip
= 0; i
< nfds
; ++i
)
132 if(fds
[i
].events
& (POLLIN
|POLLPRI
))
135 FD_SET(fds
[i
].fd
, ip
);
137 if(fds
[i
].events
& POLLOUT
)
140 FD_SET(fds
[i
].fd
, op
);
142 FD_SET(fds
[i
].fd
, &efds
);
143 if (fds
[i
].fd
> maxfd
) {
148 // Set up the timeval structure for the timeout parameter
156 timeout
.tv_sec
= timo
/ 1000;
157 timeout
.tv_usec
= (timo
- timeout
.tv_sec
* 1000) * 1000;
160 rc
= WaitSelect(maxfd
+ 1, ip
, op
, &efds
, toptr
, NULL
);
167 for (i
= 0; i
< nfds
; ++i
)
170 if(fds
[i
].events
& (POLLIN
|POLLPRI
) && FD_ISSET(fd
, &ifds
))
171 fds
[i
].revents
|= POLLIN
;
172 if(fds
[i
].events
& POLLOUT
&& FD_ISSET(fd
, &ofds
))
173 fds
[i
].revents
|= POLLOUT
;
174 if(FD_ISSET(fd
, &efds
)) // Some error was detected ... should be some way to know.
175 fds
[i
].revents
|= POLLHUP
;