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