/* * Copyright (C) 2005, 2006 Jan Kiszka * Copyright (C) 2005 Joerg Langenberg * * Xenomai is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Xenomai 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xenomai; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _COBALT_RTDM_RTDM_H #define _COBALT_RTDM_RTDM_H #include #include #include #include #include #include #include typedef __u32 socklen_t; #include int __rtdm_dev_open(const char *path, int oflag); int __rtdm_dev_socket(int protocol_family, int socket_type, int protocol); static inline int rtdm_open(const char *path, int oflag, ...) { return __rtdm_dev_open(path, oflag); } static inline int rtdm_socket(int protocol_family, int socket_type, int protocol) { return __rtdm_dev_socket(protocol_family, socket_type, protocol); } static inline int rtdm_close(int fd) { return rtdm_fd_close(fd, RTDM_FD_MAGIC); } #define rtdm_fcntl(__fd, __cmd, __args...) \ rtdm_fd_fcntl(__fd, __cmd, ##__args) #define rtdm_ioctl(__fd, __request, __args...) \ rtdm_fd_ioctl(__fd, __request, ##__args) static inline ssize_t rtdm_read(int fd, void *buf, size_t count) { return rtdm_fd_read(fd, buf, count); } static inline ssize_t rtdm_write(int fd, const void *buf, size_t count) { return rtdm_fd_write(fd, buf, count); } static inline ssize_t rtdm_recvmsg(int s, struct user_msghdr *msg, int flags) { return rtdm_fd_recvmsg(s, msg, flags); } static inline ssize_t rtdm_sendmsg(int s, const struct user_msghdr *msg, int flags) { return rtdm_fd_sendmsg(s, msg, flags); } static inline ssize_t rtdm_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) { struct user_msghdr msg; struct iovec iov; ssize_t ret; iov.iov_base = buf; iov.iov_len = len; msg.msg_name = from; msg.msg_namelen = from ? *fromlen : 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = NULL; msg.msg_controllen = 0; ret = rtdm_recvmsg(s, &msg, flags); if (ret < 0) return ret; if (from) *fromlen = msg.msg_namelen; return ret; } static inline ssize_t rtdm_recv(int s, void *buf, size_t len, int flags) { return rtdm_recvfrom(s, buf, len, flags, NULL, NULL); } static inline ssize_t rtdm_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) { struct user_msghdr msg; struct iovec iov; 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 rtdm_sendmsg(s, &msg, flags); } static inline ssize_t rtdm_send(int s, const void *buf, size_t len, int flags) { return rtdm_sendto(s, buf, len, flags, NULL, 0); } static inline int rtdm_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) { struct _rtdm_getsockopt_args args = { level, optname, optval, optlen }; return rtdm_ioctl(s, _RTIOC_GETSOCKOPT, &args); } static inline int rtdm_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) { struct _rtdm_setsockopt_args args = { level, optname, (void *)optval, optlen }; return rtdm_ioctl(s, _RTIOC_SETSOCKOPT, &args); } static inline int rtdm_bind(int s, const struct sockaddr *my_addr, socklen_t addrlen) { struct _rtdm_setsockaddr_args args = { my_addr, addrlen }; return rtdm_ioctl(s, _RTIOC_BIND, &args); } static inline int rtdm_connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen) { struct _rtdm_setsockaddr_args args = { serv_addr, addrlen }; return rtdm_ioctl(s, _RTIOC_CONNECT, &args); } static inline int rtdm_listen(int s, int backlog) { return rtdm_ioctl(s, _RTIOC_LISTEN, backlog); } static inline int rtdm_accept(int s, struct sockaddr *addr, socklen_t *addrlen) { struct _rtdm_getsockaddr_args args = { addr, addrlen }; return rtdm_ioctl(s, _RTIOC_ACCEPT, &args); } static inline int rtdm_getsockname(int s, struct sockaddr *name, socklen_t *namelen) { struct _rtdm_getsockaddr_args args = { name, namelen }; return rtdm_ioctl(s, _RTIOC_GETSOCKNAME, &args); } static inline int rtdm_getpeername(int s, struct sockaddr *name, socklen_t *namelen) { struct _rtdm_getsockaddr_args args = { name, namelen }; return rtdm_ioctl(s, _RTIOC_GETPEERNAME, &args); } static inline int rtdm_shutdown(int s, int how) { return rtdm_ioctl(s, _RTIOC_SHUTDOWN, how); } #endif /* _COBALT_RTDM_RTDM_H */