1 /**************************************************************/
2 /* CAN system calls example */
3 /* Author: Michal Sojka, Czech Technical University in Prague */
4 /* License: Public domain */
5 /**************************************************************/
11 #include <linux/can.h>
17 #include <sys/ioctl.h>
18 #include <sys/socket.h>
22 struct mmsghdr msgs[MMSG_MAX];
23 struct iovec iovecs[MMSG_MAX];
24 struct can_frame cf[MMSG_MAX];
26 int init_sendmmsg(const char *dev)
29 struct sockaddr_can addr;
32 sock = CHECK(socket(PF_CAN, SOCK_RAW, CAN_RAW));
34 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
35 if (-1 == ioctl(sock, SIOCGIFINDEX, &ifr)) {
40 addr.can_family = AF_CAN;
41 addr.can_ifindex = ifr.ifr_ifindex;
43 CHECK(bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
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;
57 void can_sendmmsg(int sock, int count)
59 CHECK(sendmmsg(sock, msgs, count, 0));
62 int main(int argc, char *argv[])
67 dev = cansend_parse_args(argc, argv, &count, cf, MMSG_MAX);
69 sock = init_sendmmsg(dev);
71 can_sendmmsg(sock, count);