--- /dev/null
+/**************************************************************/
+/* CAN system calls example */
+/* Author: Michal Sojka, Czech Technical University in Prague */
+/* License: Public domain */
+/**************************************************************/
+
+#include "common.h"
+
+#include <linux/can.h>
+#include <net/if.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+int init_write_socket(const char *dev)
+{
+ int sock;
+ struct sockaddr_can addr;
+ struct ifreq ifr;
+
+ sock = CHECK(socket(PF_CAN, SOCK_RAW, CAN_RAW));
+
+ strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
+ if (-1 == ioctl(sock, SIOCGIFINDEX, &ifr)) {
+ perror(dev);
+ exit(1);
+ }
+
+ addr.can_family = AF_CAN;
+ addr.can_ifindex = ifr.ifr_ifindex;
+
+ CHECK(bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
+
+ return sock;
+}
+
+void can_write(int sock, struct can_frame *cf)
+{
+ int ret = write(sock, cf, sizeof(*cf));
+
+ if (ret != sizeof(*cf)) {
+ perror("write");
+ exit(1);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ const char *dev;
+ int sock, i, count;
+ struct can_frame cf[100];
+
+ dev = cansend_parse_args(argc, argv, &count, cf, 100);
+
+ sock = init_write_socket(dev);
+
+ for (i = 0; i < count; i++)
+ can_write(sock, &cf[i]);
+
+ return 0;
+}