1 #include <features.h>
2 
3 #include <l4/re/log>
4 #include <l4/re/env>
5 
6 #include <stdarg.h>
7 #include <errno.h>
8 #include <unistd.h>
9 #include <limits.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <sys/ioctl.h>
13 #include <sys/socket.h>
14 #include <l4/l4re_vfs/backend>
15 #include <string.h>
16 #include <stdlib.h>
17 #include "redirect.h"
18 
19 using namespace L4Re::Vfs;
20 using cxx::Ref_ptr;
21 
22 
23 #define ERRNO_RET(r) do { \
24   if ((r) < 0) \
25     {          \
26       errno = -(r); \
27       return -1; \
28     } } while (0)
29 
30 #define L4B_REDIRECT(ret, func, ptlist, plist) \
31   ret func ptlist noexcept(noexcept(func plist)) \
32   {               \
33     L4Re::Vfs::Ops *o = L4Re::Vfs::vfs_ops; \
34     cxx::Ref_ptr<L4Re::Vfs::File> f = o->get_file(_a1); \
35     if (!f) \
36       { \
37 	errno = EBADF; \
38 	return -1; \
39       } \
40     ret r = f->func(L4B_STRIP_FIRST(plist)); \
41     POST(); \
42   }
43 
44 L4B_REDIRECT_3(int, bind,    int, sockaddr const *, socklen_t)
45 L4B_REDIRECT_3(int, connect, int, sockaddr const *, socklen_t)
46 
47 L4B_REDIRECT_4(ssize_t, send,     int, void const *, size_t, int)
48 L4B_REDIRECT_4(ssize_t, recv,     int, void *,       size_t, int)
49 L4B_REDIRECT_6(ssize_t, sendto,   int, void const *, size_t, int, sockaddr const *, socklen_t)
50 L4B_REDIRECT_6(ssize_t, recvfrom, int, void *,       size_t, int, sockaddr *, socklen_t *)
51 
52 L4B_REDIRECT_3(ssize_t, sendmsg,  int, msghdr const *, int)
53 L4B_REDIRECT_3(ssize_t, recvmsg,  int, msghdr *, int)
54 
55 L4B_REDIRECT_5(int, getsockopt, int, int, int, void *,       socklen_t *)
56 L4B_REDIRECT_5(int, setsockopt, int, int, int, void const *, socklen_t)
57 L4B_REDIRECT_2(int, listen, int, int)
58 L4B_REDIRECT_3(int, accept, int, sockaddr *, socklen_t *)
59 L4B_REDIRECT_2(int, shutdown, int, int)
60 L4B_REDIRECT_3(int, getsockname, int, sockaddr *, socklen_t *)
61 L4B_REDIRECT_3(int, getpeername, int, sockaddr *, socklen_t *)
62 
63 
64