]> rtime.felk.cvut.cz Git - sojka/can-syscalls-examples.git/blob - candump-read.c
Add README
[sojka/can-syscalls-examples.git] / candump-read.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_read_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_read(int sock)
40 {
41         struct can_frame cf;
42         int ret = read(sock, &cf, sizeof(cf));
43
44         if (ret != sizeof(cf)) {
45                 perror("read");
46                 exit(1);
47         }
48
49         print_can_frame(&cf);
50 }
51
52 int main(int argc, char *argv[])
53 {
54         const char *dev;
55         int sock;
56
57         dev = candump_parse_args(argc, argv);
58
59         sock = init_read_socket(dev);
60
61         while (1)
62                 can_read(sock);
63 }