From 550361815d6a1cf261e99ad2b430433ef6966e1a Mon Sep 17 00:00:00 2001
From: Max Rees <maxcrees@me.com>
Date: Fri, 5 Jun 2020 16:45:20 -0500
Subject: system/mandoc: new package

---
 system/mandoc/APKBUILD                   |  94 ++++++++++++++++++++++
 system/mandoc/cgi-adelie.patch           |  60 ++++++++++++++
 system/mandoc/cgi-gz.patch               |  77 ++++++++++++++++++
 system/mandoc/cgi-search.patch           |  48 +++++++++++
 system/mandoc/configure.patch            |  21 +++++
 system/mandoc/doc.patch                  | 132 +++++++++++++++++++++++++++++++
 system/mandoc/empty-tbl-null-deref.patch |  62 +++++++++++++++
 system/mandoc/less.patch                 |  58 ++++++++++++++
 system/mandoc/mandoc.post-deinstall      |   3 +
 system/mandoc/mandoc.trigger             |   3 +
 system/mandoc/tbl-colwidth-oob.patch     |  62 +++++++++++++++
 11 files changed, 620 insertions(+)
 create mode 100644 system/mandoc/APKBUILD
 create mode 100644 system/mandoc/cgi-adelie.patch
 create mode 100644 system/mandoc/cgi-gz.patch
 create mode 100644 system/mandoc/cgi-search.patch
 create mode 100644 system/mandoc/configure.patch
 create mode 100644 system/mandoc/doc.patch
 create mode 100644 system/mandoc/empty-tbl-null-deref.patch
 create mode 100644 system/mandoc/less.patch
 create mode 100644 system/mandoc/mandoc.post-deinstall
 create mode 100644 system/mandoc/mandoc.trigger
 create mode 100644 system/mandoc/tbl-colwidth-oob.patch

