Xenomai  3.1
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 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #ifndef RTDM_NO_DEFAULT_USER_API
28 
29 #define rt_dev_call(__call, __args...) \
30 ({ \
31  int __ret; \
32  __ret = __RT(__call(__args)); \
33  __ret < 0 ? -errno : __ret; \
34 })
35 
36 #define rt_dev_open(__args...) rt_dev_call(open, __args)
37 #define rt_dev_ioctl(__args...) rt_dev_call(ioctl, __args)
38 #define rt_dev_recvfrom(__args...) rt_dev_call(recvfrom, __args)
39 
40 static inline int rt_dev_socket(int domain, int type, int protocol)
41 {
42  return rt_dev_call(socket, domain, type, protocol);
43 }
44 
45 static inline ssize_t rt_dev_recvmsg(int fd, struct msghdr *msg, int flags)
46 {
47  return rt_dev_call(recvmsg, fd, msg, flags);
48 }
49 
50 static inline ssize_t rt_dev_recv(int fd, void *buf, size_t len, int flags)
51 {
52  return rt_dev_call(recvfrom, fd, buf, len, flags, NULL, NULL);
53 }
54 
55 static inline ssize_t rt_dev_sendmsg(int fd, const struct msghdr *msg, int flags)
56 {
57  return rt_dev_call(sendmsg, fd, msg, flags);
58 }
59 
60 static inline ssize_t rt_dev_sendto(int fd, const void *buf, size_t len,
61  int flags, const struct sockaddr *to,
62  socklen_t tolen)
63 {
64  struct iovec iov;
65  struct msghdr msg;
66 
67  iov.iov_base = (void *)buf;
68  iov.iov_len = len;
69 
70  msg.msg_name = (struct sockaddr *)to;
71  msg.msg_namelen = tolen;
72  msg.msg_iov = &iov;
73  msg.msg_iovlen = 1;
74  msg.msg_control = NULL;
75  msg.msg_controllen = 0;
76 
77  return rt_dev_call(sendmsg, fd, &msg, flags);
78 }
79 
80 static inline ssize_t rt_dev_send(int fd, const void *buf, size_t len,
81  int flags)
82 {
83  return rt_dev_call(sendto, fd, buf, len, flags, NULL, 0);
84 }
85 
86 static inline int rt_dev_getsockopt(int fd, int level, int optname,
87  void *optval, socklen_t *optlen)
88 {
89  struct _rtdm_getsockopt_args args = {
90  level, optname, optval, optlen
91  };
92 
93  return rt_dev_call(ioctl, fd, _RTIOC_GETSOCKOPT, &args);
94 }
95 
96 static inline int rt_dev_setsockopt(int fd, int level, int optname,
97  const void *optval, socklen_t optlen)
98 {
99  struct _rtdm_setsockopt_args args = {
100  level, optname, (void *)optval, optlen
101  };
102 
103  return rt_dev_call(ioctl, fd, _RTIOC_SETSOCKOPT, &args);
104 }
105 
106 static inline int rt_dev_bind(int fd, const struct sockaddr *my_addr,
107  socklen_t addrlen)
108 {
109  struct _rtdm_setsockaddr_args args = { my_addr, addrlen };
110 
111  return rt_dev_call(ioctl, fd, _RTIOC_BIND, &args);
112 }
113 
114 static inline int rt_dev_connect(int fd, const struct sockaddr *serv_addr,
115  socklen_t addrlen)
116 {
117  struct _rtdm_setsockaddr_args args = { serv_addr, addrlen };
118 
119  return rt_dev_call(ioctl, fd, _RTIOC_CONNECT, &args);
120 }
121 
122 static inline int rt_dev_listen(int fd, int backlog)
123 {
124  return rt_dev_call(ioctl, fd, _RTIOC_LISTEN, backlog);
125 }
126 
127 static inline int rt_dev_accept(int fd, struct sockaddr *addr,
128  socklen_t *addrlen)
129 {
130  struct _rtdm_getsockaddr_args args = { addr, addrlen };
131 
132  return rt_dev_call(ioctl, fd, _RTIOC_ACCEPT, &args);
133 }
134 
135 static inline int rt_dev_getsockname(int fd, struct sockaddr *name,
136  socklen_t *namelen)
137 {
138  struct _rtdm_getsockaddr_args args = { name, namelen };
139 
140  return rt_dev_call(ioctl, fd, _RTIOC_GETSOCKNAME, &args);
141 }
142 
143 static inline int rt_dev_getpeername(int fd, struct sockaddr *name,
144  socklen_t *namelen)
145 {
146  struct _rtdm_getsockaddr_args args = { name, namelen };
147 
148  return rt_dev_call(ioctl, fd, _RTIOC_GETPEERNAME, &args);
149 }
150 
151 static inline int rt_dev_shutdown(int fd, int how)
152 {
153  return rt_dev_call(ioctl, fd, _RTIOC_SHUTDOWN, how);
154 }
155 
156 static inline int rt_dev_close(int fd)
157 {
158  return rt_dev_call(close, fd);
159 }
160 
161 static inline ssize_t rt_dev_write(int fd, const void *buf, size_t len)
162 {
163  return rt_dev_call(write, fd, buf, len);
164 }
165 
166 static inline ssize_t rt_dev_read(int fd, void *buf, size_t len)
167 {
168  return rt_dev_call(read, fd, buf, len);
169 }
170 
171 #endif /* !RTDM_NO_DEFAULT_USER_API */
172 
173 #ifdef __cplusplus
174 }
175 #endif
176 
177 #endif /* _XENOMAI_TRANK_RTDM_RTDM_H */