diff -Paur --no-dereference -- libcurses.upstream/GNUmakefile libcurses/GNUmakefile
--- libcurses.upstream/GNUmakefile
+++ libcurses/GNUmakefile
@@ -1,4 +1,5 @@
-HOSTCC ?= $(CC)
+CC_FOR_BUILD ?= $(CC)
+HOSTCC ?= $(CC_FOR_BUILD)
 AWK ?= awk
 AR ?= ar
 RANLIB ?= ranlib
@@ -11,13 +12,15 @@
 
 PIC = -fPIC
 
-PREFIX=/usr/local
-BINDIR=$(PREFIX)/bin
-LIBDIR=$(PREFIX)/lib
-INCDIR=$(PREFIX)/include
-MANDIR=$(PREFIX)/share/man
-MAN1DIR=$(MANDIR)/man1
-MAN3DIR=$(MANDIR)/man3
+PREFIX?=/usr/local
+EXEC_PREFIX?=$(PREFIX)
+BINDIR?=$(EXEC_PREFIX)/bin
+LIBDIR?=$(EXEC_PREFIX)/lib
+INCLUDEDIR?=$(PREFIX)/include
+INCDIR?=$(INCLUDEDIR)
+MANDIR?=$(PREFIX)/share/man
+MAN1DIR?=$(MANDIR)/man1
+MAN3DIR?=$(MANDIR)/man3
 
 -include config.mak
 
@@ -41,6 +44,7 @@
 else
 STATIC_BINS=0
 endif
+STATIC_BINS=1
 
 CFLAGS+=-Werror-implicit-function-declaration
 CPPFLAGS+= -I. -I./libterminfo
@@ -81,6 +85,7 @@
 libterminfo/compile.lo: CPPFLAGS+= -DTERMINFO_COMPILE -DTERMINFO_DB -DTERMINFO_COMPAT
 libterminfo/termcap.o: CPPFLAGS+= -DTERMINFO_COMPILE -DTERMINFO_DB -DTERMINFO_COMPAT
 libterminfo/termcap.lo: CPPFLAGS+= -DTERMINFO_COMPILE -DTERMINFO_DB -DTERMINFO_COMPAT
+tic/compile.o: CPPFLAGS+= -DTERMINFO_COMPAT
 
 CU_SRCS_=acs.c addbytes.c addch.c addchnstr.c addnstr.c attributes.c \
 	background.c bell.c border.c box.c chgat.c clear.c clearok.c \
@@ -172,7 +177,7 @@
 TI_LINKLIB=$(TI_LIBA)
 endif
 
-all: $(STALIBS) $(DYNLIBS) $(PROGS)
+all: all-static
 
 all-static: $(STALIBS) $(PROGS)
 
@@ -187,7 +192,6 @@
 
 install-tput: tput/tput tput/clear.sh
 	$(INSTALL) -Dm 755 tput/tput $(DESTDIR)$(BINDIR)/tput
-	$(INSTALL) -Dm 755 tput/clear.sh $(DESTDIR)$(BINDIR)/clear
 
 install-infocmp: infocmp/infocmp
 	$(INSTALL) -Dm 755 infocmp/infocmp $(DESTDIR)$(BINDIR)/infocmp
@@ -263,7 +267,7 @@
 	$(LN) -sf $(notdir $<) $(DESTDIR)$(LIBDIR)/$(basename $(notdir $<))w$(SO_SUFFIX)
 
 install-dynlibs: install-dynlib-terminfo install-dynlib-curses install-dynlib-panel install-dynlib-menu install-dynlib-form
-install-libs: install-stalibs install-dynlibs
+install-libs: install-stalibs
 
 install-pc-dir:
 	$(MKDIR) -p $(DESTDIR)$(LIBDIR)/pkgconfig
@@ -335,7 +339,15 @@
 
 install-manpages: install-prog-manpages install-lib-manpages
 
