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