]> rtime.felk.cvut.cz Git - sojka/can-syscalls-examples.git/blobdiff - cansend-write.c
Add cansend examples
[sojka/can-syscalls-examples.git] / cansend-write.c
diff --git a/cansend-write.c b/cansend-write.c
new file mode 100644 (file)
index 0000000..87d31b1
--- /dev/null
@@ -0,0 +1,63 @@
+/**************************************************************/
+/* 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;
+}