]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/ankh/lib/libc_be_socket/be.c
Inital import
[l4.git] / l4 / pkg / ankh / lib / libc_be_socket / be.c
1 /*
2  * (c) 2009 Technische Universität Dresden
3  * This file is part of TUD:OS and distributed under the terms of the
4  * GNU Lesser General Public License 2.1.
5  * Please see the COPYING-LGPL-2.1 file for details.
6  */
7
8 #define LWIP_COMPAT_SOCKETS 0
9
10 #include "lwip/sockets.h"
11 #include "lwip/netdb.h"
12 #include <string.h>
13 #include "sock_fs.h"
14
15 int socket(int domain, int type, int protocol);
16 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
17 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
18 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
19 int getsockopt(int sockfd, int level, int optname,
20                void *optval, socklen_t *optlen);
21 int setsockopt(int sockfd, int level, int optname,
22                const void *optval, socklen_t optlen);
23 int listen(int sockfd, int backlog);
24 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
25 ssize_t send(int sockfd, const void *buf, size_t len, int flags);
26 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
27                const struct sockaddr *dest_addr, socklen_t addrlen);
28 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
29 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
30 int getnameinfo(const struct sockaddr *sa, socklen_t salen,
31                 char *host, socklen_t hostlen,
32                 char *serv, socklen_t servlen, unsigned int flags);
33 int shutdown(int sockfd, int how);
34 struct hostent *gethostbyname(const char *name);
35 int gethostname(char *name, size_t len);
36
37
38 /* XXX
39  * BD: Actually, we only need this, if we intermix uclibc and lwip
40  *     socket functions which seems to be a bad idea anyway?
41  */
42 static void __attribute__((unused))
43 uclibc_to_lwip_sockaddr(struct sockaddr *addr)
44 {
45   unsigned char *a = (unsigned char *)addr;
46   unsigned char x = a[0];
47   a[0] = a[1];
48   a[1] = x;
49 }
50
51
52 /* Wrappers */
53 int socket(int domain, int type, int protocol)
54 {
55   int sockfd = lwip_socket(domain, type, protocol);
56   return assign_fd_to_socket(sockfd);
57 }
58
59 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
60 {
61   int sock = socket_for_fd(sockfd);
62   int ret = lwip_connect(sock, addr, addrlen);
63   if (ret == 0)
64     mark_connected(sockfd, 1);
65
66   return ret;
67 }
68
69 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
70 {
71   int sock = socket_for_fd(sockfd);
72   int ret = lwip_accept(sock, addr, addrlen);
73   return ret;
74 }
75
76 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
77 {
78   int sock = socket_for_fd(sockfd);
79   int ret = lwip_bind(sock, addr, addrlen);
80   if (ret == 0)
81     mark_connected(sockfd, 1);
82   return ret;
83 }
84
85 int getsockopt(int sockfd, int level, int optname,
86                void *optval, socklen_t *optlen)
87 {
88   int sock = socket_for_fd(sockfd);
89   return lwip_getsockopt(sock, level, optname, optval, optlen);
90 }
91
92 int setsockopt(int sockfd, int level, int optname,
93                const void *optval, socklen_t optlen)
94 {
95   int sock = socket_for_fd(sockfd);
96   return lwip_setsockopt(sock, level, optname, optval, optlen);
97 }
98
99 int listen(int sockfd, int backlog)
100 {
101   int sock = socket_for_fd(sockfd);
102   return lwip_listen(sock, backlog);
103 }
104
105 ssize_t recv(int sockfd, void *buf, size_t len, int flags)
106 {
107   int sock = socket_for_fd(sockfd);
108   return lwip_recv(sock, buf, len, flags);
109 }
110
111 ssize_t send(int sockfd, const void *buf, size_t len, int flags)
112 {
113   int sock = socket_for_fd(sockfd);
114   return lwip_send(sock, buf, len, flags);
115 }
116
117 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
118                const struct sockaddr *dest_addr, socklen_t addrlen)
119 {
120   int sock = socket_for_fd(sockfd);
121   return lwip_sendto(sock, buf, len, flags, dest_addr, addrlen);
122 }
123
124 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
125 {
126   int sock = socket_for_fd(sockfd);
127   return lwip_getsockname(sock, addr, addrlen);
128 }
129
130 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
131 {
132   int sock = socket_for_fd(sockfd);
133   return lwip_getpeername(sock, addr, addrlen);
134 }
135
136 int getnameinfo(const struct sockaddr *sa, socklen_t salen,
137                 char *host, socklen_t hostlen,
138                 char *serv, socklen_t servlen, unsigned int flags)
139 {
140   printf("Unimplemented: %s(%p, %d, %p, %d, %p, %d, %d)\n", __func__,
141          sa, salen, host, hostlen, serv, servlen, flags);
142   return -4;
143 }
144
145 int shutdown(int sockfd, int how)
146 {
147   printf("Unimplemented: %s(%d, %d)\n", __func__, sockfd, how);
148   errno = -EBADF;
149   return -1;
150 }
151
152 struct hostent *gethostbyname(const char *name)
153 {
154   return lwip_gethostbyname(name);
155 }
156
157 int gethostname(char *name, size_t len)
158 {
159   const char const *my_fine_hostname = "l4re-host";
160   strncpy(name, my_fine_hostname, len);
161   name[len - 1] = 0;
162   return 0;
163 }