11#define LIBCGLUE_SYS_SOCKET_NO_ALIASES
12#define LIBCGLUE_ARPA_INET_NO_ALIASES
13#include <sys/socket.h>
24extern int __transform_errno(
int res);
26int socket(
int domain,
int type,
int protocol)
29 _libcglue_fdman_fd_info_t *info;
31 if (_libcglue_fdman_socket_ops == NULL || _libcglue_fdman_socket_ops->socket == NULL)
37 fd = __fdman_get_new_descriptor();
44 info = &(__descriptormap[fd]->info);
45 iop_fd = _libcglue_fdman_socket_ops->socket(info, domain, type, protocol);
48 __fdman_release_descriptor(fd);
49 return __transform_errno(iop_fd);
51 __descriptormap[fd]->flags = 0;
56int accept(
int fd,
struct sockaddr *addr, socklen_t *addrlen)
58 int new_iop_fd, new_fd;
59 _libcglue_fdman_fd_info_t *info;
61 if (!__IS_FD_VALID(fd)) {
66 _libcglue_fdman_fd_info_t *fdinfo;
68 fdinfo = &(__descriptormap[fd]->info);
69 if (fdinfo->ops == NULL || fdinfo->ops->accept == NULL)
75 new_fd = __fdman_get_new_descriptor();
82 info = &(__descriptormap[new_fd]->info);
83 new_iop_fd = fdinfo->ops->accept(fdinfo->userdata, info, addr, addrlen);
86 __fdman_release_descriptor(new_fd);
87 return __transform_errno(new_iop_fd);
89 __descriptormap[new_fd]->flags = 0;
93int bind(
int fd,
const struct sockaddr *my_addr, socklen_t addrlen)
95 if (!__IS_FD_VALID(fd)) {
100 _libcglue_fdman_fd_info_t *fdinfo;
102 fdinfo = &(__descriptormap[fd]->info);
103 if (fdinfo->ops == NULL || fdinfo->ops->bind == NULL)
108 return __transform_errno(fdinfo->ops->bind(fdinfo->userdata, my_addr, addrlen));
111int connect(
int fd,
const struct sockaddr *serv_addr, socklen_t addrlen)
113 if (!__IS_FD_VALID(fd)) {
118 _libcglue_fdman_fd_info_t *fdinfo;
120 fdinfo = &(__descriptormap[fd]->info);
121 if (fdinfo->ops == NULL || fdinfo->ops->connect == NULL)
126 return __transform_errno(fdinfo->ops->connect(fdinfo->userdata, serv_addr, addrlen));
129int listen(
int fd,
int backlog)
131 if (!__IS_FD_VALID(fd)) {
136 _libcglue_fdman_fd_info_t *fdinfo;
138 fdinfo = &(__descriptormap[fd]->info);
139 if (fdinfo->ops == NULL || fdinfo->ops->listen == NULL)
144 return __transform_errno(fdinfo->ops->listen(fdinfo->userdata, backlog));
147ssize_t recv(
int fd,
void *buf,
size_t len,
int flags)
149 if (!__IS_FD_VALID(fd)) {
154 _libcglue_fdman_fd_info_t *fdinfo;
156 fdinfo = &(__descriptormap[fd]->info);
157 if (fdinfo->ops == NULL || fdinfo->ops->recv == NULL)
162 return __transform_errno(fdinfo->ops->recv(fdinfo->userdata, buf, len, flags));
165ssize_t recvfrom(
int fd,
void *buf,
size_t len,
int flags,
struct sockaddr *from, socklen_t *fromlen)
167 if (!__IS_FD_VALID(fd)) {
172 _libcglue_fdman_fd_info_t *fdinfo;
174 fdinfo = &(__descriptormap[fd]->info);
175 if (fdinfo->ops == NULL || fdinfo->ops->recvfrom == NULL)
180 return __transform_errno(fdinfo->ops->recvfrom(fdinfo->userdata, buf, len, flags, from, fromlen));
183ssize_t recvmsg(
int fd,
struct msghdr *msg,
int flags)
185 if (!__IS_FD_VALID(fd)) {
190 _libcglue_fdman_fd_info_t *fdinfo;
192 fdinfo = &(__descriptormap[fd]->info);
193 if (fdinfo->ops == NULL || fdinfo->ops->recvmsg == NULL)
198 return __transform_errno(fdinfo->ops->recvmsg(fdinfo->userdata, msg, flags));
201ssize_t send(
int fd,
const void *buf,
size_t len,
int flags)
203 if (!__IS_FD_VALID(fd)) {
208 _libcglue_fdman_fd_info_t *fdinfo;
210 fdinfo = &(__descriptormap[fd]->info);
211 if (fdinfo->ops == NULL || fdinfo->ops->send == NULL)
216 return __transform_errno(fdinfo->ops->send(fdinfo->userdata, buf, len, flags));
219ssize_t sendto(
int fd,
const void *buf,
size_t len,
int flags,
const struct sockaddr *to, socklen_t tolen)
221 if (!__IS_FD_VALID(fd)) {
226 _libcglue_fdman_fd_info_t *fdinfo;
228 fdinfo = &(__descriptormap[fd]->info);
229 if (fdinfo->ops == NULL || fdinfo->ops->sendto == NULL)
234 return __transform_errno(fdinfo->ops->sendto(fdinfo->userdata, buf, len, flags, to, tolen));
237ssize_t sendmsg(
int fd,
const struct msghdr *msg,
int flags)
239 if (!__IS_FD_VALID(fd)) {
244 _libcglue_fdman_fd_info_t *fdinfo;
246 fdinfo = &(__descriptormap[fd]->info);
247 if (fdinfo->ops == NULL || fdinfo->ops->sendmsg == NULL)
252 return __transform_errno(fdinfo->ops->sendmsg(fdinfo->userdata, msg, flags));
255int getsockopt(
int fd,
int level,
int optname,
void *optval, socklen_t *optlen)
257 if (!__IS_FD_VALID(fd)) {
262 _libcglue_fdman_fd_info_t *fdinfo;
264 fdinfo = &(__descriptormap[fd]->info);
265 if (fdinfo->ops == NULL || fdinfo->ops->getsockopt == NULL)
270 return __transform_errno(fdinfo->ops->getsockopt(fdinfo->userdata, level, optname, optval, optlen));
273int setsockopt(
int fd,
int level,
int optname,
const void *optval, socklen_t optlen)
275 if (!__IS_FD_VALID(fd)) {
280 _libcglue_fdman_fd_info_t *fdinfo;
282 fdinfo = &(__descriptormap[fd]->info);
283 if (fdinfo->ops == NULL || fdinfo->ops->setsockopt == NULL)
288 return __transform_errno(fdinfo->ops->setsockopt(fdinfo->userdata, level, optname, optval, optlen));
291int shutdown(
int fd,
int how)
293 if (!__IS_FD_VALID(fd)) {
298 _libcglue_fdman_fd_info_t *fdinfo;
300 fdinfo = &(__descriptormap[fd]->info);
301 if (fdinfo->ops == NULL || fdinfo->ops->shutdown == NULL)
306 return __transform_errno(fdinfo->ops->shutdown(fdinfo->userdata, how));
309int getpeername(
int fd,
struct sockaddr *name, socklen_t *namelen)
311 if (!__IS_FD_VALID(fd)) {
316 _libcglue_fdman_fd_info_t *fdinfo;
318 fdinfo = &(__descriptormap[fd]->info);
319 if (fdinfo->ops == NULL || fdinfo->ops->getpeername == NULL)
324 return __transform_errno(fdinfo->ops->getpeername(fdinfo->userdata, name, namelen));
327int getsockname(
int fd,
struct sockaddr *name, socklen_t *namelen)
329 if (!__IS_FD_VALID(fd)) {
334 _libcglue_fdman_fd_info_t *fdinfo;
336 fdinfo = &(__descriptormap[fd]->info);
337 if (fdinfo->ops == NULL || fdinfo->ops->getsockname == NULL)
342 return __transform_errno(fdinfo->ops->getsockname(fdinfo->userdata, name, namelen));
345u32 libcglue_inet_addr(
const char *cp)
347 if (_libcglue_fdman_inet_ops == NULL || _libcglue_fdman_inet_ops->inet_addr == NULL)
352 return _libcglue_fdman_inet_ops->inet_addr(cp);
355char *libcglue_inet_ntoa(
const ip4_addr_t *addr)
357 if (_libcglue_fdman_inet_ops == NULL || _libcglue_fdman_inet_ops->inet_ntoa == NULL)
362 return _libcglue_fdman_inet_ops->inet_ntoa(addr);
365char *libcglue_inet_ntoa_r(
const ip4_addr_t *addr,
char *buf,
int buflen)
367 if (_libcglue_fdman_inet_ops == NULL || _libcglue_fdman_inet_ops->inet_ntoa_r == NULL)
372 return _libcglue_fdman_inet_ops->inet_ntoa_r(addr, buf, buflen);
375int libcglue_inet_aton(
const char *cp,
ip4_addr_t *addr)
377 if (_libcglue_fdman_inet_ops == NULL || _libcglue_fdman_inet_ops->inet_aton == NULL)
382 return _libcglue_fdman_inet_ops->inet_aton(cp, addr);
struct ip4_addr ip4_addr_t