Date: Sat, 7 Nov 2020 11:41:24 +0000 (UTC) From: =?UTF-8?Q?Stefan_E=c3=9fer?= <se@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r554387 - in head/deskutils/calendar: . files Message-ID: <202011071141.0A7BfOVj098553@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: se Date: Sat Nov 7 11:41:24 2020 New Revision: 554387 URL: https://svnweb.freebsd.org/changeset/ports/554387 Log: Fetch from my repository to simplify port Instead of fetching from a repository that was created based on a version that did not include the pre-processor enhancements applied to -CURRENT and patching to include them, fetch from a repository that has a copy of the latest sources. This change allows to remove the large number of complex patch files from the port and will simplify further updates. It is planned to make the port fetch from an official FreeBSD repository as soon as it is available with up-to-date sources from -CURRENT. No port revision bump since this is only a change to the build process and not the generated package. Deleted: head/deskutils/calendar/files/patch-calendar.1 head/deskutils/calendar/files/patch-calendar.c head/deskutils/calendar/files/patch-calendar.h head/deskutils/calendar/files/patch-dates.c head/deskutils/calendar/files/patch-events.c head/deskutils/calendar/files/patch-parsedata.c head/deskutils/calendar/files/patch-pathnames.h head/deskutils/calendar/files/patch-tests_Makefile head/deskutils/calendar/files/patch-tests_regress.s5.out Modified: head/deskutils/calendar/Makefile head/deskutils/calendar/distinfo head/deskutils/calendar/files/patch-Makefile head/deskutils/calendar/files/patch-io.c Modified: head/deskutils/calendar/Makefile ============================================================================== --- head/deskutils/calendar/Makefile Sat Nov 7 11:31:28 2020 (r554386) +++ head/deskutils/calendar/Makefile Sat Nov 7 11:41:24 2020 (r554387) @@ -12,8 +12,7 @@ LICENSE= BSD3CLAUSE RUN_DEPENDS= ${LOCALBASE}/share/calendar/calendar.all:deskutils/calendar-data USE_GITHUB= yes -GH_ACCOUNT= bsdimp -GH_TAGNAME= fcc5d31 +GH_ACCOUNT= stesser CFLAGS+= -D_PATH_LOCALBASE='\"${LOCALBASE}\"' LDFLAGS+= -lm -lutil Modified: head/deskutils/calendar/distinfo ============================================================================== --- head/deskutils/calendar/distinfo Sat Nov 7 11:31:28 2020 (r554386) +++ head/deskutils/calendar/distinfo Sat Nov 7 11:41:24 2020 (r554387) @@ -1,3 +1,3 @@ -TIMESTAMP = 1604699934 -SHA256 (bsdimp-calendar-0.9-fcc5d31_GH0.tar.gz) = ad7d0b51c4b834241aebbf6c50d187e5720f6c46c02615b27841a923e082aebc -SIZE (bsdimp-calendar-0.9-fcc5d31_GH0.tar.gz) = 132824 +TIMESTAMP = 1604748457 +SHA256 (stesser-calendar-0.9_GH0.tar.gz) = fc1c9befed9c103843c83fae3774e34873fa8b20dc1b9d6041dce8e1f7f4e7ac +SIZE (stesser-calendar-0.9_GH0.tar.gz) = 45355 Modified: head/deskutils/calendar/files/patch-Makefile ============================================================================== --- head/deskutils/calendar/files/patch-Makefile Sat Nov 7 11:31:28 2020 (r554386) +++ head/deskutils/calendar/files/patch-Makefile Sat Nov 7 11:41:24 2020 (r554387) @@ -1,8 +1,8 @@ ---- Makefile.orig 2020-10-18 03:01:26 UTC +--- Makefile.orig 2020-11-07 11:15:40 UTC +++ Makefile -@@ -1,117 +1,14 @@ +@@ -1,22 +1,14 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 - # $FreeBSD$ + # $FreeBSD: head/usr.bin/calendar/Makefile 367051 2020-10-26 03:26:18Z imp $ -.include <src.opts.mk> - @@ -10,11 +10,6 @@ -SRCS= calendar.c locale.c events.c dates.c parsedata.c io.c day.c \ - ostern.c paskha.c pom.c sunpos.c -LIBADD= m util --INTER= de_AT.ISO_8859-15 de_DE.ISO8859-1 fr_FR.ISO8859-1 \ -- hr_HR.ISO8859-2 hu_HU.ISO8859-2 pt_BR.ISO8859-1 \ -- pt_BR.UTF-8 ru_RU.KOI8-R ru_RU.UTF-8 uk_UA.KOI8-U --DE_LINKS= de_DE.ISO8859-15 --FR_LINKS= fr_FR.ISO8859-15 -.if ${MK_ICONV} == "yes" -CFLAGS+= -DWITH_ICONV @@ -23,104 +18,14 @@ + ostern.o paskha.o pom.o sunpos.o -FILESGROUPS+= CALS --CALS= calendars/calendar.all \ -- calendars/calendar.australia \ -- calendars/calendar.birthday \ -- calendars/calendar.brazilian \ -- calendars/calendar.christian \ -- calendars/calendar.computer \ -- calendars/calendar.croatian \ -- calendars/calendar.dutch \ -- calendars/calendar.freebsd \ -- calendars/calendar.french \ -- calendars/calendar.german \ -- calendars/calendar.history \ -- calendars/calendar.holiday \ -- calendars/calendar.hungarian \ -- calendars/calendar.judaic \ -- calendars/calendar.lotr \ -- calendars/calendar.music \ -- calendars/calendar.newzealand \ -- calendars/calendar.russian \ -- calendars/calendar.southafrica \ -- calendars/calendar.ukrainian \ -- calendars/calendar.usholiday \ -- calendars/calendar.world +-CALS= calendars/calendar.freebsd -CALSDIR= ${SHAREDIR}/calendar +LDFLAGS= -lm -lutil --CAL_de_AT.ISO_8859-15= calendar.feiertag -+all: ${PROG} - --CAL_de_DE.ISO8859-1= calendar.all \ -- calendar.feiertag \ -- calendar.geschichte \ -- calendar.kirche \ -- calendar.literatur \ -- calendar.musik \ -- calendar.wissenschaft -- --CAL_fr_FR.ISO8859-1= calendar.all \ -- calendar.fetes \ -- calendar.french \ -- calendar.jferies \ -- calendar.proverbes -- --CAL_hr_HR.ISO8859-2= calendar.all \ -- calendar.praznici -- --CAL_hu_HU.ISO8859-2= calendar.all \ -- calendar.nevnapok \ -- calendar.unnepek -- --CAL_pt_BR.ISO8859-1= calendar.all \ -- calendar.commemorative \ -- calendar.holidays \ -- calendar.mcommemorative -- --CAL_pt_BR.UTF-8= calendar.all \ -- calendar.commemorative \ -- calendar.holidays \ -- calendar.mcommemorative -- --CAL_ru_RU.KOI8-R= calendar.all \ -- calendar.common \ -- calendar.holiday \ -- calendar.military \ -- calendar.orthodox \ -- calendar.pagan -- --CAL_ru_RU.UTF-8= calendar.all \ -- calendar.common \ -- calendar.holiday \ -- calendar.military \ -- calendar.orthodox \ -- calendar.pagan -- --CAL_uk_UA.KOI8-U= calendar.all \ -- calendar.holiday \ -- calendar.misc \ -- calendar.orthodox -- --.for lang in ${INTER} --FILESGROUPS+= CALS_${lang} --CALS_${lang}DIR= ${SHAREDIR}/calendar/${lang} --.for file in ${CAL_${lang}} --CALS_${lang}+= ${file:S@^@calendars/${lang}/@} --.endfor --.endfor -- -- --.for link in ${DE_LINKS} --SYMLINKS+= de_DE.ISO8859-1 ${SHAREDIR}/calendar/${link} --.endfor --.for link in ${FR_LINKS} --SYMLINKS+= fr_FR.ISO8859-1 ${SHAREDIR}/calendar/${link} --.endfor -- -HAS_TESTS= -SUBDIR.${MK_TESTS}+= tests -- ++all: ${PROG} + -.include <bsd.prog.mk> +${PROG}: ${OBJS} + ${CC} ${OBJS} ${LDFLAGS} -o ${PROG} Modified: head/deskutils/calendar/files/patch-io.c ============================================================================== --- head/deskutils/calendar/files/patch-io.c Sat Nov 7 11:31:28 2020 (r554386) +++ head/deskutils/calendar/files/patch-io.c Sat Nov 7 11:41:24 2020 (r554387) @@ -1,547 +1,22 @@ ---- io.c.orig 2020-10-18 03:01:26 UTC +--- io.c.orig 2020-11-07 11:15:40 UTC +++ io.c -@@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$"); - #include <ctype.h> - #include <err.h> - #include <errno.h> --#include <langinfo.h> - #include <locale.h> - #include <pwd.h> - #include <stdbool.h> -@@ -71,10 +70,14 @@ enum { - }; +@@ -119,8 +119,6 @@ cal_fopen(const char *file) + FILE *fp; + char *home = getenv("HOME"); + unsigned int i; +- struct stat sb; +- static bool warned = false; - const char *calendarFile = "calendar"; /* default calendar file */ --static const char *calendarHomes[] = {".calendar", _PATH_INCLUDE}; /* HOME */ -+static const char *calendarHomes[] = {".calendar", _PATH_INCLUDE_LOCAL, _PATH_INCLUDE}; /* HOME */ - static const char *calendarNoMail = "nomail";/* don't sent mail if file exist */ - - static char path[MAXPATHLEN]; -+static const char *cal_home; -+static const char *cal_dir; -+static const char *cal_file; -+static int cal_line; - - struct fixs neaster, npaskha, ncny, nfullmoon, nnewmoon; - struct fixs nmarequinox, nsepequinox, njunsolstice, ndecsolstice; -@@ -85,22 +88,29 @@ static StringList *definitions = NULL; - static struct event *events[MAXCOUNT]; - static char *extradata[MAXCOUNT]; - --static void -+static char * - trimlr(char **buf) - { - char *walk = *buf; -+ char *sep; - char *last; - - while (isspace(*walk)) - walk++; -- if (*walk != '\0') { -- last = walk + strlen(walk) - 1; -+ *buf = walk; -+ -+ sep = walk; -+ while (*sep != '\0' && !isspace(*sep)) -+ sep++; -+ -+ if (*sep != '\0') { -+ last = sep + strlen(sep) - 1; - while (last > walk && isspace(*last)) - last--; - *(last+1) = 0; + if (home == NULL || *home == '\0') { + warnx("Cannot get home directory"); +@@ -145,10 +143,6 @@ cal_fopen(const char *file) } -- *buf = walk; -+ return (sep); - } - - static FILE * -@@ -116,7 +126,7 @@ cal_fopen(const char *file) - } - - if (chdir(home) != 0) { -- warnx("Cannot enter home directory"); -+ warnx("Cannot enter home directory \"%s\"", home); - return (NULL); - } - -@@ -124,8 +134,12 @@ cal_fopen(const char *file) - if (chdir(calendarHomes[i]) != 0) - continue; - -- if ((fp = fopen(file, "r")) != NULL) -+ if ((fp = fopen(file, "r")) != NULL) { -+ cal_home = home; -+ cal_dir = calendarHomes[i]; -+ cal_file = file; - return (fp); -+ } - } - warnx("can't open calendar file \"%s\"", file); -@@ -133,96 +147,236 @@ cal_fopen(const char *file) +- if (!warned && stat(_PATH_INCLUDE_LOCAL, &sb) != 0) { +- warnx("calendar data files now provided by calendar-data pkg."); +- warned = true; +- } + return (NULL); } - -+static char* -+cal_path(void) -+{ -+ static char buffer[MAXPATHLEN + 10]; -+ -+ if (cal_dir == NULL) -+ snprintf(buffer, sizeof(buffer), "%s", cal_file); -+ else if (cal_dir[0] == '/') -+ snprintf(buffer, sizeof(buffer), "%s/%s", cal_dir, cal_file); -+ else -+ snprintf(buffer, sizeof(buffer), "%s/%s/%s", cal_home, cal_dir, cal_file); -+ return (buffer); -+} -+ -+#define WARN0(format) \ -+ warnx(format " in %s line %d", cal_path(), cal_line) -+#define WARN1(format, arg1) \ -+ warnx(format " in %s line %d", arg1, cal_path(), cal_line) -+ -+static char* -+cmptoken(char *line, const char* token) -+{ -+ char len = strlen(token); -+ -+ if (strncmp(line, token, len) != 0) -+ return NULL; -+ return (line + len); -+} -+ - static int --token(char *line, FILE *out, bool *skip) -+token(char *line, FILE *out, int *skip, int *unskip) - { -- char *walk, c, a; -+ char *walk, *sep, a, c; -+ const char *this_cal_home; -+ const char *this_cal_dir; -+ const char *this_cal_file; -+ int this_cal_line; - -- if (strncmp(line, "endif", 5) == 0) { -- *skip = false; -+ while (isspace(*line)) -+ line++; -+ -+ if (cmptoken(line, "endif")) { -+ if (*skip + *unskip == 0) { -+ WARN0("#endif without prior #ifdef or #ifndef"); -+ return (T_ERR); -+ } -+ if (*skip > 0) -+ --*skip; -+ else -+ --*unskip; -+ - return (T_OK); - } - -- if (*skip) -+ walk = cmptoken(line, "ifdef"); -+ if (walk != NULL) { -+ sep = trimlr(&walk); -+ -+ if (*walk == '\0') { -+ WARN0("Expecting arguments after #ifdef"); -+ return (T_ERR); -+ } -+ if (*sep != '\0') { -+ WARN1("Expecting a single word after #ifdef " -+ "but got \"%s\"", walk); -+ return (T_ERR); -+ } -+ -+ if (*skip != 0 || -+ definitions == NULL || sl_find(definitions, walk) == NULL) -+ ++*skip; -+ else -+ ++*unskip; -+ - return (T_OK); -+ } - -- if (strncmp(line, "include", 7) == 0) { -- walk = line + 7; -+ walk = cmptoken(line, "ifndef"); -+ if (walk != NULL) { -+ sep = trimlr(&walk); - -- trimlr(&walk); -+ if (*walk == '\0') { -+ WARN0("Expecting arguments after #ifndef"); -+ return (T_ERR); -+ } -+ if (*sep != '\0') { -+ WARN1("Expecting a single word after #ifndef " -+ "but got \"%s\"", walk); -+ return (T_ERR); -+ } - -+ if (*skip != 0 || -+ (definitions != NULL && sl_find(definitions, walk) != NULL)) -+ ++*skip; -+ else -+ ++*unskip; -+ -+ return (T_OK); -+ } -+ -+ walk = cmptoken(line, "else"); -+ if (walk != NULL) { -+ (void)trimlr(&walk); -+ -+ if (*walk != '\0') { -+ WARN0("Expecting no arguments after #else"); -+ return (T_ERR); -+ } -+ if (*skip + *unskip == 0) { -+ WARN0("#else without prior #ifdef or #ifndef"); -+ return (T_ERR); -+ } -+ -+ if (*skip == 0) { -+ ++*skip; -+ --*unskip; -+ } else if (*skip == 1) { -+ --*skip; -+ ++*unskip; -+ } -+ -+ return (T_OK); -+ } -+ -+ if (*skip != 0) -+ return (T_OK); -+ -+ walk = cmptoken(line, "include"); -+ if (walk != NULL) { -+ (void)trimlr(&walk); -+ - if (*walk == '\0') { -- warnx("Expecting arguments after #include"); -+ WARN0("Expecting arguments after #include"); - return (T_ERR); - } - - if (*walk != '<' && *walk != '\"') { -- warnx("Excecting '<' or '\"' after #include"); -+ WARN0("Excecting '<' or '\"' after #include"); - return (T_ERR); - } - -- a = *walk; -+ a = *walk == '<' ? '>' : '\"'; - walk++; - c = walk[strlen(walk) - 1]; - -- switch(c) { -- case '>': -- if (a != '<') { -- warnx("Unterminated include expecting '\"'"); -- return (T_ERR); -- } -- break; -- case '\"': -- if (a != '\"') { -- warnx("Unterminated include expecting '>'"); -- return (T_ERR); -- } -- break; -- default: -- warnx("Unterminated include expecting '%c'", -- a == '<' ? '>' : '\"' ); -+ if (a != c) { -+ WARN1("Unterminated include expecting '%c'", a); - return (T_ERR); - } - walk[strlen(walk) - 1] = '\0'; - -+ this_cal_home = cal_home; -+ this_cal_dir = cal_dir; -+ this_cal_file = cal_file; -+ this_cal_line = cal_line; - if (cal_parse(cal_fopen(walk), out)) - return (T_ERR); -+ cal_home = this_cal_home; -+ cal_dir = this_cal_dir; -+ cal_file = this_cal_file; -+ cal_line = this_cal_line; - - return (T_OK); - } - -- if (strncmp(line, "define", 6) == 0) { -+ walk = cmptoken(line, "define"); -+ if (walk != NULL) { - if (definitions == NULL) - definitions = sl_init(); -- walk = line + 6; -- trimlr(&walk); -+ sep = trimlr(&walk); -+ *sep = '\0'; - - if (*walk == '\0') { -- warnx("Expecting arguments after #define"); -+ WARN0("Expecting arguments after #define"); - return (T_ERR); - } - -- sl_add(definitions, strdup(walk)); -+ if (sl_find(definitions, walk) == NULL) -+ sl_add(definitions, strdup(walk)); - return (T_OK); - } - -- if (strncmp(line, "ifndef", 6) == 0) { -- walk = line + 6; -- trimlr(&walk); -+ walk = cmptoken(line, "undef"); -+ if (walk != NULL) { -+ if (definitions != NULL) { -+ sep = trimlr(&walk); - -- if (*walk == '\0') { -- warnx("Expecting arguments after #ifndef"); -- return (T_ERR); -+ if (*walk == '\0') { -+ WARN0("Expecting arguments after #undef"); -+ return (T_ERR); -+ } -+ if (*sep != '\0') { -+ WARN1("Expecting a single word after #undef " -+ "but got \"%s\"", walk); -+ return (T_ERR); -+ } -+ -+ walk = sl_find(definitions, walk); -+ if (walk != NULL) -+ walk[0] = '\0'; - } -+ return (T_OK); -+ } - -- if (definitions != NULL && sl_find(definitions, walk) != NULL) -- *skip = true; -+ walk = cmptoken(line, "warning"); -+ if (walk != NULL) { -+ (void)trimlr(&walk); -+ WARN1("Warning: %s", walk); -+ } - -- return (T_OK); -+ walk = cmptoken(line, "error"); -+ if (walk != NULL) { -+ (void)trimlr(&walk); -+ WARN1("Error: %s", walk); -+ return (T_ERR); - } - -- return (T_PROCESS); -+ WARN1("Undefined pre-processor command \"#%s\"", line); -+ return (T_ERR); -+} - -+static void -+setup_locale(const char *locale) -+{ -+ (void)setlocale(LC_ALL, locale); -+#ifdef WITH_ICONV -+ if (!doall) -+ set_new_encoding(); -+#endif -+ setnnames(); - } - - #define REPLACE(string, slen, struct_) \ -@@ -237,35 +391,82 @@ token(char *line, FILE *out, bool *skip) - static int - cal_parse(FILE *in, FILE *out) - { -+ char *mylocale = NULL; - char *line = NULL; - char *buf; - size_t linecap = 0; - ssize_t linelen; - ssize_t l; -- static int d_first = -1; - static int count = 0; - int i; - int month[MAXCOUNT]; - int day[MAXCOUNT]; - int year[MAXCOUNT]; -- bool skip = false; -- char dbuf[80]; -+ int skip = 0; -+ int unskip = 0; - char *pp, p; -- struct tm tm; - int flags; -+ char *c, *cc; -+ bool incomment = false; - -- /* Unused */ -- tm.tm_sec = 0; -- tm.tm_min = 0; -- tm.tm_hour = 0; -- tm.tm_wday = 0; -- - if (in == NULL) - return (1); - -+ cal_line = 0; - while ((linelen = getline(&line, &linecap, in)) > 0) { -- if (*line == '#') { -- switch (token(line+1, out, &skip)) { -+ cal_line++; -+ buf = line; -+ if (buf[linelen - 1] == '\n') -+ buf[--linelen] = '\0'; -+ -+ if (incomment) { -+ c = strstr(buf, "*/"); -+ if (c) { -+ c += 2; -+ linelen -= c - buf; -+ buf = c; -+ incomment = false; -+ } else { -+ continue; -+ } -+ } -+ if (!incomment) { -+ do { -+ c = strstr(buf, "//"); -+ cc = strstr(buf, "/*"); -+ if (c != NULL && (cc == NULL || c - cc < 0)) { -+ /* single line comment */ -+ *c = '\0'; -+ linelen = c - buf; -+ break; -+ } else if (cc != NULL) { -+ c = strstr(cc + 2, "*/"); -+ if (c != NULL) { -+ /* multi-line comment ending on same line */ -+ c += 2; -+ memmove(cc, c, buf + linelen + 1 - c); -+ linelen -= c - cc; -+ } else { -+ /* multi-line comment */ -+ *cc = '\0'; -+ linelen = cc - buf; -+ incomment = true; -+ break; -+ } -+ } -+ } while (c != NULL || cc != NULL); -+ } -+ -+ for (l = linelen; -+ l > 0 && isspace((unsigned char)buf[l - 1]); -+ l--) -+ ; -+ buf[l] = '\0'; -+ if (buf[0] == '\0') -+ continue; -+ -+ if (buf == line && *buf == '#') { -+ switch (token(buf+1, out, &skip, &unskip)) { - case T_ERR: - free(line); - return (1); -@@ -278,18 +479,9 @@ cal_parse(FILE *in, FILE *out) - } - } - -- if (skip) -+ if (skip != 0) - continue; - -- buf = line; -- for (l = linelen; -- l > 0 && isspace((unsigned char)buf[l - 1]); -- l--) -- ; -- buf[l] = '\0'; -- if (buf[0] == '\0') -- continue; -- - /* - * Setting LANG in user's calendar was an old workaround - * for 'calendar -a' being run with C locale to properly -@@ -298,13 +490,9 @@ cal_parse(FILE *in, FILE *out) - * and does not run iconv(), this variable has little use. - */ - if (strncmp(buf, "LANG=", 5) == 0) { -- (void)setlocale(LC_ALL, buf + 5); -- d_first = (*nl_langinfo(D_MD_ORDER) == 'd'); --#ifdef WITH_ICONV -- if (!doall) -- set_new_encoding(); --#endif -- setnnames(); -+ if (mylocale == NULL) -+ mylocale = strdup(setlocale(LC_ALL, NULL)); -+ setup_locale(buf + 5); - continue; - } - /* Parse special definitions: Easter, Paskha etc */ -@@ -353,7 +541,7 @@ cal_parse(FILE *in, FILE *out) - if (count < 0) { - /* Show error status based on return value */ - if (debug) -- fprintf(stderr, "Ignored: %s\n", buf); -+ WARN1("Ignored: \"%s\"", buf); - if (count == -1) - continue; - count = -count + 1; -@@ -363,25 +551,25 @@ cal_parse(FILE *in, FILE *out) - while (pp[1] == '\t') - pp++; - -- if (d_first < 0) -- d_first = (*nl_langinfo(D_MD_ORDER) == 'd'); -- - for (i = 0; i < count; i++) { -- tm.tm_mon = month[i] - 1; -- tm.tm_mday = day[i]; -- tm.tm_year = year[i] - 1900; -- (void)strftime(dbuf, sizeof(dbuf), -- d_first ? "%e %b" : "%b %e", &tm); - if (debug) -- fprintf(stderr, "got %s\n", pp); -- events[i] = event_add(year[i], month[i], day[i], dbuf, -+ WARN1("got \"%s\"", pp); -+ events[i] = event_add(year[i], month[i], day[i], - ((flags &= F_VARIABLE) != 0) ? 1 : 0, pp, - extradata[i]); - } - } -+ while (skip-- > 0 || unskip-- > 0) { -+ cal_line++; -+ WARN0("Missing #endif assumed"); -+ } - - free(line); - fclose(in); -+ if (mylocale != NULL) { -+ setup_locale(mylocale); -+ free(mylocale); -+ } - - return (0); - } -@@ -419,6 +607,7 @@ opencalin(void) - FILE *fpin; - - /* open up calendar file */ -+ cal_file = calendarFile; - if ((fpin = fopen(calendarFile, "r")) == NULL) { - if (doall) { - if (chdir(calendarHomes[0]) != 0)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202011071141.0A7BfOVj098553>