canutils: update to 2023.03
authorRosen Penev <redacted>
Sun, 12 May 2024 22:24:39 +0000 (15:24 -0700)
committerRosen Penev <redacted>
Tue, 14 May 2024 23:36:46 +0000 (16:36 -0700)
Fixes compilation with GCC 14.

Removed can-calc-bit-timing. No longer present.

Backport time_t patch to prevent crashing under 32-bit systems.

Switched to local git tarballs. Smaller.

Signed-off-by: Rosen Penev <redacted>
utils/canutils/Makefile
utils/canutils/patches/010-sane.patch [deleted file]
utils/canutils/patches/010-time.h [new file with mode: 0644]

index f1a5d6085739012af018697d2244698f19e85c9c..55d36f421748b6f6156c7062c4ba74ee78bb0a37 100644 (file)
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=canutils
-PKG_VERSION:=2021.08.0
-PKG_RELEASE:=2
+PKG_VERSION:=2023.03
+PKG_RELEASE:=1
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://codeload.github.com/linux-can/can-utils/tar.gz/v$(PKG_VERSION)?
-PKG_HASH:=c9b8f29515ad34af7f78450ec55c983abc5393e86b1f128a92ac0dfd141baaf7
-PKG_BUILD_DIR:=$(BUILD_DIR)/can-utils-$(PKG_VERSION)
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_VERSION:=v$(PKG_VERSION)
+PKG_SOURCE_URL:=https://github.com/linux-can/can-utils
+PKG_MIRROR_HASH:=bea66321c9cea53f44ace2357ca3829a77dbf5d399a09ed0798a659d682d1afa
 
 PKG_MAINTAINER:=Anton Glukhov <anton.a.glukhov@gmail.com>
 PKG_LICENSE:=GPL-2.0-or-later
@@ -48,7 +48,7 @@ define GenPlugin
 endef
 
 FILES:= \
-       asc2log bcmserver canbusload can-calc-bit-timing \
+       asc2log bcmserver canbusload \
        candump canfdtest cangen cangw canlogserver canplayer \
        cansend cansniffer isotpdump isotpperf isotprecv isotpsend \
        isotpserver isotpsniffer isotptun j1939acd j1939cat j1939spy j1939sr \
