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