]> rtime.felk.cvut.cz Git - sojka/can-syscalls-examples.git/blob - cansend-sendmmsg.c
Add README
[sojka/can-syscalls-examples.git] / cansend-sendmmsg.c
1 /**************************************************************/
2 /* CAN system calls example                                   */
3 /* Author: Michal Sojka, Czech Technical University in Prague */
4 /* License: Public domain                                     */
5 /**************************************************************/
6
7 #define _GNU_SOURCE
8
9 #include "common.h"
10
11 #include <linux/can.h>
12 #include <net/if.h>
13 #include <unistd.h>
14 #include <fcntl.h>
15 #include <stdbool.h>
16 #include <string.h>
17 #include <sys/ioctl.h>
18 #include <sys/socket.h>
19
20 #define MMSG_MAX 64
21
22 struct mmsghdr msgs[MMSG_MAX];
23 struct iovec iovecs[MMSG_MAX];
24 struct can_frame cf[MMSG_MAX];
25
26 int init_sendmmsg(const char *dev)
27 {
28         int sock, i;
29         struct sockaddr_can addr;
30         struct ifreq ifr;
31
32         sock = CHECK(socket(PF_CAN, SOCK_RAW, CAN_RAW));
33
34         strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
35         if (-1 == ioctl(sock, SIOCGIFINDEX, &ifr)) {
36                 perror(dev);
37                 exit(1);
38         }
39
40         addr.can_family = AF_CAN;
41         addr.can_ifindex = ifr.ifr_ifindex;
42
43         CHECK(bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
44
45         memset(msgs, 0, sizeof(msgs));
46         memset(iovecs, 0, sizeof(iovecs));
47         for (i = 0; i < MMSG_MAX; i++) {
48                 iovecs[i].iov_base         = &cf[i];
49                 iovecs[i].iov_len          = sizeof(cf[i]);
50                 msgs[i].msg_hdr.msg_iov    = &iovecs[i];
51                 msgs[i].msg_hdr.msg_iovlen = 1;
52         }
53
54         return sock;
55 }
56
57 void can_sendmmsg(int sock, int count)
58 {
59         CHECK(sendmmsg(sock, msgs, count, 0));
60 }
61
62 int main(int argc, char *argv[])
63 {
64         const char *dev;
65         int sock, count;
66
67         dev = cansend_parse_args(argc, argv, &count, cf, MMSG_MAX);
68
69         sock = init_sendmmsg(dev);
70
71         can_sendmmsg(sock, count);
72
73         return 0;
74 }