diff --git a/utils/canutils/patches/010-sane.patch b/utils/canutils/patches/010-sane.patch
deleted file mode 100644 (file)
index d30477d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From e370ad5256f4a0b37f70a5b2e4a56f2c37235026 Mon Sep 17 00:00:00 2001
-From: Rosen Penev <rosenp@gmail.com>
-Date: Sun, 2 Jan 2022 15:21:50 -0800
-Subject: [PATCH] testj1939: fix 64-bit types for some platforms
-
-Revert commit that introduced PRIx64 to print an __u64, and added
-define to get the same types on all platforms.
-
-With __SANE_USERSPACE_TYPES__ the Linux headers use an unsigned long
-long for __u64 on all platforms, especially MIPS64.
-
-Fixes: eb9cfac9543b ("use PRIx64")
-Signed-off-by: Rosen Penev <rosenp@gmail.com>
-Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
----
- libj1939.h  | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/libj1939.h
-+++ b/libj1939.h
-@@ -10,6 +10,9 @@
-  * as published by the Free Software Foundation
-  */
-+/* needed on some 644 bit platforms to get consistent 64-bit types */
-+#define __SANE_USERSPACE_TYPES__
-+
- #include <sys/socket.h>
- #include <linux/can.h>
- #include <linux/can/j1939.h>
diff --git a/utils/canutils/patches/010-time.h b/utils/canutils/patches/010-time.h
new file mode 100644 (file)
index 0000000..08d4c23
--- /dev/null
@@ -0,0 +1,397 @@
+From ceda93bd5c56927c72d48dcaa30e17d6ecea86b8 Mon Sep 17 00:00:00 2001
+From: TyK <tisyang@gmail.com>
+Date: Mon, 27 Nov 2023 10:59:21 +0800
+Subject: [PATCH] timestamp formatting: always use 64-bit for timesstamp
+ formatting.
+
+Using C99 `unsigned long long` to format `struct timeval`'s `tv_sec`
+and `tv_usec`, fix incorrect print under some 32bit platform which
+ using time64.
+---
+ asc2log.c      | 38 +++++++++++++++++++++++---------------
+ candump.c      |  6 +++---
+ canlogserver.c |  4 ++--
+ canplayer.c    |  9 +++++++--
+ isotpdump.c    |  8 ++++----
+ isotpperf.c    |  4 ++--
+ isotpsniffer.c |  6 +++---
+ j1939cat.c     |  4 ++--
+ j1939spy.c     |  6 +++---
+ log2asc.c      | 11 +++++++----
+ slcanpty.c     |  4 ++--
+ 11 files changed, 58 insertions(+), 42 deletions(-)
+
+--- a/asc2log.c
++++ b/asc2log.c
+@@ -73,7 +73,7 @@ void print_usage(char *prg)
+ void prframe(FILE *file, struct timeval *tv, int dev, struct canfd_frame *cf, unsigned int max_dlen, char *extra_info) {
+-      fprintf(file, "(%lu.%06lu) ", tv->tv_sec, tv->tv_usec);
++      fprintf(file, "(%llu.%06llu) ", (unsigned long long)tv->tv_sec, (unsigned long long)tv->tv_usec);
+       if (dev > 0)
+               fprintf(file, "can%d ", dev-1);
+@@ -141,11 +141,14 @@ void eval_can(char* buf, struct timeval
+       char dir[3]; /* 'Rx' or 'Tx' plus terminating zero */
+       char *extra_info;
+       int i, items;
++      unsigned long long sec, usec;
+       /* check for ErrorFrames */
+-      if (sscanf(buf, "%lu.%lu %d %s",
+-                 &read_tv.tv_sec, &read_tv.tv_usec,
++      if (sscanf(buf, "%llu.%llu %d %s",
++                 &sec, &usec,
+                  &interface, tmp1) == 4) {
++              read_tv.tv_sec = sec;
++              read_tv.tv_usec = usec;
+               if (!strncmp(tmp1, "ErrorFrame", strlen("ErrorFrame"))) {
+@@ -165,18 +168,20 @@ void eval_can(char* buf, struct timeval
+       /* check for CAN frames with (hexa)decimal values */
+       if (base == 'h')
+-              items = sscanf(buf, "%lu.%lu %d %s %2s %c %x %x %x %x %x %x %x %x %x",
+-                             &read_tv.tv_sec, &read_tv.tv_usec, &interface,
++              items = sscanf(buf, "%llu.%llu %d %s %2s %c %x %x %x %x %x %x %x %x %x",
++                             &sec, &usec, &interface,
+                              tmp1, dir, &rtr, &dlc,
+                              &data[0], &data[1], &data[2], &data[3],
+                              &data[4], &data[5], &data[6], &data[7]);
+       else
+-              items = sscanf(buf, "%lu.%lu %d %s %2s %c %x %d %d %d %d %d %d %d %d",
+-                             &read_tv.tv_sec, &read_tv.tv_usec, &interface,
++              items = sscanf(buf, "%llu.%llu %d %s %2s %c %x %d %d %d %d %d %d %d %d",
++                             &sec, &usec, &interface,
+                              tmp1, dir, &rtr, &dlc,
+                              &data[0], &data[1], &data[2], &data[3],
+                              &data[4], &data[5], &data[6], &data[7]);
++      read_tv.tv_sec = sec;
++      read_tv.tv_usec = usec;
+       if (items < 7 ) /* make sure we've read the dlc */
+               return;
+@@ -246,6 +251,7 @@ void eval_canfd(char* buf, struct timeva
+       char *extra_info;
+       char *ptr;
+       int i;
++      unsigned long long sec, usec;
+       /* The CANFD format is mainly in hex representation but <DataLength>
+          and probably some content we skip anyway. Don't trust the docs! */
+@@ -255,19 +261,21 @@ void eval_canfd(char* buf, struct timeva
+          100000  214   223040 80000000 46500250 460a0250 20011736 20010205 */
+       /* check for valid line without symbolic name */
+-      if (sscanf(buf, "%lu.%lu %*s %d %2s %s %hhx %hhx %x %d ",
+-                 &read_tv.tv_sec, &read_tv.tv_usec, &interface,
++      if (sscanf(buf, "%llu.%llu %*s %d %2s %s %hhx %hhx %x %d ",
++                 &sec, &usec, &interface,
+                  dir, tmp1, &brs, &esi, &dlc, &dlen) != 9) {
+               /* check for valid line with a symbolic name */
+-              if (sscanf(buf, "%lu.%lu %*s %d %2s %s %*s %hhx %hhx %x %d ",
+-                         &read_tv.tv_sec, &read_tv.tv_usec, &interface,
++              if (sscanf(buf, "%llu.%llu %*s %d %2s %s %*s %hhx %hhx %x %d ",
++                         &sec, &usec, &interface,
+                          dir, tmp1, &brs, &esi, &dlc, &dlen) != 9) {
+                       /* no valid CANFD format pattern */
+                       return;
+               }
+       }
++      read_tv.tv_sec = sec;
++      read_tv.tv_usec = usec;
+       /* check for allowed (unsigned) value ranges */
+       if ((dlen > CANFD_MAX_DLEN) || (dlc > CANFD_MAX_DLC) ||
+@@ -427,12 +435,12 @@ int main(int argc, char **argv)
+       FILE *infile = stdin;
+       FILE *outfile = stdout;
+       static int verbose;
+-      static struct timeval tmp_tv; /* tmp frame timestamp from ASC file */
+       static struct timeval date_tv; /* date of the ASC file */
+       static int dplace; /* decimal place 4, 5 or 6 or uninitialized */
+       static char base; /* 'd'ec or 'h'ex */
+       static char timestamps; /* 'a'bsolute or 'r'elative */
+       int opt;
++      unsigned long long sec, usec;
+       while ((opt = getopt(argc, argv, "I:O:v?")) != -1) {
+               switch (opt) {
+@@ -505,12 +513,12 @@ int main(int argc, char **argv)
+                                       gettimeofday(&date_tv, NULL);
+                               }
+                               if (verbose)
+-                                      printf("date %lu => %s", date_tv.tv_sec, ctime(&date_tv.tv_sec));
++                                      printf("date %llu => %s", (unsigned long long)date_tv.tv_sec, ctime(&date_tv.tv_sec));
+                               continue;
+                       }
+                       /* check for decimal places length in valid CAN frames */
+-                      if (sscanf(buf, "%lu.%s %s ", &tmp_tv.tv_sec, tmp2,
++                      if (sscanf(buf, "%llu.%s %s ", &sec, tmp2,
+                                  tmp1) != 3)
+                               continue; /* dplace remains zero until first found CAN frame */
+@@ -529,7 +537,7 @@ int main(int argc, char **argv)
+               /* so try to get CAN frames and ErrorFrames and convert them */
+               /* check classic CAN format or the CANFD tag which can take both types */
+-              if (sscanf(buf, "%lu.%lu %s ", &tmp_tv.tv_sec,  &tmp_tv.tv_usec, tmp1) == 3){
++              if (sscanf(buf, "%llu.%llu %s ", &sec,  &usec, tmp1) == 3){
+                       if (!strncmp(tmp1, "CANFD", 5))
+                               eval_canfd(buf, &date_tv, timestamps, dplace, outfile);
+                       else
+--- a/candump.c
++++ b/candump.c
+@@ -224,7 +224,7 @@ static inline void sprint_timestamp(cons
+ {
+       switch (timestamp) {
+       case 'a': /* absolute with timestamp */
+-              sprintf(ts_buffer, "(%010lu.%06lu) ", tv->tv_sec, tv->tv_usec);
++              sprintf(ts_buffer, "(%010llu.%06llu) ", (unsigned long long)tv->tv_sec, (unsigned long long)tv->tv_usec);
+               break;
+       case 'A': /* absolute with date */
+@@ -234,7 +234,7 @@ static inline void sprint_timestamp(cons
+               tm = *localtime(&tv->tv_sec);
+               strftime(timestring, 24, "%Y-%m-%d %H:%M:%S", &tm);
+-              sprintf(ts_buffer, "(%s.%06lu) ", timestring, tv->tv_usec);
++              sprintf(ts_buffer, "(%s.%06llu) ", timestring, (unsigned long long)tv->tv_usec);
+       }
+       break;
+@@ -251,7 +251,7 @@ static inline void sprint_timestamp(cons
+                       diff.tv_sec--, diff.tv_usec += 1000000;
+               if (diff.tv_sec < 0)
+                       diff.tv_sec = diff.tv_usec = 0;
+-              sprintf(ts_buffer, "(%03lu.%06lu) ", diff.tv_sec, diff.tv_usec);
++              sprintf(ts_buffer, "(%03llu.%06llu) ", (unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_usec);
+               if (timestamp == 'd')
+                       *last_tv = *tv; /* update for delta calculation */
+--- a/canlogserver.c
++++ b/canlogserver.c
+@@ -408,8 +408,8 @@ int main(int argc, char **argv)
+                               idx = idx2dindex(addr.can_ifindex, s[i]);
+-                              sprintf(temp, "(%lu.%06lu) %*s ",
+-                                      tv.tv_sec, tv.tv_usec, max_devname_len, devname[idx]);
++                              sprintf(temp, "(%llu.%06llu) %*s ",
++                                      (unsigned long long)tv.tv_sec, (unsigned long long)tv.tv_usec, max_devname_len, devname[idx]);
+                               sprint_canframe(temp+strlen(temp), &frame, 0, maxdlen); 
+                               strcat(temp, "\n");
+--- a/canplayer.c
++++ b/canplayer.c
+@@ -259,6 +259,7 @@ int main(int argc, char **argv)
+       int txidx;       /* sendto() interface index */
+       int eof, txmtu, i, j;
+       char *fret;
++      unsigned long long sec, usec;
+       while ((opt = getopt(argc, argv, "I:l:tin:g:s:xv?")) != -1) {
+               switch (opt) {
+@@ -419,11 +420,12 @@ int main(int argc, char **argv)
+               eof = 0;
+-              if (sscanf(buf, "(%lu.%lu) %s %s", &log_tv.tv_sec, &log_tv.tv_usec,
+-                         device, ascframe) != 4) {
++              if (sscanf(buf, "(%llu.%llu) %s %s", &sec, &usec, device, ascframe) != 4) {
+                       fprintf(stderr, "incorrect line format in logfile\n");
+                       return 1;
+               }
++              log_tv.tv_sec = sec;
++              log_tv.tv_usec = usec;
+               if (use_timestamps) { /* throttle sending due to logfile timestamps */
+@@ -505,11 +507,12 @@ int main(int argc, char **argv)
+                                       break;
+                               }
+-                              if (sscanf(buf, "(%lu.%lu) %s %s", &log_tv.tv_sec, &log_tv.tv_usec,
+-                                         device, ascframe) != 4) {
++                              if (sscanf(buf, "(%llu.%llu) %s %s", &sec, &usec, device, ascframe) != 4) {
+                                       fprintf(stderr, "incorrect line format in logfile\n");
+                                       return 1;
+                               }
++                              log_tv.tv_sec = sec;
++                              log_tv.tv_usec = usec;
+                               /*
+                                * ensure the fractions of seconds are 6 decimal places long to catch
+--- a/isotpdump.c
++++ b/isotpdump.c
+@@ -361,7 +361,7 @@ int main(int argc, char **argv)
+                       switch (timestamp) {
+                       case 'a': /* absolute with timestamp */
+-                              printf("(%lu.%06lu) ", tv.tv_sec, tv.tv_usec);
++                              printf("(%llu.%06llu) ", (unsigned long long)tv.tv_sec, (unsigned long long)tv.tv_usec);
+                               break;
+                       case 'A': /* absolute with date */
+@@ -372,7 +372,7 @@ int main(int argc, char **argv)
+                               tm = *localtime(&tv.tv_sec);
+                               strftime(timestring, 24, "%Y-%m-%d %H:%M:%S",
+                                        &tm);
+-                              printf("(%s.%06lu) ", timestring, tv.tv_usec);
++                              printf("(%s.%06llu) ", timestring, (unsigned long long)tv.tv_usec);
+                       } break;
+                       case 'd': /* delta */
+@@ -388,8 +388,8 @@ int main(int argc, char **argv)
+                                       diff.tv_sec--, diff.tv_usec += 1000000;
+                               if (diff.tv_sec < 0)
+                                       diff.tv_sec = diff.tv_usec = 0;
+-                              printf("(%lu.%06lu) ", diff.tv_sec,
+-                                     diff.tv_usec);
++                              printf("(%llu.%06llu) ", (unsigned long long)diff.tv_sec,
++                                     (unsigned long long)diff.tv_usec);
+                               if (timestamp == 'd')
+                                       last_tv =
+--- a/isotpperf.c
++++ b/isotpperf.c
+@@ -403,9 +403,9 @@ int main(int argc, char **argv)
+                               /* check devisor to be not zero */
+                               if (diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000){
+-                                      printf("%lu.%06lus ", diff_tv.tv_sec, diff_tv.tv_usec);
++                                      printf("%llu.%06llus ", (unsigned long long)diff_tv.tv_sec, (unsigned long long)diff_tv.tv_usec);
+                                       printf("=> %lu byte/s", (fflen * 1000) /
+-                                             (diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000));
++                                             (unsigned long)(diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000));
+                               } else
+                                       printf("(no time available)     ");
+--- a/isotpsniffer.c
++++ b/isotpsniffer.c
+@@ -101,7 +101,7 @@ void printbuf(unsigned char *buffer, int
+               switch (timestamp) {
+               case 'a': /* absolute with timestamp */
+-                      printf("(%lu.%06lu) ", tv->tv_sec, tv->tv_usec);
++                      printf("(%llu.%06llu) ", (unsigned long long)tv->tv_sec, (unsigned long long)tv->tv_usec);
+                       break;
+               case 'A': /* absolute with date */
+@@ -111,7 +111,7 @@ void printbuf(unsigned char *buffer, int
+                       tm = *localtime(&tv->tv_sec);
+                       strftime(timestring, 24, "%Y-%m-%d %H:%M:%S", &tm);
+-                      printf("(%s.%06lu) ", timestring, tv->tv_usec);
++                      printf("(%s.%06llu) ", timestring, (unsigned long long)tv->tv_usec);
+               }
+               break;
+@@ -128,7 +128,7 @@ void printbuf(unsigned char *buffer, int
+                               diff.tv_sec--, diff.tv_usec += 1000000;
+                       if (diff.tv_sec < 0)
+                               diff.tv_sec = diff.tv_usec = 0;
+-                      printf("(%lu.%06lu) ", diff.tv_sec, diff.tv_usec);
++                      printf("(%llu.%06llu) ", (unsigned long long)diff.tv_sec, (unsigned long long)diff.tv_usec);
+                       if (timestamp == 'd')
+                               *last_tv = *tv; /* update for delta calculation */
+--- a/j1939cat.c
++++ b/j1939cat.c
+@@ -148,8 +148,8 @@ static void j1939cat_print_timestamp(str
+       if (!(cur->tv_sec | cur->tv_nsec))
+               return;
+-      fprintf(stderr, "  %s: %lu s %lu us (seq=%03u, send=%07u)",
+-                      name, cur->tv_sec, cur->tv_nsec / 1000,
++      fprintf(stderr, "  %s: %llu s %llu us (seq=%03u, send=%07u)",
++                      name, (unsigned long long)cur->tv_sec, (unsigned long long)cur->tv_nsec / 1000,
+                       stats->tskey, stats->send);
+       fprintf(stderr, "\n");
+--- a/j1939spy.c
++++ b/j1939spy.c
+@@ -267,15 +267,15 @@ int main(int argc, char **argv)
+                               tdut = ttmp;
+                               goto abs_time;
+                       } else if ('a' == s.time) {
+-                              abs_time:
+-                              printf("(%lu.%04lu)", tdut.tv_sec, tdut.tv_usec / 100);
++abs_time:
++                              printf("(%llu.%04llu)", (unsigned long long)tdut.tv_sec, (unsigned long long)tdut.tv_usec / 100);
+                       } else if ('A' == s.time) {
+                               struct tm tm;
+                               tm = *localtime(&tdut.tv_sec);
+-                              printf("(%04u%02u%02uT%02u%02u%02u.%04lu)",
++                              printf("(%04u%02u%02uT%02u%02u%02u.%04llu)",
+                                       tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
+                                       tm.tm_hour, tm.tm_min, tm.tm_sec,
+-                                      tdut.tv_usec/100);
++                                      (unsigned long long)tdut.tv_usec/100);
+                       }
+               }
+               printf(" %s ", libj1939_addr2str(&src));
+--- a/log2asc.c
++++ b/log2asc.c
+@@ -190,6 +190,7 @@ int main(int argc, char **argv)
+       FILE *infile = stdin;
+       FILE *outfile = stdout;
+       static int maxdev, devno, i, crlf, fdfmt, nortrdlc, d4, opt, mtu;
++      unsigned long long sec, usec;
+       while ((opt = getopt(argc, argv, "I:O:4nfr?")) != -1) {
+               switch (opt) {
+@@ -259,18 +260,20 @@ int main(int argc, char **argv)
+               if (buf[0] != '(')
+                       continue;
+-              if (sscanf(buf, "(%lu.%lu) %s %s %s", &tv.tv_sec, &tv.tv_usec,
++              if (sscanf(buf, "(%llu.%llu) %s %s %s", &sec, &usec,
+                          device, ascframe, extra_info) != 5) {
+                       /* do not evaluate the extra info */
+                       extra_info[0] = 0;
+-                      if (sscanf(buf, "(%lu.%lu) %s %s", &tv.tv_sec, &tv.tv_usec,
++                      if (sscanf(buf, "(%llu.%llu) %s %s", &sec, &usec,
+                                  device, ascframe) != 4) {
+                               fprintf(stderr, "incorrect line format in logfile\n");
+                               return 1;
+                       }
+               }
++              tv.tv_sec = sec;
++              tv.tv_usec = usec;
+               if (!start_tv.tv_sec) { /* print banner */
+                       start_tv = tv;
+@@ -305,9 +308,9 @@ int main(int argc, char **argv)
+                               tv.tv_sec = tv.tv_usec = 0;
+                       if (d4)
+-                              fprintf(outfile, "%4lu.%04lu ", tv.tv_sec, tv.tv_usec/100);
++                              fprintf(outfile, "%4llu.%04llu ", (unsigned long long)tv.tv_sec, (unsigned long long)tv.tv_usec/100);
+                       else
+-                              fprintf(outfile, "%4lu.%06lu ", tv.tv_sec, tv.tv_usec);
++                              fprintf(outfile, "%4llu.%06llu ", (unsigned long long)tv.tv_sec, (unsigned long long)tv.tv_usec);
+                       if ((mtu == CAN_MTU) && (fdfmt == 0))
+                               can_asc(&cf, devno, nortrdlc, extra_info, outfile);
+--- a/slcanpty.c
++++ b/slcanpty.c
+@@ -363,8 +363,8 @@ int can2pty(int pty, int socket, int *ts
+               if (ioctl(socket, SIOCGSTAMP, &tv) < 0)
+                       perror("SIOCGSTAMP");
+-              sprintf(&buf[ptr + 2*frame.can_dlc], "%04lX",
+-                      (tv.tv_sec%60)*1000 + tv.tv_usec/1000);
++              sprintf(&buf[ptr + 2*frame.can_dlc], "%04llX",
++                      (unsigned long long)(tv.tv_sec%60)*1000 + tv.tv_usec/1000);
+       }
+       strcat(buf, "\r"); /* add terminating character */
git clone https://git.99rst.org/PROJECT