diff --git a/system/mandoc/APKBUILD b/system/mandoc/APKBUILD
new file mode 100644
index 000000000..b3a4c018c
--- /dev/null
+++ b/system/mandoc/APKBUILD
@@ -0,0 +1,94 @@
+# Maintainer: Max Rees <maxcrees@me.com>
+pkgname=mandoc
+pkgver=1.14.5
+pkgrel=0
+pkgdesc="Manual page database, compiler, and viewer"
+url="https://mandoc.bsd.lv/"
+arch="all"
+license="ISC AND BSD-2-Clause AND BSD-3-Clause"
+replaces="man-db"
+depends="less"
+makedepends="zlib-dev"
+checkdepends="perl"
+subpackages="$pkgname-doc $pkgname-cgi"
+install="$pkgname.post-deinstall"
+triggers="$pkgname.trigger=/usr/share/man"
+source="https://mandoc.bsd.lv/snapshots/mandoc-$pkgver.tar.gz
+	configure.patch
+	empty-tbl-null-deref.patch
+	tbl-colwidth-oob.patch
+	less.patch
+	doc.patch
+	cgi-adelie.patch
+	cgi-gz.patch
+	cgi-search.patch
+	"
+
+prepare() {
+	default_prepare
+	cat >"configure.local" <<-EOF
+		PREFIX=/usr
+		MANDIR=/usr/share/man
+		WWWPREFIX=/var/lib/mandoc-cgi
+		# remove /usr/X11R6 from the following.
+		MANPATH_BASE=/usr/share/man
+		MANPATH_DEFAULT=/usr/share/man:/usr/local/share/man
+		# groff also provides a soelim.
+		BINM_SOELIM=mandoc-soelim
+
+		CFLAGS="$CFLAGS"
+		LDFLAGS="$LDFLAGS"
+		LN="ln -sf"
+		OSNAME="Adelie Linux"
+		UTF8_LOCALE=C.UTF-8
+
+		BUILD_CATMAN=1
+		BUILD_CGI=1
+	EOF
+
+	cat >"cgi.h" <<-EOF
+		#define SCRIPT_NAME ""
+		#define MAN_DIR "/var/lib/mandoc-cgi"
+		#define CSS_DIR ""
+		#define CUSTOMIZE_TITLE "Adelie Linux manual pages"
+	EOF
+}
+
+build() {
+	./configure
+	make
+}
+
+check() {
+	make regress
+}
+
+package() {
+	make DESTDIR="$pkgdir" install
+	install -Dm644 -t "$pkgdir"/usr/share/man/man8 man.cgi.8
+
+	mkdir -p "$pkgdir"/etc
+	cat >"$pkgdir"/etc/man.conf <<-EOF
+		# See man.conf(5).
+		#manpath /usr/share/man
+		#manpath /usr/local/share/man
+	EOF
+}
+
+cgi() {
+	pkgdesc="$pkgdesc (web interface)"
+	depends="$pkgname=$pkgver-r$pkgrel"
+	mkdir -p "$subpkgdir"/var/lib
+	mv "$pkgdir"/var/lib/mandoc-cgi \
+		"$subpkgdir"/var/lib
+}
+
+sha512sums="848f290847f3095757f25647e6d73eb7044018b145bf6f9dc8b5db164b1421911efdc5b3b9022ec3a2c5af9687a84d5acedee810f2bd2f7caaa9242dadb2cc52  mandoc-1.14.5.tar.gz
+074dc73b45c71b5c178750db6c7a4a45e97d97b5388fa5d6028faa90600358dd2b954781280ca41d17da3c577ad5a1a7a13ddc4dbea72ac5e86f1652e03ecde7  configure.patch
+c4055371a92be958f0d385c83b4788dc4c18bc990b1f780137309c83e174b8d3e65cae077aba3c5286a97fcee1514d61f6b7507ca25bd5155b8d577a7e8acd3a  empty-tbl-null-deref.patch
+9a8953f17e2db75bf3667e1d51c7db21ccc5e3042c59035ed6178094963eac919b7367f96708c9bcc81450ffc13842d12c23edd9bca3330be730149625db88e7  tbl-colwidth-oob.patch
+4b17b144b53ee30f9aae87c7824597151e16e6f5ad795e7b03e701f2d13ca47a62c696cb837689c75d5f34d3c190255c8f0583bc91a0f83f61afde7563a6fb2b  less.patch
+f35268ed507d5c6431f8cafe5a311d1ffe990083c6e1d22f5db479e19745d486cd45a699b64c4fb6757d1c0ab588c3e8d0778bfd75e98e751d1a786e89e8b925  doc.patch
+0dfe9e39570a2b6764303708b98f29b2b57114e124a0f37e9c77d4d33f25d474a79d271df46babd700e4cc93e3385a02356f19caa44ebe4e9b056fa4be96b95b  cgi-adelie.patch
+957bbaef888fb2ea15f9b795b15952332e65aed70d2e70f3142305a4fb9313ade455eae6dfc923af3ef008834e771b1a85d71389b86cd0ff9a1c31e84fef861c  cgi-gz.patch
+37be119308814b060ed9d5517b54eb02b210d677ffb085385929b6aa0e8e8bef2c6c1ab2055713ed8c72f2bc85593bf8744d2d0f163dd1aff65ce439c474b640  cgi-search.patch"
diff --git a/system/mandoc/cgi-adelie.patch b/system/mandoc/cgi-adelie.patch
new file mode 100644
index 000000000..66ce6a9ba
--- /dev/null
+++ b/system/mandoc/cgi-adelie.patch
@@ -0,0 +1,60 @@
+Adjustments for Adélie manual sections and architecture names.
+
+--- mandoc-1.14.5/cgi.c	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/cgi.c	2020-06-05 15:54:05.681060852 -0500
+@@ -101,36 +101,28 @@ static	const char	 *scriptname = SCRIPT_
+ 
+ static	const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2, 9};
+ static	const char *const sec_numbers[] = {
+-    "0", "1", "2", "3", "3p", "4", "5", "6", "7", "8", "9"
++    "0", "0p", "1", "1p", "2", "3", "3p", "3pm", "4", "5", "6", "7", "8"
+ };
+ static	const char *const sec_names[] = {
+     "All Sections",
++    "0p - POSIX C Headers",
+     "1 - General Commands",
++    "1p - POSIX Commands",
+     "2 - System Calls",
+     "3 - Library Functions",
+-    "3p - Perl Library",
++    "3p - POSIX C Library Functions",
++    "3pm - Perl Library",
+     "4 - Device Drivers",
+-    "5 - File Formats",
++    "5 - File formats and configuration files",
+     "6 - Games",
+-    "7 - Miscellaneous Information",
+-    "8 - System Manager\'s Manual",
+-    "9 - Kernel Developer\'s Manual"
++    "7 - Overview, conventions, and miscellaneous",
++    "8 - System Administrator\'s Manual"
+ };
+ static	const int sec_MAX = sizeof(sec_names) / sizeof(char *);
+ 
+ static	const char *const arch_names[] = {
+-    "amd64",       "alpha",       "armv7",	"arm64",
+-    "hppa",        "i386",        "landisk",
+-    "loongson",    "luna88k",     "macppc",      "mips64",
+-    "octeon",      "sgi",         "socppc",      "sparc64",
+-    "amiga",       "arc",         "armish",      "arm32",
+-    "atari",       "aviion",      "beagle",      "cats",
+-    "hppa64",      "hp300",
+-    "ia64",        "mac68k",      "mvme68k",     "mvme88k",
+-    "mvmeppc",     "palm",        "pc532",       "pegasos",
+-    "pmax",        "powerpc",     "solbourne",   "sparc",
+-    "sun3",        "vax",         "wgrisc",      "x68k",
+-    "zaurus"
++    "aarch64",     "armv7",       "pmmx",
++    "ppc",         "ppc64",       "x86_64",
+ };
+ static	const int arch_MAX = sizeof(arch_names) / sizeof(char *);
+ 
+@@ -655,7 +661,7 @@ pg_searchres(const struct req *req, stru
+ 					== NULL) ? 3 :
+ 				    ((archend = strchr(arch + 1, '/'))
+ 					== NULL) ? 0 :
+-				    strncmp(arch, "amd64/",
++				    strncmp(arch, "ppc64/",
+ 					archend - arch) ? 2 : 1;
+ 				if (archprio < archpriouse) {
+ 					archpriouse = archprio;
diff --git a/system/mandoc/cgi-gz.patch b/system/mandoc/cgi-gz.patch
new file mode 100644
index 000000000..ac506b797
--- /dev/null
+++ b/system/mandoc/cgi-gz.patch
@@ -0,0 +1,77 @@
+Handle the case where some of the entries in the manpath are gzipped by
+removing the .gz extension and allowing mparse_open to add it back and
+mark the page as gzipped. This is part of the documented contract for
+mparse_open, see mandoc(3).
+
+--- mandoc-1.14.5/cgi.c	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/cgi.c	2020-06-05 15:54:05.681060852 -0500
+@@ -93,7 +93,7 @@ static	void		 resp_searchform(const stru
+ static	void		 resp_show(const struct req *, const char *);
+ static	void		 set_query_attr(char **, char **);
+ static	int		 validate_arch(const char *);
+-static	int		 validate_filename(const char *);
++static	int		 validate_filename(char *);
+ static	int		 validate_manpath(const struct req *, const char *);
+ static	int		 validate_urifrag(const char *);
+ 
+@@ -517,8 +509,13 @@ validate_arch(const char *arch)
+ }
+ 
+ static int
+-validate_filename(const char *file)
++validate_filename(char *file)
+ {
++	char *cp;
++
++	cp = strrchr(file, '.');
++	if (cp != NULL && ! strcmp(cp + 1, "gz"))
++		*cp = '\0';
+ 
+ 	if ('.' == file[0] && '/' == file[1])
+ 		file += 2;
+@@ -854,14 +862,15 @@ resp_format(const struct req *req, const
+ 	int		 fd;
+ 	int		 usepath;
+ 
+-	if (-1 == (fd = open(file, O_RDONLY, 0))) {
+-		puts("<p>You specified an invalid manual file.</p>");
+-		return;
+-	}
+-
+ 	mchars_alloc();
+ 	mp = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1 |
+ 	    MPARSE_VALIDATE, MANDOC_OS_OTHER, req->q.manpath);
++
++	if (-1 == (fd = mparse_open(mp, file))) {
++		puts("<p>You specified an invalid manual file.</p>");
++		goto out;
++	}
++
+ 	mparse_readfd(mp, fd, file);
+ 	close(fd);
+ 	meta = mparse_result(mp);
+@@ -882,10 +891,11 @@ resp_format(const struct req *req, const
+ 		html_man(vp, meta);
+ 
+ 	html_free(vp);
+-	mparse_free(mp);
+-	mchars_free();
+ 	free(conf.man);
+ 	free(conf.style);
++out:
++	mparse_free(mp);
++	mchars_free();
+ }
+ 
+ static void
+@@ -904,8 +914,8 @@ resp_show(const struct req *req, const c
+ static void
+ pg_show(struct req *req, const char *fullpath)
+ {
+-	char		*manpath;
+-	const char	*file;
++	char	*manpath;
++	char	*file;
+ 
+ 	if ((file = strchr(fullpath, '/')) == NULL) {
+ 		pg_error_badrequest(
diff --git a/system/mandoc/cgi-search.patch b/system/mandoc/cgi-search.patch
new file mode 100644
index 000000000..dd74be9ef
--- /dev/null
+++ b/system/mandoc/cgi-search.patch
@@ -0,0 +1,48 @@
+Don't exit immediately if mansearch returns some paths that man.cgi
+considers invalid, in particular translated manpages (e.g.
+./de/man1/chfn.1). Just mark them as invalid (section 10, see struct
+manpage in mansearch.h) and skip them later.
+
+--- mandoc-1.14.5/cgi.c	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/cgi.c	2020-06-05 15:54:05.681060852 -0500
+@@ -605,13 +602,20 @@ pg_searchres(const struct req *req, stru
+ 	size_t		 i, iuse;
+ 	int		 archprio, archpriouse;
+ 	int		 prio, priouse;
++	int		 results = 0;
+ 
+ 	for (i = 0; i < sz; i++) {
+-		if (validate_filename(r[i].file))
++		if (validate_filename(r[i].file)) {
++			results = 1;
+ 			continue;
++		}
+ 		warnx("invalid filename %s in %s database",
+ 		    r[i].file, req->q.manpath);
+-		pg_error_internal();
++		r[i].sec = 10;
++	}
++
++	if (! results) {
++		pg_noresult(req, "No results found.");
+ 		return;
+ 	}
+ 
+@@ -642,6 +646,8 @@ pg_searchres(const struct req *req, stru
+ 		priouse = 20;
+ 		archpriouse = 3;
+ 		for (i = 0; i < sz; i++) {
++			if (r[i].sec == 10)
++				continue;
+ 			sec = r[i].file;
+ 			sec += strcspn(sec, "123456789");
+ 			if (sec[0] == '\0')
+@@ -681,6 +687,8 @@ pg_searchres(const struct req *req, stru
+ 	if (sz > 1) {
+ 		puts("<table class=\"results\">");
+ 		for (i = 0; i < sz; i++) {
++			if (r[i].sec == 10)
++				continue;
+ 			printf("  <tr>\n"
+ 			       "    <td>"
+ 			       "<a class=\"Xr\" href=\"/");
diff --git a/system/mandoc/configure.patch b/system/mandoc/configure.patch
new file mode 100644
index 000000000..2fda25409
--- /dev/null
+++ b/system/mandoc/configure.patch
@@ -0,0 +1,21 @@
+--- mandoc-1.14.5/test-recvmsg.c	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/test-recvmsg.c	2020-06-04 20:08:33.420299034 -0500
+@@ -4,5 +4,6 @@
+ int
+ main(void)
+ {
+-	return recvmsg(-1, NULL, 0) != -1;
++	struct msghdr buf;
++	return recvmsg(-1, &buf, 0) != -1;
+ }
+--- mandoc-1.14.5/configure	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/configure	2020-06-04 20:03:24.790295729 -0500
+@@ -41,7 +41,7 @@ OSENUM=
+ OSNAME=
+ UTF8_LOCALE=
+ 
+-CC=`printf "all:\\n\\t@echo \\\$(CC)\\n" | env -i make -sf -`
++CC=cc
+ CFLAGS=
+ LDADD=
+ LDFLAGS=
diff --git a/system/mandoc/doc.patch b/system/mandoc/doc.patch
new file mode 100644
index 000000000..955a5f205
--- /dev/null
+++ b/system/mandoc/doc.patch
@@ -0,0 +1,132 @@
+--- mandoc-1.14.5/mandoc.1	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/mandoc.1	2020-06-05 02:12:50.320533119 -0500
+@@ -897,7 +897,7 @@ An
+ macro references a manual page that is not found in the base system.
+ The path to look for base system manuals is configurable at compile
+ time and defaults to
+-.Pa /usr/share/man : /usr/X11R6/man .
++.Pa /usr/share/man .
+ .El
+ .Ss Style suggestions
+ .Bl -ohang
+--- mandoc-1.14.5/mandoc.db.5	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/mandoc.db.5	2020-06-05 02:14:48.380534383 -0500
+@@ -189,10 +189,6 @@ followed by the number 0.
+ .Bl -tag -width /usr/share/man/mandoc.db -compact
+ .It Pa /usr/share/man/mandoc.db
+ The manual page database for the base system.
+-.It Pa /usr/X11R6/man/mandoc.db
+-The same for the
+-.Xr X 7
+-Window System.
+ .It Pa /usr/local/man/mandoc.db
+ The same for
+ .Xr packages 7 .
+--- mandoc-1.14.5/man.conf.5	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/man.conf.5	2020-06-05 02:11:34.650532308 -0500
+@@ -117,7 +117,6 @@ installing it is equivalent to not havin
+ file at all.
+ .Bd -literal -offset indent
+ manpath /usr/share/man
+-manpath /usr/X11R6/man
+ manpath /usr/local/man
+ .Ed
+ .Sh SEE ALSO
+
+--- mandoc-1.14.5/man.1	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/man.1	2020-06-05 02:51:15.910557811 -0500
+@@ -174,28 +174,32 @@ Only select manuals from the specified
+ The currently available sections are:
+ .Pp
+ .Bl -tag -width "localXXX" -offset indent -compact
++.It 0p
++POSIX C headers.
+ .It 1
+ General commands
+ .Pq tools and utilities .
++.It 1p
++POSIX commands.
+ .It 2
+ System calls and error numbers.
+ .It 3
+ Library functions.
+ .It 3p
++POSIX C library functions.
++.It 3pm
+ .Xr perl 1
+ programmer's reference guide.
+ .It 4
+ Device drivers.
+ .It 5
+-File formats.
++File formats and configuration files.
+ .It 6
+ Games.
+ .It 7
+-Miscellaneous information.
++Overview, conventions, and miscellaneous information.
+ .It 8
+ System maintenance and operation commands.
+-.It 9
+-Kernel internals.
+ .El
+ .Pp
+ If not specified and a match is found in more than one section,
+--- mandoc-1.14.5/man.cgi.8	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/man.cgi.8	2020-06-05 16:26:12.541081488 -0500
+@@ -342,7 +342,7 @@ page to acquire the named parameters it
+ .El
+ .Sh FILES
+ .Bl -tag -width Ds
+-.It Pa /var/www
++.It Pa /var/lib/mandoc-cgi
+ Default web server
+ .Xr chroot 2
+ directory.
+@@ -366,13 +366,7 @@ This is part of the web server configura
+ A style sheet for
+ .Xr mandoc 1
+ HTML styling, referenced from each generated HTML page.
+-.It Pa /man
+-Default
+-.Nm
+-data directory containing all the manual trees.
+-Can be overridden by
+-.Dv MAN_DIR .
+-.It Pa /man/manpath.conf
++.It Pa /manpath.conf
+ The list of available manpaths, one per line.
+ If any of the lines in this file contains a slash
+ .Pq Sq /
+@@ -380,13 +374,13 @@ or any character not contained in the
+ .Sx Restricted character set ,
+ .Nm
+ reports an internal server error and exits without doing anything.
+-.It Pa /man/header.html
++.It Pa /header.html
+ An optional file containing static HTML code to be inserted right
+ after opening the <BODY> element.
+-.It Pa /man/footer.html
++.It Pa /footer.html
+ An optional file containing static HTML code to be inserted right
+ before closing the <BODY> element.
+-.It Pa /man/OpenBSD-current/man1/mandoc.1
++.It Pa /OpenBSD-current/man1/mandoc.1
+ An example
+ .Xr mdoc 7
+ source file located below the
+--- mandoc-1.14.5/soelim.1	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/soelim.1	2020-06-05 16:38:40.101089494 -0500
+@@ -25,10 +25,10 @@
+ .\" SUCH DAMAGE.
+ .\"
+ .Dd $Mdocdate: July 4 2017 $
+-.Dt SOELIM 1
++.Dt MANDOC-SOELIM 1
+ .Os
+ .Sh NAME
+-.Nm soelim
++.Nm mandoc-soelim
+ .Nd interpret .so requests in manpages
+ .Sh SYNOPSIS
+ .Nm
diff --git a/system/mandoc/empty-tbl-null-deref.patch b/system/mandoc/empty-tbl-null-deref.patch
new file mode 100644
index 000000000..3e14ce32b
--- /dev/null
+++ b/system/mandoc/empty-tbl-null-deref.patch
@@ -0,0 +1,62 @@
+From mboxrd@z Thu Jan  1 00:00:00 1970
+Received: from localhost (fantadrom.bsd.lv [local])
+	by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id 25e99424
+	for <source@mandoc.bsd.lv>;
+	Mon, 18 Mar 2019 03:01:04 -0500 (EST)
+Date: Mon, 18 Mar 2019 03:01:04 -0500 (EST)
+X-Mailinglist: mandoc-source
+Reply-To: source@mandoc.bsd.lv
+MIME-Version: 1.0
+From: schwarze@mandoc.bsd.lv
+To: source@mandoc.bsd.lv
+Subject: mandoc: fix a NULL pointer access on empty tbl(7) data cells that 
+X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/
+Content-Type: text/plain; charset=utf-8
+Message-ID: <e3f22222366ad31d@fantadrom.bsd.lv>
+Archived-At: <http://inbox.vuxu.org/mandoc-source/e3f22222366ad31d@fantadrom.bsd.lv/>
+List-Archive: <http://inbox.vuxu.org/mandoc-source/>
+List-Post: <mailto:source@mandoc.bsd.lv>
+
+Log Message:
+-----------
+fix a NULL pointer access on empty tbl(7) data cells
+that bentley@ found in syncthing-bep(7)
+
+Modified Files:
+--------------
+    mandoc:
+        tbl_term.c
+
+Revision Data
+-------------
+Index: tbl_term.c
+===================================================================
+RCS file: /home/cvs/mandoc/mandoc/tbl_term.c,v
+retrieving revision 1.69
+retrieving revision 1.70
+diff -Ltbl_term.c -Ltbl_term.c -u -p -r1.69 -r1.70
+--- a/tbl_term.c
++++ b/tbl_term.c
+@@ -629,7 +629,8 @@ tbl_hrule(struct termp *tp, const struct
+ 
+ 		lw = cpp == NULL || cpn == NULL ||
+ 		    (cpn->pos != TBL_CELL_DOWN &&
+-		     (dpn == NULL || strcmp(dpn->string, "\\^") != 0))
++		     (dpn == NULL || dpn->string == NULL ||
++		      strcmp(dpn->string, "\\^") != 0))
+ 		    ? hw : 0;
+ 		tbl_direct_border(tp, BHORIZ * lw,
+ 		    col->width + col->spacing / 2);
+@@ -675,7 +676,8 @@ tbl_hrule(struct termp *tp, const struct
+ 
+ 		rw = cpp == NULL || cpn == NULL ||
+ 		    (cpn->pos != TBL_CELL_DOWN &&
+-		     (dpn == NULL || strcmp(dpn->string, "\\^") != 0))
++		     (dpn == NULL || dpn->string == NULL ||
++		      strcmp(dpn->string, "\\^") != 0))
+ 		    ? hw : 0;
+ 
+ 		/* The line crossing at the end of this column. */
+--
+ To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv
+
diff --git a/system/mandoc/less.patch b/system/mandoc/less.patch
new file mode 100644
index 000000000..19d567365
--- /dev/null
+++ b/system/mandoc/less.patch
@@ -0,0 +1,58 @@
+Default to using less(1) instead of more(1) if MANPAGER and PAGER are
+unset, and also set a pretty prompt and smart case searching like man-db
+does if less is used as a pager.
+
+The name of the manpage is not available in the scope of the patched
+function - maybe add it at some point.
+
+--- mandoc-1.14.5/main.c	2019-03-10 04:56:43.000000000 -0500
++++ mandoc-1.14.5/main.c	2020-06-05 01:59:10.640524340 -0500
+@@ -1170,8 +1170,9 @@ spawn_pager(struct tag_files *tag_files)
+ 	pager = getenv("MANPAGER");
+ 	if (pager == NULL || *pager == '\0')
+ 		pager = getenv("PAGER");
+-	if (pager == NULL || *pager == '\0')
+-		pager = "more -s";
++	if (pager == NULL || *pager == '\0') {
++		pager = "less";
++	}
+ 	cp = mandoc_strdup(pager);
+ 
+ 	/*
+@@ -1195,10 +1196,24 @@ spawn_pager(struct tag_files *tag_files)
+ 	/* For less(1), use the tag file. */
+ 
+ 	use_ofn = 1;
+-#if HAVE_LESS_T
+ 	if ((cmdlen = strlen(argv[0])) >= 4) {
+ 		cp = argv[0] + cmdlen - 4;
+ 		if (strcmp(cp, "less") == 0) {
++			/*
++			 * Set a few options like man-db does.
++			 * -i: smart case search
++			 * -mPm: set prompt to following string terminated by $
++			 */
++			argv[argc++] = "-imPm" \
++				" Manual page" \
++				/*
++				 * print " (END)" if EOF, else % in file followed by % sign.
++				 * ?X if X:else not X.
++				 */
++				"?e (END):?pB %pB\\%.. " \
++				"(press h for help or q to quit)" \
++				"$";
++#if HAVE_LESS_T
+ 			argv[argc++] = mandoc_strdup("-T");
+ 			argv[argc++] = tag_files->tfn;
+ 			if (tag_files->tagname != NULL) {
+@@ -1206,9 +1221,9 @@ spawn_pager(struct tag_files *tag_files)
+ 				argv[argc++] = tag_files->tagname;
+ 				use_ofn = 0;
+ 			}
++#endif
+ 		}
+ 	}
+-#endif
+ 	if (use_ofn)
+ 		argv[argc++] = tag_files->ofn;
+ 	argv[argc] = NULL;
diff --git a/system/mandoc/mandoc.post-deinstall b/system/mandoc/mandoc.post-deinstall
new file mode 100644
index 000000000..0a8d5b9df
--- /dev/null
+++ b/system/mandoc/mandoc.post-deinstall
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec rm -f /usr/share/man/mandoc.db 2>/dev/null
diff --git a/system/mandoc/mandoc.trigger b/system/mandoc/mandoc.trigger
new file mode 100644
index 000000000..34fc1decc
--- /dev/null
+++ b/system/mandoc/mandoc.trigger
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec makewhatis -a -T utf8 "$@"
diff --git a/system/mandoc/tbl-colwidth-oob.patch b/system/mandoc/tbl-colwidth-oob.patch
new file mode 100644
index 000000000..0b7b0acad
--- /dev/null
+++ b/system/mandoc/tbl-colwidth-oob.patch
@@ -0,0 +1,62 @@
+From mboxrd@z Thu Jan  1 00:00:00 1970
+Received: from localhost (fantadrom.bsd.lv [local])
+	by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id 0ff00a97
+	for <source@mandoc.bsd.lv>;
+	Fri, 29 Mar 2019 16:27:36 -0500 (EST)
+Date: Fri, 29 Mar 2019 16:27:36 -0500 (EST)
+X-Mailinglist: mandoc-source
+Reply-To: source@mandoc.bsd.lv
+MIME-Version: 1.0
+From: schwarze@mandoc.bsd.lv
+To: source@mandoc.bsd.lv
+Subject: mandoc: Set the maximum column index in a tbl(7) to the maximum *right* 
+X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/
+Content-Type: text/plain; charset=utf-8
+Message-ID: <e3fceff42218668d@fantadrom.bsd.lv>
+Archived-At: <http://inbox.vuxu.org/mandoc-source/e3fceff42218668d@fantadrom.bsd.lv/>
+List-Archive: <http://inbox.vuxu.org/mandoc-source/>
+List-Post: <mailto:source@mandoc.bsd.lv>
+
+Log Message:
+-----------
+Set the maximum column index in a tbl(7) to the maximum *right* edge 
+of any cell span, not to the maximum *left* edge, which may be smaller 
+if the last column of the table is only reached by horizontal spans,
+but not by any regular cell in any row of the table.
+Otherwise, the algorithm calculating column widths accessed memomy
+after the end of the colwidth[] array, while it was trying to handle 
+the rightmost column(s).
+
+Crash reported by Jason Thorpe <thorpej at NetBSD>
+via https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=54069
+and via Thomas Klausner (wiz@).
+Christos@ Zoulas sent a (correct, but slightly confusing) patch.
+The patch i'm committing here is easier to understand.
+
+Modified Files:
+--------------
+    mandoc:
+        out.c
+
+Revision Data
+-------------
+Index: out.c
+===================================================================
+RCS file: /home/cvs/mandoc/mandoc/out.c,v
+retrieving revision 1.77
+retrieving revision 1.78
+diff -Lout.c -Lout.c -u -p -r1.77 -r1.78
+--- a/out.c
++++ b/out.c
+@@ -149,7 +149,7 @@ tblcalc(struct rofftbl *tbl, const struc
+ 		gp = &first_group;
+ 		for (dp = sp->first; dp != NULL; dp = dp->next) {
+ 			icol = dp->layout->col;
+-			while (icol > maxcol)
++			while (maxcol < icol + dp->hspans)
+ 				tbl->cols[++maxcol].spacing = SIZE_MAX;
+ 			col = tbl->cols + icol;
+ 			col->flags |= dp->layout->flags;
+--
+ To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv
+
-- 
cgit v1.2.3-70-g09d2


From 8b9b9ccfd26d2fd91cbc49c9d97acafc25a05ff2 Mon Sep 17 00:00:00 2001
From: Max Rees <maxcrees@me.com>
Date: Fri, 5 Jun 2020 16:47:12 -0500
Subject: system/man-db: move to legacy

---
 legacy/man-db/APKBUILD                 | 44 +++++++++++++++++++++++
 legacy/man-db/man-db-2.8.5-iconv.patch | 65 ++++++++++++++++++++++++++++++++++
 legacy/man-db/man-db.trigger           |  3 ++
 system/man-db/APKBUILD                 | 44 -----------------------
 system/man-db/man-db-2.8.5-iconv.patch | 65 ----------------------------------
 system/man-db/man-db.trigger           |  3 --
 6 files changed, 112 insertions(+), 112 deletions(-)
 create mode 100644 legacy/man-db/APKBUILD
 create mode 100644 legacy/man-db/man-db-2.8.5-iconv.patch
 create mode 100644 legacy/man-db/man-db.trigger
 delete mode 100644 system/man-db/APKBUILD
 delete mode 100644 system/man-db/man-db-2.8.5-iconv.patch
 delete mode 100644 system/man-db/man-db.trigger

diff --git a/legacy/man-db/APKBUILD b/legacy/man-db/APKBUILD
new file mode 100644
index 000000000..136e0720d
--- /dev/null
+++ b/legacy/man-db/APKBUILD
@@ -0,0 +1,44 @@
+# Contributor: A. Wilcox <awilfox@adelielinux.org>
+# Maintainer: A. Wilcox <awilfox@adelielinux.org>
+pkgname=man-db
+pkgver=2.9.1
+pkgrel=0
+pkgdesc="The man command and related utilities for examining on-line help files"
+url="https://www.nongnu.org/man-db/"
+arch="all"
+options="!check"  # requires //IGNORE in iconv
+license="GPL-2.0+"
+depends="groff gzip less"
+makedepends_host="db-dev libpipeline-dev zlib-dev"
+subpackages="$pkgname-doc $pkgname-lang"
+triggers="man-db.trigger=/usr/share/man"
+source="https://download.savannah.nongnu.org/releases/man-db/man-db-$pkgver.tar.xz
+	man-db-2.8.5-iconv.patch
+	"
+
+build() {
+	./configure \
+		--build=$CBUILD \
+		--host=$CHOST \
+		--prefix=/usr \
+		--sysconfdir=/etc \
+		--mandir=/usr/share/man \
+		--localstatedir=/var \
+		--disable-setuid \
+		--with-sections="1 1p 1x 2 2x 3 3p 3x 4 4x 5 5x 6 6x 7 7x 8 8x 9 0p tcl n l p o" \
+		--enable-nls \
+		--with-db=db
+	make
+}
+
+check() {
+	make check
+}
+
+package() {
+	make DESTDIR="$pkgdir" install
+	rm -r "${pkgdir}"/usr/lib/tmpfiles.d  # systemd
+}
+
+sha512sums="ae2d1e9f293795c63f5a9a1a765478a9a59cbe5fe6f759647be5057c1ae53f90baee8d5467921f3d0102300f2111a5026eeb25f78401bcb16ce45ad790634977  man-db-2.9.1.tar.xz
+0a68260fc48488408dc11855858aa2569efa3aeefd765c425b8fc988e7fee3e1d42e19eb299e518afc9b2ae54c5d37911176127124a43d5041f1137af0457097  man-db-2.8.5-iconv.patch"
diff --git a/legacy/man-db/man-db-2.8.5-iconv.patch b/legacy/man-db/man-db-2.8.5-iconv.patch
new file mode 100644
index 000000000..c2232920d
--- /dev/null
+++ b/legacy/man-db/man-db-2.8.5-iconv.patch
@@ -0,0 +1,65 @@
+--- man-db-2.8.5/src/man.c	2018-06-18 22:44:35.672743065 -0500
++++ man-db-2.8.5/src/man.c	2018-06-18 22:46:35.032624890 -0500
+@@ -1516,15 +1516,13 @@
+ {
+ 	debug ("add_output_iconv: source %s, target %s\n", source, target);
+ 	if (source && target && !STREQ (source, target)) {
+-		char *target_translit = xasprintf ("%s//TRANSLIT", target);
+ 		pipecmd *iconv_cmd;
+ 		iconv_cmd = pipecmd_new_args
+-			("iconv", "-c", "-f", source, "-t", target_translit,
++			("iconv", "-c", "-f", source, "-t", target,
+ 			 (void *) 0);
+ 		pipecmd_pre_exec (iconv_cmd, sandbox_load, sandbox_free,
+ 				  sandbox);
+ 		pipeline_command (p, iconv_cmd);
+-		free (target_translit);
+ 	}
+ }
+ 
+--- man-db-2.8.5/src/manconv.c
++++ man-db-2.8.5/src/manconv.c
+@@ -111,6 +111,5 @@ static int try_iconv (pipeline *p, const char *try_from_code, const char *to,
+ 	iconv_t cd_utf8, cd = NULL;
+-	bool to_utf8 = STREQ (try_to_code, "UTF-8") ||
+-		       STRNEQ (try_to_code, "UTF-8//", 7);
+-	const char *utf8_target = last ? "UTF-8//IGNORE" : "UTF-8";
+-	bool ignore_errors = (strstr (try_to_code, "//IGNORE") != NULL);
++	bool to_utf8 = STREQ (try_to_code, "UTF-8");
++	const char *utf8_target = "UTF-8";
++	bool ignore_errors = 0;
+ 	int ret = 0;
+--- man-db-2.8.5/src/manconv_client.c
++++ man-db-2.8.5/src/manconv_client.c
+@@ -102,7 +102,7 @@ void add_manconv (pipeline *p, const char *source, const char *target)
+ 		codes->from[2] = NULL;
+ 		name = appendstr (name, "UTF-8:", source, (void *) 0);
+ 	}
+-	codes->to = xasprintf ("%s//IGNORE", target);
++	codes->to = xstrdup (target);
+ 	/* informational only; no shell quoting concerns */
+ 	name = appendstr (name, " -t ", codes->to, (void *) 0);
+ 	if (quiet >= 2)
+--- man-db-2.8.5/src/manconv_main.c
++++ man-db-2.8.5/src/manconv_main.c
+@@ -106,9 +106,6 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state)
+ 			return 0;
+ 		case 't':
+ 			to_code = xstrdup (arg);
+-			if (!strstr (to_code, "//"))
+-				to_code = appendstr (to_code, "//TRANSLIT",
+-						     (void *) 0);
+ 			return 0;
+ 		case 'd':
+ 			debug_level = 1;
+--- man-db-2.8.5/src/whatis.c
++++ man-db-2.8.5/src/whatis.c
+@@ -945,7 +945,7 @@ int main (int argc, char *argv[])
+ 	display_seen = hashtable_create (&null_hashtable_free);
+ 
+ #ifdef HAVE_ICONV
+-	locale_charset = xasprintf ("%s//IGNORE", get_locale_charset ());
++	locale_charset = xstrdup (get_locale_charset ());
+ 	conv_to_locale = iconv_open (locale_charset, "UTF-8");
+ 	free (locale_charset);
+ #endif /* HAVE_ICONV */
diff --git a/legacy/man-db/man-db.trigger b/legacy/man-db/man-db.trigger
new file mode 100644
index 000000000..f9de5961c
--- /dev/null
+++ b/legacy/man-db/man-db.trigger
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec /usr/bin/mandb /usr/share/man >/dev/null
diff --git a/system/man-db/APKBUILD b/system/man-db/APKBUILD
deleted file mode 100644
index 136e0720d..000000000
--- a/system/man-db/APKBUILD
+++ /dev/null
@@ -1,44 +0,0 @@
-# Contributor: A. Wilcox <awilfox@adelielinux.org>
-# Maintainer: A. Wilcox <awilfox@adelielinux.org>
-pkgname=man-db
-pkgver=2.9.1
-pkgrel=0
-pkgdesc="The man command and related utilities for examining on-line help files"
-url="https://www.nongnu.org/man-db/"
-arch="all"
-options="!check"  # requires //IGNORE in iconv
-license="GPL-2.0+"
-depends="groff gzip less"
-makedepends_host="db-dev libpipeline-dev zlib-dev"
-subpackages="$pkgname-doc $pkgname-lang"
-triggers="man-db.trigger=/usr/share/man"
-source="https://download.savannah.nongnu.org/releases/man-db/man-db-$pkgver.tar.xz
-	man-db-2.8.5-iconv.patch
-	"
-
-build() {
-	./configure \
-		--build=$CBUILD \
-		--host=$CHOST \
-		--prefix=/usr \
-		--sysconfdir=/etc \
-		--mandir=/usr/share/man \
-		--localstatedir=/var \
-		--disable-setuid \
-		--with-sections="1 1p 1x 2 2x 3 3p 3x 4 4x 5 5x 6 6x 7 7x 8 8x 9 0p tcl n l p o" \
-		--enable-nls \
-		--with-db=db
-	make
-}
-
-check() {
-	make check
-}
-
-package() {
-	make DESTDIR="$pkgdir" install
-	rm -r "${pkgdir}"/usr/lib/tmpfiles.d  # systemd
-}
-
-sha512sums="ae2d1e9f293795c63f5a9a1a765478a9a59cbe5fe6f759647be5057c1ae53f90baee8d5467921f3d0102300f2111a5026eeb25f78401bcb16ce45ad790634977  man-db-2.9.1.tar.xz
-0a68260fc48488408dc11855858aa2569efa3aeefd765c425b8fc988e7fee3e1d42e19eb299e518afc9b2ae54c5d37911176127124a43d5041f1137af0457097  man-db-2.8.5-iconv.patch"
diff --git a/system/man-db/man-db-2.8.5-iconv.patch b/system/man-db/man-db-2.8.5-iconv.patch
deleted file mode 100644
index c2232920d..000000000
--- a/system/man-db/man-db-2.8.5-iconv.patch
+++ /dev/null
@@ -1,65 +0,0 @@
---- man-db-2.8.5/src/man.c	2018-06-18 22:44:35.672743065 -0500
-+++ man-db-2.8.5/src/man.c	2018-06-18 22:46:35.032624890 -0500
-@@ -1516,15 +1516,13 @@
- {
- 	debug ("add_output_iconv: source %s, target %s\n", source, target);
- 	if (source && target && !STREQ (source, target)) {
--		char *target_translit = xasprintf ("%s//TRANSLIT", target);
- 		pipecmd *iconv_cmd;
- 		iconv_cmd = pipecmd_new_args
--			("iconv", "-c", "-f", source, "-t", target_translit,
-+			("iconv", "-c", "-f", source, "-t", target,
- 			 (void *) 0);
- 		pipecmd_pre_exec (iconv_cmd, sandbox_load, sandbox_free,
- 				  sandbox);
- 		pipeline_command (p, iconv_cmd);
--		free (target_translit);
- 	}
- }
- 
---- man-db-2.8.5/src/manconv.c
-+++ man-db-2.8.5/src/manconv.c
-@@ -111,6 +111,5 @@ static int try_iconv (pipeline *p, const char *try_from_code, const char *to,
- 	iconv_t cd_utf8, cd = NULL;
--	bool to_utf8 = STREQ (try_to_code, "UTF-8") ||
--		       STRNEQ (try_to_code, "UTF-8//", 7);
--	const char *utf8_target = last ? "UTF-8//IGNORE" : "UTF-8";
--	bool ignore_errors = (strstr (try_to_code, "//IGNORE") != NULL);
-+	bool to_utf8 = STREQ (try_to_code, "UTF-8");
-+	const char *utf8_target = "UTF-8";
-+	bool ignore_errors = 0;
- 	int ret = 0;
---- man-db-2.8.5/src/manconv_client.c
-+++ man-db-2.8.5/src/manconv_client.c
-@@ -102,7 +102,7 @@ void add_manconv (pipeline *p, const char *source, const char *target)
- 		codes->from[2] = NULL;
- 		name = appendstr (name, "UTF-8:", source, (void *) 0);
- 	}
--	codes->to = xasprintf ("%s//IGNORE", target);
-+	codes->to = xstrdup (target);
- 	/* informational only; no shell quoting concerns */
- 	name = appendstr (name, " -t ", codes->to, (void *) 0);
- 	if (quiet >= 2)
---- man-db-2.8.5/src/manconv_main.c
-+++ man-db-2.8.5/src/manconv_main.c
-@@ -106,9 +106,6 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state)
- 			return 0;
- 		case 't':
- 			to_code = xstrdup (arg);
--			if (!strstr (to_code, "//"))
--				to_code = appendstr (to_code, "//TRANSLIT",
--						     (void *) 0);
- 			return 0;
- 		case 'd':
- 			debug_level = 1;
---- man-db-2.8.5/src/whatis.c
-+++ man-db-2.8.5/src/whatis.c
-@@ -945,7 +945,7 @@ int main (int argc, char *argv[])
- 	display_seen = hashtable_create (&null_hashtable_free);
- 
- #ifdef HAVE_ICONV
--	locale_charset = xasprintf ("%s//IGNORE", get_locale_charset ());
-+	locale_charset = xstrdup (get_locale_charset ());
- 	conv_to_locale = iconv_open (locale_charset, "UTF-8");
- 	free (locale_charset);
- #endif /* HAVE_ICONV */
diff --git a/system/man-db/man-db.trigger b/system/man-db/man-db.trigger
deleted file mode 100644
index f9de5961c..000000000
--- a/system/man-db/man-db.trigger
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-exec /usr/bin/mandb /usr/share/man >/dev/null
-- 
cgit v1.2.3-70-g09d2


From abe028b0d7927e92ab1dda0920a70955ef839be4 Mon Sep 17 00:00:00 2001
From: Max Rees <maxcrees@me.com>
Date: Fri, 5 Jun 2020 16:47:38 -0500
Subject: system/adelie-base: switch from man-db to mandoc

---
 system/adelie-base/APKBUILD | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/system/adelie-base/APKBUILD b/system/adelie-base/APKBUILD
index 8b06a3699..7cd92003d 100644
--- a/system/adelie-base/APKBUILD
+++ b/system/adelie-base/APKBUILD
@@ -2,7 +2,7 @@
 # Maintainer: A. Wilcox <awilfox@adelielinux.org>
 pkgname=adelie-base
 pkgver=0.9.4
-pkgrel=1
+pkgrel=2
 pkgdesc="The Adélie Linux Base System"
 url="https://www.adelielinux.org/"
 arch="noarch"
@@ -14,7 +14,7 @@ _core_depends="apk-tools adelie-keys musl-utils shadow
 	util-linux net-tools
 	nvi sed psmisc less tzdata"
 depends="adelie-core binutils debianutils file gettys-openrc
-	kbd libarchive-tools man-db patch sed sharutils sysklogd zsh"
+	kbd libarchive-tools mandoc patch sed sharutils sysklogd zsh"
 makedepends=""
 makedepends_host="$depends"
 subpackages="adelie-core:core $pkgname-doc $pkgname-posix $pkgname-lsb dev
-- 
cgit v1.2.3-70-g09d2