Xenomai  3.0-rc3
rtdm.h
1 /*
2  * Copyright (C) 2014 Philippe Gerum <rpm@xenomai.org>.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library 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 GNU
12  * Lesser General Public License for more details.
13 
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18 #ifndef _XENOMAI_TRANK_RTDM_RTDM_H
19 #define _XENOMAI_TRANK_RTDM_RTDM_H
20 
21 #include_next <rtdm/rtdm.h>
22 
23 #ifndef RTDM_NO_DEFAULT_USER_API
24 
25 #define rt_dev_call(__call, __args...) \
26 ({ \
27  int __ret; \
28  __ret = __RT(__call(__args)); \
29  __ret < 0 ? -errno : __ret; \
30 })
31 
32 #define rt_dev_open(__args...) rt_dev_call(open, __args)
33 #define rt_dev_ioctl(__args...) rt_dev_call(ioctl, __args)
34 
35 static inline int rt_dev_socket(int domain, int type, int protocol)
36 {
37  return rt_dev_call(socket, domain, type, protocol);
38 }
39 
40 static inline ssize_t rt_dev_recvmsg(int fd, struct msghdr *msg, int flags)
41 {
42  return rt_dev_call(recvmsg, fd, msg, flags);
43 }
44 
45 static inline ssize_t rt_dev_recv(int fd, void *buf, size_t len, int flags)
46 {
47  return rt_dev_call(recvfrom, fd, buf, len, flags, NULL, NULL);
48 }
49 
50 static inline ssize_t rt_dev_sendmsg(int fd, const struct msghdr *msg, int flags)
51 {
52  return rt_dev_call(sendmsg, fd, msg, flags);
53 }
54 
55 static inline ssize_t rt_dev_sendto(int fd, const void *buf, size_t len,
56  int flags, const struct sockaddr *to,
57  socklen_t tolen)
58 {
59  struct iovec iov;
60  struct msghdr msg;
61 
62  iov.iov_base = (void *)buf;
63  iov.iov_len = len;
64 
65  msg.msg_name = (struct sockaddr *)to;
66  msg.msg_namelen = tolen;
67  msg.msg_iov = &iov;
68  msg.msg_iovlen = 1;
69  msg.msg_control = NULL;
70  msg.msg_controllen = 0;
71 
72  return rt_dev_call(sendmsg, fd, &msg, flags);
73 }
74 
75 static inline ssize_t rt_dev_send(int fd, const void *buf, size_t len,
76  int flags)
77 {
78  return rt_dev_call(sendto, fd, buf, len, flags, NULL, 0);
79 }
80 
81 static inline int rt_dev_getsockopt(int fd, int level, int optname,
82  void *optval, socklen_t *optlen)
83 {
84  struct _rtdm_getsockopt_args args = {
85  level, optname, optval, optlen
86  };
87 
88  return rt_dev_call(ioctl, fd, _RTIOC_GETSOCKOPT, &args);
89 }
90 
91 static inline int rt_dev_setsockopt(int fd, int level, int optname,
92  const void *optval, socklen_t optlen)
93 {
94  struct _rtdm_setsockopt_args args = {
95  level, optname, (void *)optval, optlen
96  };
97 
98  return rt_dev_call(ioctl, fd, _RTIOC_SETSOCKOPT, &args);
99 }
100 
101 static inline int rt_dev_bind(int fd, const struct sockaddr *my_addr,
102  socklen_t addrlen)
103 {
104  struct _rtdm_setsockaddr_args args = { my_addr, addrlen };
105 
106  return rt_dev_call(ioctl, fd, _RTIOC_BIND, &args);
107 }
108 
109 static inline int rt_dev_connect(int fd, const struct sockaddr *serv_addr,
110  socklen_t addrlen)
111 {
112  struct _rtdm_setsockaddr_args args = { serv_addr, addrlen };
113 
114  return rt_dev_call(ioctl, fd, _RTIOC_CONNECT, &args);
115 }
116 
117 static inline int rt_dev_listen(int fd, int backlog)
118 {
119  return rt_dev_call(ioctl, fd, _RTIOC_LISTEN, backlog);
120 }
121 
122 static inline int rt_dev_accept(int fd, struct sockaddr *addr,
123  socklen_t *addrlen)
124 {
125  struct _rtdm_getsockaddr_args args = { addr, addrlen };
126 
127  return rt_dev_call(ioctl, fd, _RTIOC_ACCEPT, &args);
128 }
129 
130 static inline int rt_dev_getsockname(int fd, struct sockaddr *name,
131  socklen_t *namelen)
132 {
133  struct _rtdm_getsockaddr_args args = { name, namelen };
134 
135  return rt_dev_call(ioctl, fd, _RTIOC_GETSOCKNAME, &args);
136 }
137 
138 static inline int rt_dev_getpeername(int fd, struct sockaddr *name,
139  socklen_t *namelen)
140 {
141  struct _rtdm_getsockaddr_args args = { name, namelen };
142 
143  return rt_dev_call(ioctl, fd, _RTIOC_GETPEERNAME, &args);
144 }
145 
146 static inline int rt_dev_shutdown(int fd, int how)
147 {
148  return rt_dev_call(ioctl, fd, _RTIOC_SHUTDOWN, how);
149 }
150 
151 static inline int rt_dev_close(int fd)
152 {
153  return rt_dev_call(close, fd);
154 }
155 
156 static inline ssize_t rt_dev_write(int fd, const void *buf, size_t len)
157 {
158  return rt_dev_call(write, fd, buf, len);
159 }
160 
161 static inline ssize_t rt_dev_read(int fd, void *buf, size_t len)
162 {
163  return rt_dev_call(read, fd, buf, len);
164 }
165 
166 #endif /* !RTDM_NO_DEFAULT_USER_API */
167 
168 #endif /* _XENOMAI_TRANK_RTDM_RTDM_H */