-install: install-headers install-libs install-progs install-pcs install-manpages
+install-terminfo: $(TOOL_HOSTTIC)
+	cat terminfo/terminfo terminfo/sortix.terminfo > $(DESTDIR)$(PREFIX)/share/terminfo.tmp
+	$(TOOL_HOSTTIC) -x -o $(DESTDIR)$(PREFIX)/share/terminfo.cdb $(DESTDIR)$(PREFIX)/share/terminfo.tmp
+	rm -f $(DESTDIR)$(PREFIX)/share/terminfo.tmp
+	mkdir -p $(DESTDIR)$(PREFIX)/share/terminfo
+	mkdir -p $(DESTDIR)$(PREFIX)/share/terminfo/s
+	cp terminfo/sortix.terminfo $(DESTDIR)$(PREFIX)/share/terminfo/s/sortix.terminfo
+
+install: install-headers install-libs install-progs install-pcs install-manpages install-terminfo
 
 install-static: install-headers install-progs install-pcs install-stalibs
 install-dynamic: TI_LINKLIB=$(TI_LIBSO)
@@ -564,4 +576,4 @@
 	install-man-infocmp install-man-tabs install-prog-manpages \
 	install-man-terminfo install-man-curses install-man-panel \
 	install-man-menu install-man-form install-lib-manpages \
-	install-manpages
+	install-manpages install-terminfo
diff -Paur --no-dereference -- libcurses.upstream/libcurses/get_wch.c libcurses/libcurses/get_wch.c
--- libcurses.upstream/libcurses/get_wch.c
+++ libcurses/libcurses/get_wch.c
@@ -45,6 +45,36 @@
 #include "curses_private.h"
 #include "keymap.h"
 
+// PATCH: Sortix does not yet have fgetwc(3)
+#ifdef __sortix__
+#include <errno.h>
+#include <stdio_ext.h>
+static wint_t fgetwc(FILE *infd)
+{
+	mbstate_t ps = { 0 };
+	wchar_t wc;
+	while (1) {
+		int ic = getc(infd);
+		if (ic == EOF) {
+			if (!mbsinit(&ps)) {
+				errno = EILSEQ;
+				__fseterr(infd);
+			}
+			return WEOF;
+		}
+		char c = ic;
+		size_t bytes = mbrtowc(&wc, &c, 1, &ps);
+		if (bytes == (size_t) -1) {
+			__fseterr(infd);
+			return WEOF;
+		}
+		if (bytes == (size_t) -2)
+			continue;
+		return wc;
+	}
+}
+#endif
+
 static short wstate;		/* state of the wcinkey function */
 extern short _cursesi_state;	/* storage declared in getch.c */
 
diff -Paur --no-dereference -- libcurses.upstream/libcurses/putchar.c libcurses/libcurses/putchar.c
--- libcurses.upstream/libcurses/putchar.c
+++ libcurses/libcurses/putchar.c
@@ -31,6 +31,8 @@
 
 #include <netbsd_sys/cdefs.h>
 
+#include <stdlib.h>
+
 #include "curses.h"
 #include "curses_private.h"
 
@@ -89,7 +91,19 @@
 	__CTRACE(__CTRACE_OUTPUT, "__cputwchar_args: 0x%x on fd %d\n",
 	    wch, outfd->_file);
 #endif
+// PATCH: Sortix does not yet have putwc(3)
+#ifdef __sortix__
+	mbstate_t ps = { 0 };
+	char mb[MB_CUR_MAX];
+	size_t bytes = wcrtomb(mb, wch, &ps);
+	if (bytes == (size_t) -1)
+		return WEOF;
+	if (fwrite(mb, bytes, 1, outfd) != 1)
+		return WEOF;
+	status = wch;
+#else
 	status = putwc(wch, outfd);
+#endif
 	fflush(outfd);
 	return status;
 }
diff -Paur --no-dereference -- libcurses.upstream/libcurses/tstp.c libcurses/libcurses/tstp.c
--- libcurses.upstream/libcurses/tstp.c
+++ libcurses/libcurses/tstp.c
@@ -34,7 +34,6 @@
 #include <netbsd_sys/cdefs.h>
 
 #include <sys/ioctl.h>
-#include <sys/param.h>
 
 #include <errno.h>
 #include <signal.h>
@@ -148,8 +147,7 @@
 	 */
 	if (owsa.sa_handler != SIG_DFL &&
 	    owsa.sa_handler != SIG_IGN &&
-	    owsa.sa_handler != SIG_ERR &&
-	    owsa.sa_handler != SIG_HOLD)
+	    owsa.sa_handler != SIG_ERR)
 		owsa.sa_handler(signo);
 	else
 		_cursesi_screen->resized = 1;
diff -Paur --no-dereference -- libcurses.upstream/libcurses/tty.c libcurses/libcurses/tty.c
--- libcurses.upstream/libcurses/tty.c
+++ libcurses/libcurses/tty.c
@@ -33,7 +33,6 @@
 
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include <sys/param.h>
 #include <sys/types.h>
 
 #include <stdlib.h>
