18 #include <sys/ioctl.h>
19 #include <linux/can.h>
26 const int out = -abs(errno);
47 const size_t iface_name_size = strlen(can_iface_name) + 1;
48 if (iface_name_size > IFNAMSIZ)
53 const int fd = socket(PF_CAN, SOCK_RAW | SOCK_NONBLOCK,
CAN_RAW);
60 memset(&ifr, 0,
sizeof(ifr));
61 memcpy(ifr.ifr_name, can_iface_name, iface_name_size);
63 const int ioctl_result = ioctl(fd, SIOCGIFINDEX, &ifr);
69 struct sockaddr_can addr;
70 memset(&addr, 0,
sizeof(addr));
72 addr.can_ifindex = ifr.ifr_ifindex;
74 const int bind_result = bind(fd, (
struct sockaddr*)&addr,
sizeof(addr));
91 const int close_result = close(ins->
fd);
99 memset(&fds, 0,
sizeof(fds));
101 fds.events |= POLLOUT;
103 const int poll_result = poll(&fds, 1, timeout_msec);
108 if (poll_result == 0)
117 struct can_frame transmit_frame;
118 memset(&transmit_frame, 0,
sizeof(transmit_frame));
119 transmit_frame.can_id =
frame->
id;
120 transmit_frame.can_dlc =
frame->data_len;
123 const ssize_t nbytes = write(ins->
fd, &transmit_frame,
sizeof(transmit_frame));
128 if ((
size_t)nbytes !=
sizeof(transmit_frame))
139 memset(&fds, 0,
sizeof(fds));
141 fds.events |= POLLIN;
143 const int poll_result = poll(&fds, 1, timeout_msec);
148 if (poll_result == 0)
157 struct can_frame receive_frame;
158 const ssize_t nbytes = read(ins->
fd, &receive_frame,
sizeof(receive_frame));
163 if ((
size_t)nbytes !=
sizeof(receive_frame))
168 if (receive_frame.can_dlc > CAN_MAX_DLEN)
173 out_frame->id = receive_frame.can_id;
174 out_frame->data_len = receive_frame.can_dlc;
175 memcpy(out_frame->data, &receive_frame.data, receive_frame.can_dlc);