From cd89f0b340764e73de76f5297217caf61b3d3283 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Tue, 13 Dec 2022 16:05:00 +0100 Subject: [PATCH] gps2udp: Add a label, timestamp and mac address to each report Rebase of 0001-gps2udp-Add-a-label-timestamp-and-mac-address-to-eac.patch we have been carrying: From 19a55075d4e60e07d03d49937cd2a4d9239d00a4 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 22 Aug 2014 09:55:19 +0200 Subject: [PATCH] gps2udp: Add a label, timestamp and mac address to each report --- clients/gps2udp.c | 61 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/clients/gps2udp.c b/clients/gps2udp.c index 2d9c6033d..d27814f24 100644 --- a/clients/gps2udp.c +++ b/clients/gps2udp.c @@ -22,6 +22,7 @@ #include // for getopt_long() #endif #include /* for gethostbyname() */ +#include #include #include #include @@ -29,6 +30,7 @@ // do not use strsep() it is not POSIX #include /* for strlcpy(), strtok(), etc. */ #include +#include #include #include #include @@ -60,6 +62,9 @@ static unsigned int flags; static unsigned int debug = 0; static bool aisonly = false; static bool tpvonly = false; +static const char *label; +static const char *mac; +static char *mac_string; // return local time hh:mm:ss static char* time2string(void) @@ -82,6 +87,7 @@ static char* time2string(void) static int send_udp(char *nmeastring, size_t ind) { + char output[1024]; char message[MAX_PACKET_LENGTH]; char *buffer; int channel; @@ -108,6 +114,16 @@ static int send_udp(char *nmeastring, size_t ind) buffer[ind] = '\n'; ind++; buffer[ind] = '\0'; + /* copy once more for the label */ + if (label) + snprintf(output, 1024, "%s,%llu,%s,%s", + label, (unsigned long long ) time(NULL), mac_string, buffer); + else + snprintf(output, 1024, "%s", buffer); + + output[1023] = '\0'; + ind = strlen(output); + if (0 == (flags & WATCH_JSON) && '{' == buffer[0]) { // do not send JSON when not configured to do so @@ -129,7 +145,7 @@ static int send_udp(char *nmeastring, size_t ind) // send message on udp channel for (channel=0; channel < udpchannel; channel ++) { ssize_t status = sendto(sock[channel], - buffer, + output, ind, 0, (struct sockaddr *)&remote[channel], @@ -225,6 +241,8 @@ static void usage(void) " -c COUNT Exit after count packets.\n" " -d [0-2] 1 display sent packets, " "2 display ignored packets.\n" + " -l [NAME] A label to be used for the output\n" + " -m [IF_NAME] The interface to extract the mac from\n" " -h Show this help.\n" " -j Feed JSON.\n" " -n Feed NMEA.\n" @@ -421,7 +439,7 @@ int main(int argc, char **argv) bool daemonize = false; long count = -1; char *udphostport[MAX_UDP_DEST]; - const char *optstring = "?abc:d:hjntu:V"; + const char *optstring = "?abc:d:l:m:hjntu:V"; #ifdef HAVE_GETOPT_LONG int option_index = 0; static struct option long_options[] = { @@ -478,6 +496,12 @@ int main(int argc, char **argv) if (0 < debug) (void)fprintf(stdout, "Debug %u selected\n", debug); break; + case 'l': + label = optarg; + break; + case 'm': + mac = optarg; + break; case 'j': if (0 < debug) (void)fprintf(stdout, "JSON selected\n"); @@ -520,6 +544,39 @@ int main(int argc, char **argv) } } + if (label && !mac) { + fprintf(stderr, "Need to specify the ethernet device to find the mac.\n"); + exit(EXIT_FAILURE); + } + if (mac && strlen(mac) >= IFNAMSIZ) { + fprintf(stderr, "Interface name is too long.\n"); + exit(EXIT_FAILURE); + } else if (mac) { + struct ifreq addr = { }; + int fd, rc; + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) { + fprintf(stderr, "Failed to open socket.\n"); + exit(EXIT_FAILURE); + } + memcpy(&addr.ifr_name, mac, strlen(mac)); + rc = ioctl(fd, SIOCGIFHWADDR, &addr); + close(fd); + if (rc < 0) { + fprintf(stderr, "Failed to query address.\n"); + exit(EXIT_FAILURE); + } + mac_string = malloc(40 * sizeof(char)); + snprintf(mac_string, 40, + "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", + addr.ifr_hwaddr.sa_data[0] & 0xff, + addr.ifr_hwaddr.sa_data[1] & 0xff, + addr.ifr_hwaddr.sa_data[2] & 0xff, + addr.ifr_hwaddr.sa_data[3] & 0xff, + addr.ifr_hwaddr.sa_data[4] & 0xff, + addr.ifr_hwaddr.sa_data[5] & 0xff); + } + // Grok the server, port, and device. if (optind < argc) { gpsd_source_spec(argv[optind], &gpsd_source); -- 2.34.1