diff -Paur --no-dereference -- libcurses.upstream/libform/field.c libcurses/libform/field.c
--- libcurses.upstream/libform/field.c
+++ libcurses/libform/field.c
@@ -31,7 +31,6 @@
 #include <string.h>
 #include <stdlib.h>
 #include <netbsd_sys/cdefs.h>
-#include <sys/param.h>
 #include <stdlib.h>
 #include <strings.h>
 #include <stdarg.h>
diff -Paur --no-dereference -- libcurses.upstream/libform/type_ipv4.c libcurses/libform/type_ipv4.c
--- libcurses.upstream/libform/type_ipv4.c
+++ libcurses/libform/type_ipv4.c
@@ -79,7 +79,7 @@
 	hex_val = 0;
 	mask = 0;
 	
-	if ((slash = index(buf, '/')) != NULL)
+	if ((slash = strchr(buf, '/')) != NULL)
 		style = FORMI_CLASSLESS;
 	else {
 		start = _formi_skip_blanks(buf, 0);
diff -Paur --no-dereference -- libcurses.upstream/libterminfo/cdbr.c libcurses/libterminfo/cdbr.c
--- libcurses.upstream/libterminfo/cdbr.c
+++ libcurses/libterminfo/cdbr.c
@@ -59,6 +59,8 @@
 #define malloc(size) kmem_alloc(size, KM_SLEEP)
 #define free(ptr) kmem_free(ptr, sizeof(struct cdbr))
 #else
+/* TODO: Sortix <limits.h> doesn't define everything it should. */
+#include <sys/types.h>
 #include <sys/mman.h>
 #include <netbsd_sys/cdbr.h>
 #include <errno.h>
@@ -143,7 +145,8 @@
 
 
 	size = (size_t)sb.st_size;
-	base = mmap(NULL, size, PROT_READ, MAP_FILE|MAP_SHARED, fd, 0);
+	// PATCH: Sortix does not yet support shared memory.
+	base = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
 	close(fd);
 
 	if (base == MAP_FAILED)
diff -Paur --no-dereference -- libcurses.upstream/libterminfo/term.c libcurses/libterminfo/term.c
--- libcurses.upstream/libterminfo/term.c
+++ libcurses/libterminfo/term.c
@@ -52,6 +52,11 @@
 #endif
 #endif
 
+/* TODO: Hack. */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
 #ifdef TERMINFO_DB
 static char __ti_database[PATH_MAX];
 #endif
diff -Paur --no-dereference -- libcurses.upstream/libterminfo/tparm.c libcurses/libterminfo/tparm.c
--- libcurses.upstream/libterminfo/tparm.c
+++ libcurses/libterminfo/tparm.c
@@ -28,11 +28,11 @@
  */
 
 #include <netbsd_sys/cdefs.h>
-#include <sys/param.h>
 
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
diff -Paur --no-dereference -- libcurses.upstream/netbsd_sys/cdefs.h libcurses/netbsd_sys/cdefs.h
--- libcurses.upstream/netbsd_sys/cdefs.h
+++ libcurses/netbsd_sys/cdefs.h
@@ -72,5 +72,10 @@
 #define __unused
 #endif
 
+#if defined(__sortix__)
+#define bcopy(src, dest, size) memcpy(dest, src, size)
+#endif
+#define MAX(a,b) (((a)>(b))?(a):(b))
+
 #endif
 
diff -Paur --no-dereference -- libcurses.upstream/terminfo/sortix.terminfo libcurses/terminfo/sortix.terminfo
--- libcurses.upstream/terminfo/sortix.terminfo
+++ libcurses/terminfo/sortix.terminfo
@@ -0,0 +1,231 @@
+# TODO: Decode setab and setaf and see if they are what I want.
+# TODO: Implement BEL \a and add bel=^G,
+# TODO: Add blink support and add blink=\E[5m,
+# TODO: Add backtab support and add cbt=\E[Z, and kcbt=\E[Z,
+# TODO: Support csr=\E[%i%p1%d;%p2%dr,
+# TODO: Support dch=\E[%p1%dP,
+# TODO: dch1=\E[P,
+# TODO: Add faint support and add dim=\E[2m,
+# TODO: ech=\E[%p1%dX,
+# TODO: hts=\EH,
+# TODO: ich=\E[%p1%d@,
+# TODO: invis=\E[8m,
+# TODO: Some modifiers for the function keys are missing, like control + alt +
+#       shift + f12, kfxx should probably go up to 96. On the other hand,
+#       control-alt-fxx switches virtual terminals.
+# TODO: Sequences for key pad presses (with numlock off) such as kb2
+# TODO: Sequences for backspace with modifiers (kbs)?
+# TODO: Support mouse event kmous=\E[M,
+# TODO: Add italicized support sitm=\E[3m, ritm=\E[23m,
+# TODO: rmkx=\E[?1l\E>,
+# TODO: smkx=\E[?1h\E=,
+
+sortix-16color|Sortix with 16 colors,
+	am,
+	bce,
+	km,
+	mc5i,
+	msgr,
+	npc,
+	xenl,
+	colors#16,
+	cols#80,
+	it#8,
+	lines#25,
+	pairs#256,
+	bold=\E[1m,
+	civis=\E[?25l,
+	clear=\E[H\E[2J,
+	cnorm=\E[?25h,
+	cr=^M,
+	cub1=\E[D,
+	cub=\E[%p1%dD,
+	cud1=^J,
+	cud=\E[%p1%dB,
+	cuf1=\E[C,
+	cuf=\E[%p1%dC,
+	cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A,
+	cuu=\E[%p1%dA,
+	dl1=\E[M,
+	dl=\E[%p1%dM,
+	ed=\E[J,
+	el1=\E[1K,
+	el=\E[K,
+	home=\E[H,
+	hpa=\E[%i%p1%dG,
+	ht=^I,
+	il1=\E[L,
+	il=\E[%p1%dL,
+	ind=^J,
+	indn=\E[%p1%dS,
+	nel=^J,
+	op=\E[39;49m,
+	rc=\E[u,
+	rev=\E[7m,
+	ri=\E[T,
+	rin=\E[%p1%dT,
+	rmcup=\E[?1049l,
+	rmso=\E[27m,
+	sc=\E[s,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
+	sgr0=\E[m,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	smcup=\E[?1049h,
+	smso=\E[7m,
+	vpa=\E[%i%p1%dd,
+	kbs=\177,
+	kcub1=\E[D,
+	kLFT=\E[1;2D,
+	kLFT3=\E[1;3D,
+	kLFT4=\E[1;4D,
+	kLFT5=\E[1;5D,
+	kLFT6=\E[1;6D,
+	kLFT7=\E[1;7D,
+	kLFT8=\E[1;8D,
+	kcud1=\E[B,
+	kDN=\E[1;2B,
+	kDN3=\E[1;3B,
+	kDN4=\E[1;4B,
+	kDN5=\E[1;5B,
+	kDN6=\E[1;6B,
+	kDN7=\E[1;7B,
+	kDN8=\E[1;8B,
+	kcuf1=\E[C,
+	kRIT=\E[1;2C,
+	kRIT3=\E[1;3C,
+	kRIT4=\E[1;4C,
+	kRIT5=\E[1;5C,
+	kRIT6=\E[1;6C,
+	kRIT7=\E[1;7C,
+	kRIT8=\E[1;8C,
+	kcuu1=\E[A,
+	kUP=\E[1;2A,
+	kUP3=\E[1;3A,
+	kUP4=\E[1;4A,
+	kUP5=\E[1;5A,
+	kUP6=\E[1;6A,
+	kUP7=\E[1;7A,
+	kUP8=\E[1;8A,
+	kdch1=\E[3~,
+	kDC=\E[3;2~,
+	kDC3=\E[3;3~,
+	kDC4=\E[3;4~,
+	kDC5=\E[3;5~,
+	kDC6=\E[3;6~,
+	kDC7=\E[3;7~,
+	kDC8=\E[3;8~,
+	kend=\E[F,
+	kEND=\E[1;2F,
+	kEND3=\E[1;3F,
+	kEND4=\E[1;4F,
+	kEND5=\E[1;5F,
+	kEND6=\E[1;6F,
+	kEND7=\E[1;7F,
+	kEND8=\E[1;8F,
+	kent=\E0M,
+	kf1=\EOP,
+	kf2=\EOQ,
+	kf3=\EOR,
+	kf4=\EOS,
+	kf5=\E[15~,
+	kf6=\E[17~,
+	kf7=\E[18~,
+	kf8=\E[19~,
+	kf9=\E[20~,
+	kf10=\E[21~,
+	kf11=\E[23~,
+	kf12=\E[24~,
+	kf13=\E[1;2P,
+	kf14=\E[1;2Q,
+	kf15=\E[1;2R,
+	kf16=\E[1;2S,
+	kf17=\E[15;2~,
+	kf18=\E[17;2~,
+	kf19=\E[18;2~,
+	kf20=\E[19;2~,
+	kf21=\E[20;2~,
+	kf22=\E[21;2~,
+	kf23=\E[23;2~,
+	kf24=\E[24;2~,
+	kf25=\E[1;5P,
+	kf26=\E[1;5Q,
+	kf27=\E[1;5R,
+	kf28=\E[1;5S,
+	kf29=\E[15;5~,
+	kf30=\E[17;5~,
+	kf31=\E[18;5~,
+	kf32=\E[19;5~,
+	kf33=\E[20;5~,
+	kf34=\E[21;5~,
+	kf35=\E[23;5~,
+	kf36=\E[24;5~,
+	kf37=\E[1;6P,
+	kf38=\E[1;6Q,
+	kf39=\E[1;6R,
+	kf40=\E[1;6S,
+	kf41=\E[15;6~,
+	kf42=\E[17;6~,
+	kf43=\E[18;6~,
+	kf44=\E[19;6~,
+	kf45=\E[20;6~,
+	kf46=\E[21;6~,
+	kf47=\E[23;6~,
+	kf48=\E[24;6~,
+	kf49=\E[1;3P,
+	kf50=\E[1;3Q,
+	kf51=\E[1;3R,
+	kf52=\E[1;3S,
+	kf53=\E[15;3~,
+	kf54=\E[17;3~,
+	kf55=\E[18;3~,
+	kf56=\E[19;3~,
+	kf57=\E[20;3~,
+	kf58=\E[21;3~,
+	kf59=\E[23;3~,
+	kf60=\E[24;3~,
+	kf61=\E[1;4P,
+	kf62=\E[1;4Q,
+	kf63=\E[1;4R,
+	khome=\E[H,
+	kHOM=\E[1;2H,
+	kHOM3=\E[1;3H,
+	kHOM4=\E[1;4H,
+	kHOM5=\E[1;5H,
+	kHOM6=\E[1;6H,
+	kHOM7=\E[1;7H,
+	kHOM8=\E[1;8H,
+	kich1=\E[2~,
+	kIC=\E[2;2~,
+	kIC3=\E[2;3~,
+	kIC4=\E[2;4~,
+	kIC5=\E[2;5~,
+	kIC6=\E[2;6~,
+	kIC7=\E[2;7~,
+	kIC8=\E[2;8~,
+	kind=\E[1;2B,
+	knp=\E[6~,
+	kNXT=\E[6;2~,
+	kNXT3=\E[6;3~,
+	kNXT4=\E[6;4~,
+	kNXT5=\E[6;5~,
+	kNXT6=\E[6;6~,
+	kNXT7=\E[6;7~,
+	kNXT8=\E[6;8~,
+	kpp=\E[5~,
+	kPRV=\E[5;2~,
+	kPRV3=\E[5;3~,
+	kPRV4=\E[5;4~,
+	kPRV5=\E[5;5~,
+	kPRV6=\E[5;6~,
+	kPRV7=\E[5;7~,
+	kPRV8=\E[5;8~,
+	kri=\E[1;2A,
+
+sortix|Sortix,
+	use=sortix-16color,
+	colors#256,
+	pairs#32767,
+	smul=\E[4m,
+	rmul=\E[24m,
diff -Paur --no-dereference -- libcurses.upstream/tic/musl-hsearch.c libcurses/tic/musl-hsearch.c
--- libcurses.upstream/tic/musl-hsearch.c
+++ libcurses/tic/musl-hsearch.c
@@ -0,0 +1,172 @@
+/*
+ * Copyright © 2005-2020 Rich Felker, et al.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+
+/*
+open addressing hash table with 2^n table size
+quadratic probing is used in case of hash collision
+tab indices and hash are size_t
+after resize fails with ENOMEM the state of tab is still usable
+
+with the posix api items cannot be iterated and length cannot be queried
+*/
+
+#define MINSIZE 8
+#define MAXSIZE ((size_t)-1/2 + 1)
+
+struct __tab {
+	ENTRY *entries;
+	size_t mask;
+	size_t used;
+};
+
+static struct hsearch_data htab;
+
+int __hcreate_r(size_t, struct hsearch_data *);
+void __hdestroy_r(struct hsearch_data *);
+int __hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
+
+static size_t keyhash(char *k)
+{
+	unsigned char *p = (void *)k;
+	size_t h = 0;
+
+	while (*p)
+		h = 31*h + *p++;
+	return h;
+}
+
+static int resize(size_t nel, struct hsearch_data *htab)
+{
+	size_t newsize;
+	size_t i, j;
+	ENTRY *e, *newe;
+	ENTRY *oldtab = htab->__tab->entries;
+	ENTRY *oldend = htab->__tab->entries + htab->__tab->mask + 1;
+
+	if (nel > MAXSIZE)
+		nel = MAXSIZE;
+	for (newsize = MINSIZE; newsize < nel; newsize *= 2);
+	htab->__tab->entries = calloc(newsize, sizeof *htab->__tab->entries);
+	if (!htab->__tab->entries) {
+		htab->__tab->entries = oldtab;
+		return 0;
+	}
+	htab->__tab->mask = newsize - 1;
+	if (!oldtab)
+		return 1;
+	for (e = oldtab; e < oldend; e++)
+		if (e->key) {
+			for (i=keyhash(e->key),j=1; ; i+=j++) {
+				newe = htab->__tab->entries + (i & htab->__tab->mask);
+				if (!newe->key)
+					break;
+			}
+			*newe = *e;
+		}
+	free(oldtab);
+	return 1;
+}
+
+int hcreate(size_t nel)
+{
+	return __hcreate_r(nel, &htab);
+}
+
+void hdestroy(void)
+{
+	__hdestroy_r(&htab);
+}
+
+static ENTRY *lookup(char *key, size_t hash, struct hsearch_data *htab)
+{
+	size_t i, j;
+	ENTRY *e;
+
+	for (i=hash,j=1; ; i+=j++) {
+		e = htab->__tab->entries + (i & htab->__tab->mask);
+		if (!e->key || strcmp(e->key, key) == 0)
+			break;
+	}
+	return e;
+}
+
+ENTRY *hsearch(ENTRY item, ACTION action)
+{
+	ENTRY *e;
+
+	__hsearch_r(item, action, &e, &htab);
+	return e;
+}
+
+int __hcreate_r(size_t nel, struct hsearch_data *htab)
+{
+	int r;
+
+	htab->__tab = calloc(1, sizeof *htab->__tab);
+	if (!htab->__tab)
+		return 0;
+	r = resize(nel, htab);
+	if (r == 0) {
+		free(htab->__tab);
+		htab->__tab = 0;
+	}
+	return r;
+}
+
+void __hdestroy_r(struct hsearch_data *htab)
+{
+	if (htab->__tab) free(htab->__tab->entries);
+	free(htab->__tab);
+	htab->__tab = 0;
+}
+
+int __hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab)
+{
+	size_t hash = keyhash(item.key);
+	ENTRY *e = lookup(item.key, hash, htab);
+
+	if (e->key) {
+		*retval = e;
+		return 1;
+	}
+	if (action == FIND) {
+		*retval = 0;
+		return 0;
+	}
+	*e = item;
+	if (++htab->__tab->used > htab->__tab->mask - htab->__tab->mask/4) {
+		if (!resize(2*htab->__tab->used, htab)) {
+			htab->__tab->used--;
+			e->key = 0;
+			*retval = 0;
+			return 0;
+		}
+		e = lookup(item.key, hash, htab);
+	}
+	*retval = e;
+	return 1;
+}
diff -Paur --no-dereference -- libcurses.upstream/tic/musl-search.h libcurses/tic/musl-search.h
--- libcurses.upstream/tic/musl-search.h
+++ libcurses/tic/musl-search.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright © 2005-2020 Rich Felker, et al.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _SEARCH_H
+#define _SEARCH_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum { FIND, ENTER } ACTION;
+typedef enum { preorder, postorder, endorder, leaf } VISIT;
+
+typedef struct entry {
+	char *key;
+	void *data;
+} ENTRY;
+
+int hcreate(size_t);
+void hdestroy(void);
+ENTRY *hsearch(ENTRY, ACTION);
+
+#ifdef _GNU_SOURCE
+struct hsearch_data {
+	struct __tab *__tab;
+	unsigned int __unused1;
+	unsigned int __unused2;
+};
+
+int hcreate_r(size_t, struct hsearch_data *);
+void hdestroy_r(struct hsearch_data *);
+int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
+#endif
+
+void insque(void *, void *);
+void remque(void *);
+
+void *lsearch(const void *, void *, size_t *, size_t,
+	int (*)(const void *, const void *));
+void *lfind(const void *, const void *, size_t *, size_t,
+	int (*)(const void *, const void *));
+
+void *tdelete(const void *__restrict, void **__restrict, int(*)(const void *, const void *));
+void *tfind(const void *, void *const *, int(*)(const void *, const void *));
+void *tsearch(const void *, void **, int (*)(const void *, const void *));
+void twalk(const void *, void (*)(const void *, VISIT, int));
+
+#ifdef _GNU_SOURCE
+struct qelem {
+	struct qelem *q_forw, *q_back;
+	char q_data[1];
+};
+
+void tdestroy(void *, void (*)(void *));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff -Paur --no-dereference -- libcurses.upstream/tic/tic.c libcurses/tic/tic.c
--- libcurses.upstream/tic/tic.c
+++ libcurses/tic/tic.c
@@ -50,7 +50,12 @@
 #include <getopt.h>
 #include <limits.h>
 #include <fcntl.h>
+#if !defined(__sortix__) || (defined(__has_include) && __has_include(<search.h>))
 #include <search.h>
+#else
+#include "musl-search.h"
+#include "musl-hsearch.c"
+#endif
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdlib.h>
diff -Paur --no-dereference -- libcurses.upstream/tset/map.c libcurses/tset/map.c
--- libcurses.upstream/tset/map.c
+++ libcurses/tset/map.c
@@ -73,7 +73,7 @@
 	char *copy, *p, *termp;
 
 	copy = strdup(arg);
-	mapp = malloc((u_int)sizeof(MAP));
+	mapp = malloc(sizeof(MAP));
 	if (copy == NULL || mapp == NULL)
 		err(1, "malloc");
 	mapp->next = NULL;
diff -Paur --no-dereference -- libcurses.upstream/tset/set.c libcurses/tset/set.c
--- libcurses.upstream/tset/set.c
+++ libcurses/tset/set.c
@@ -36,7 +36,39 @@
 #include <term.h>
 #include <termios.h>
 #include <unistd.h>
+#if !defined(__sortix__) || (defined(__has_include) && __has_include(<sys/ttydefaults.h>))
 #include <sys/ttydefaults.h>
+#else
+#define CTRL(x) (x&037)
+#define CEOF CTRL('d')
+
+#ifdef _POSIX_VDISABLE
+#define CEOL _POSIX_VDISABLE
+#define CSTATUS _POSIX_VDISABLE
+#else
+#define CEOL '\0'
+#define CSTATUS '\0'
+#endif
+
+#define CERASE 0177
+#define CINTR CTRL('c')
+#define CKILL CTRL('u')
+#define CMIN 1
+#define CQUIT 034
+#define CSUSP CTRL('z')
+#define CTIME 0
+#define CDSUSP CTRL('y')
+#define CSTART CTRL('q')
+#define CSTOP CTRL('s')
+#define CLNEXT CTRL('v')
+#define CDISCARD CTRL('o')
+#define CWERASE CTRL('w')
+#define CREPRINT CTRL('r')
+#define CEOT CEOF
+#define CBRK CEOL
+#define CRPRNT CREPRINT
+#define CFLUSH CDISCARD
+#endif
 #include "extern.h"
 #ifndef OXTABS
 #define OXTABS 0
diff -Paur --no-dereference -- libcurses.upstream/tset/tset.c libcurses/tset/tset.c
--- libcurses.upstream/tset/tset.c
+++ libcurses/tset/tset.c
@@ -35,7 +35,14 @@
 
 #include <sys/types.h>
 #include <sys/ioctl.h>
+#if !defined(__sortix__) || (defined(__has_include) && __has_include(<sys/ttydefaults.h>))
 #include <sys/ttydefaults.h>
+#else
+#define CTRL(x) (x&037)
+#define CERASE 0177
+#define CKILL CTRL('u')
+#define CINTR CTRL('c')
+#endif
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
@@ -47,6 +54,8 @@
 #include <unistd.h>
 #include "extern.h"
 
+typedef unsigned int u_int;
+
 static void	obsolete(char *[]);
 static void	report(const char *, int, u_int);
 __dead static void	usage(char*);
