]> rtime.felk.cvut.cz Git - sojka/can-utils.git/blobdiff - cangen.c
candump: add option -e to dump error messages in human readable format
[sojka/can-utils.git] / cangen.c
index df6b77f60d594a07af5f259f93dc1634f78b681f..95dfa46ad43f7e90787b2c806af0cea64b380c69 100644 (file)
--- a/cangen.c
+++ b/cangen.c
@@ -95,6 +95,8 @@ void print_usage(char *prg)
                " generation mode - see below)\n");
        fprintf(stderr, "         -p <timeout>  (poll on -ENOBUFS to write frames"
                " with <timeout> ms)\n");
+       fprintf(stderr, "         -n <count>    (terminate after <count> CAN frames "
+               "- default infinite)\n");
        fprintf(stderr, "         -i            (ignore -ENOBUFS return values on"
                " write() syscalls)\n");
        fprintf(stderr, "         -x            (disable local loopback of "
@@ -139,6 +141,7 @@ int main(int argc, char **argv)
        unsigned char dlc_mode = MODE_RANDOM;
        unsigned char loopback_disable = 0;
        unsigned char verbose = 0;
+       int count = 0;
        uint64_t incdata = 0;
 
        int opt;
@@ -152,12 +155,17 @@ int main(int argc, char **argv)
        struct ifreq ifr;
 
        struct timespec ts;
+       struct timeval now;
+
+       /* set seed value for pseudo random numbers */
+       gettimeofday(&now, NULL);
+       srandom(now.tv_usec);
 
        signal(SIGTERM, sigterm);
        signal(SIGHUP, sigterm);
        signal(SIGINT, sigterm);
 
-       while ((opt = getopt(argc, argv, "ig:eI:L:D:xp:vh?")) != -1) {
+       while ((opt = getopt(argc, argv, "ig:eI:L:D:xp:n:vh?")) != -1) {
                switch (opt) {
 
                case 'i':
@@ -220,6 +228,14 @@ int main(int argc, char **argv)
                        polltimeout = strtoul(optarg, NULL, 10);
                        break;
 
+               case 'n':
+                       count = atoi(optarg);
+                       if (count < 1) {
+                               print_usage(basename(argv[0]));
+                               return 1;
+                       }
+                       break;
+
                case '?':
                case 'h':
                default:
@@ -302,6 +318,9 @@ int main(int argc, char **argv)
 
        while (running) {
 
+               if (count && (--count == 0))
+                       running = 0;
+
                if (id_mode == MODE_RANDOM) {
 
                        frame.can_id = random();
@@ -341,6 +360,7 @@ int main(int argc, char **argv)
                                fprint_canframe(stdout, &frame, "\n", 1);
                }
 
+resend:
                nbytes = write(s, &frame, sizeof(struct can_frame));
                if (nbytes < 0) {
                        if (errno != ENOBUFS) {
@@ -356,7 +376,8 @@ int main(int argc, char **argv)
                                if (poll(&fds, 1, polltimeout) < 0) {
                                        perror("poll");
                                        return 1;
-                               }
+                               } else
+                                       goto resend;
                        } else
                                enobufs_count++;