]> rtime.felk.cvut.cz Git - can-utils.git/blobdiff - slcand.c
candump: Enable HW timestamping before using it
[can-utils.git] / slcand.c
index b72fa4e8eeb756a7c5fc9ec4ef1f790899e83864..a8b62f2f5daa7c90b4c223312ef96ab48481f572 100644 (file)
--- a/slcand.c
+++ b/slcand.c
@@ -37,9 +37,8 @@
 #include <sys/ioctl.h>
 #include <net/if.h>
 #include <termios.h>
-
-/* default slcan line discipline since Kernel 2.6.25 */
-#define LDISC_N_SLCAN 17
+#include <linux/tty.h>
+#include <linux/sockios.h>
 
 /* Change this to whatever your daemon is called */
 #define DAEMON_NAME "slcand"
@@ -61,6 +60,7 @@ void print_usage(char *prg)
        fprintf(stderr, "Options: -o         (send open command 'O\\r')\n");
        fprintf(stderr, "         -c         (send close command 'C\\r')\n");
        fprintf(stderr, "         -f         (read status flags with 'F\\r' to reset error states)\n");
+       fprintf(stderr, "         -l         (send listen only command 'L\\r', overrides -o)\n");
        fprintf(stderr, "         -s <speed> (set CAN speed 0..8)\n");
        fprintf(stderr, "         -S <speed> (set UART speed in baud)\n");
        fprintf(stderr, "         -t <type>  (set UART flow control type 'hw' or 'sw')\n");
@@ -172,6 +172,7 @@ int main(int argc, char *argv[])
        int opt;
        int send_open = 0;
        int send_close = 0;
+       int send_listen = 0;
        int send_read_status_flags = 0;
        char *speed = NULL;
        char *uart_speed_str = NULL;
@@ -180,12 +181,12 @@ int main(int argc, char *argv[])
        char *btr = NULL;
        int run_as_daemon = 1;
        char *pch;
-       int ldisc = LDISC_N_SLCAN;
+       int ldisc = N_SLCAN;
        int fd;
 
        ttypath[0] = '\0';
 
-       while ((opt = getopt(argc, argv, "ocfs:S:t:b:?hF")) != -1) {
+       while ((opt = getopt(argc, argv, "ocfls:S:t:b:?hF")) != -1) {
                switch (opt) {
                case 'o':
                        send_open = 1;
@@ -196,6 +197,9 @@ int main(int argc, char *argv[])
                case 'f':
                        send_read_status_flags = 1;
                        break;
+               case 'l':
+                       send_listen = 1;
+                       break;
                case 's':
                        speed = optarg;
                        if (strlen(speed) > 1)
@@ -326,7 +330,10 @@ int main(int argc, char *argv[])
                write(fd, buf, strlen(buf));
        }
 
-       if (send_open) {
+       if (send_listen) {
+               sprintf(buf, "L\r");
+               write(fd, buf, strlen(buf));
+       } else if (send_open) {
                sprintf(buf, "O\r");
                write(fd, buf, strlen(buf));
        }