summaryrefslogtreecommitdiffstats
path: root/debian/patches
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches')
-rw-r--r--debian/patches/platform-quirks.diff47
-rw-r--r--debian/patches/series7
-rw-r--r--debian/patches/upstream-0f6227f46b.diff42
-rw-r--r--debian/patches/upstream-168eab11a7.diff25
-rw-r--r--debian/patches/upstream-19344efa78.diff34
-rw-r--r--debian/patches/upstream-39d41d0810.diff121
-rw-r--r--debian/patches/upstream-8f34504736.diff551
-rw-r--r--debian/patches/upstream-bf636d9575.diff77
8 files changed, 904 insertions, 0 deletions
diff --git a/debian/patches/platform-quirks.diff b/debian/patches/platform-quirks.diff
new file mode 100644
index 0000000..e46fe56
--- /dev/null
+++ b/debian/patches/platform-quirks.diff
@@ -0,0 +1,47 @@
+Description: Platform-specific fixes
+ * Define PATH_MAX, MAX_IOV for Hurd.
+ * Add workaround for broken GNU/kFreeBSD system headers.
+Author: Karl Ferdinand Ebert <kfebert@gmail.com>
+Author: Romain Francoise <rfrancoise@debian.org>
+Author: James Clarke <jrtc27@debian.org>
+Bug-Debian: http://bugs.debian.org/609333
+Forwarded: not-needed
+
+--- a/compat.h
++++ b/compat.h
+@@ -21,6 +21,20 @@
+ #include <sys/ioctl.h>
+ #include <sys/uio.h>
+
++/*
++ * Shouldn't be needed, but GNU/kFreeBSD headers are currently slightly broken.
++ * The glibc limits.h eventually includes the FreeBSD limits-related headers,
++ * which don't define a TTY_NAME_MAX. However, anything (in)directly including
++ * the glibc sys/param.h will include the glibc bits/param.h, which defines
++ * TTY_NAME_MAX as SPECNAMELEN, i.e. 63, which differs from our fallback of 32.
++ * Thus, without this hack, different source files can (and do) end up with
++ * different values for TTY_NAME_MAX, which among other things affects the
++ * layout of struct window_pane due to the tty buffer.
++ */
++#ifdef __FreeBSD_kernel__
++#include <sys/param.h>
++#endif
++
+ #include <fnmatch.h>
+ #include <limits.h>
+ #include <stdio.h>
+@@ -289,6 +303,14 @@ void explicit_bzero(void *, size_t);
+ int getdtablecount(void);
+ #endif
+
++#ifndef PATH_MAX
++#define PATH_MAX 4096
++#endif
++
++#ifndef IOV_MAX
++#define IOV_MAX 1024
++#endif
++
+ #ifndef HAVE_CLOSEFROM
+ /* closefrom.c */
+ void closefrom(int);
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..ab389df
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,7 @@
+platform-quirks.diff
+upstream-0f6227f46b.diff
+upstream-19344efa78.diff
+upstream-8f34504736.diff
+upstream-39d41d0810.diff
+upstream-168eab11a7.diff
+upstream-bf636d9575.diff
diff --git a/debian/patches/upstream-0f6227f46b.diff b/debian/patches/upstream-0f6227f46b.diff
new file mode 100644
index 0000000..c062e60
--- /dev/null
+++ b/debian/patches/upstream-0f6227f46b.diff
@@ -0,0 +1,42 @@
+commit 0f6227f46b1d33476ef448682a2ba0b0290e6d9b
+Author: Nicholas Marriott <nicholas.marriott@gmail.com>
+Date: Thu Jun 2 20:41:21 2022 +0000
+
+ When deleting or renaming a buffer and a buffer name is specified,
+ complain if the buffer doesn't exist instead of silently deleting or
+ renaming the most recent buffer. GitHub issue 3205.
+
+diff --git a/cmd-set-buffer.c b/cmd-set-buffer.c
+index 9112683fc0..c9ffe5edad 100644
+--- a/cmd-set-buffer.c
++++ b/cmd-set-buffer.c
+@@ -69,8 +69,13 @@ cmd_set_buffer_exec(struct cmd *self, struct cmdq_item *item)
+ pb = paste_get_name(bufname);
+
+ if (cmd_get_entry(self) == &cmd_delete_buffer_entry) {
+- if (pb == NULL)
++ if (pb == NULL) {
++ if (bufname != NULL) {
++ cmdq_error(item, "unknown buffer: %s", bufname);
++ return (CMD_RETURN_ERROR);
++ }
+ pb = paste_get_top(&bufname);
++ }
+ if (pb == NULL) {
+ cmdq_error(item, "no buffer");
+ return (CMD_RETURN_ERROR);
+@@ -80,8 +85,13 @@ cmd_set_buffer_exec(struct cmd *self, struct cmdq_item *item)
+ }
+
+ if (args_has(args, 'n')) {
+- if (pb == NULL)
++ if (pb == NULL) {
++ if (bufname != NULL) {
++ cmdq_error(item, "unknown buffer: %s", bufname);
++ return (CMD_RETURN_ERROR);
++ }
+ pb = paste_get_top(&bufname);
++ }
+ if (pb == NULL) {
+ cmdq_error(item, "no buffer");
+ return (CMD_RETURN_ERROR);
diff --git a/debian/patches/upstream-168eab11a7.diff b/debian/patches/upstream-168eab11a7.diff
new file mode 100644
index 0000000..be8a90c
--- /dev/null
+++ b/debian/patches/upstream-168eab11a7.diff
@@ -0,0 +1,25 @@
+From 736f7f223235bc050d71565ef243739ef27af066 Mon Sep 17 00:00:00 2001
+From: Nicholas Marriott <nicholas.marriott@gmail.com>
+Date: Fri, 28 Apr 2023 07:23:53 +0100
+Subject: [PATCH 3/4] Cast both strings for tparm.
+
+---
+ tty-term.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tty-term.c b/tty-term.c
+index 18b174208d..f2b548d811 100644
+--- a/tty-term.c
++++ b/tty-term.c
+@@ -839,7 +839,7 @@ tty_term_string_ss(struct tty_term *term, enum tty_code_code code,
+ #elif defined(HAVE_TIPARM)
+ s = tiparm(x, a, b);
+ #else
+- s = tparm((char *)x, (long)a, b, 0, 0, 0, 0, 0, 0, 0);
++ s = tparm((char *)x, (long)a, (long)b, 0, 0, 0, 0, 0, 0, 0);
+ #endif
+ if (s == NULL)
+ fatalx("could not expand %s", tty_term_codes[code].name);
+--
+2.39.2
+
diff --git a/debian/patches/upstream-19344efa78.diff b/debian/patches/upstream-19344efa78.diff
new file mode 100644
index 0000000..aa14f19
--- /dev/null
+++ b/debian/patches/upstream-19344efa78.diff
@@ -0,0 +1,34 @@
+From 19344efa78be23a02008be9da0991f54455c9f9e Mon Sep 17 00:00:00 2001
+From: Nicholas Marriott <nicholas.marriott@gmail.com>
+Date: Mon, 22 Aug 2022 08:20:49 +0100
+Subject: [PATCH] Fix fallback implementaion of getpeereid, from Pino Toscano.
+
+---
+ compat/getpeereid.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/compat/getpeereid.c b/compat/getpeereid.c
+index c194e886..b79f420a 100644
+--- a/compat/getpeereid.c
++++ b/compat/getpeereid.c
+@@ -18,6 +18,7 @@
+ #include <sys/socket.h>
+
+ #include <stdio.h>
++#include <unistd.h>
+
+ #ifdef HAVE_UCRED_H
+ #include <ucred.h>
+@@ -49,6 +50,8 @@ getpeereid(int s, uid_t *uid, gid_t *gid)
+ ucred_free(ucred);
+ return (0);
+ #else
+- return (getuid());
++ *uid = geteuid();
++ *gid = getegid();
++ return (0);
+ #endif
+ }
+--
+2.35.1
+
diff --git a/debian/patches/upstream-39d41d0810.diff b/debian/patches/upstream-39d41d0810.diff
new file mode 100644
index 0000000..8b8abb7
--- /dev/null
+++ b/debian/patches/upstream-39d41d0810.diff
@@ -0,0 +1,121 @@
+From b77cfc8d2b4d0c894793efaf106b37c17d29d2d0 Mon Sep 17 00:00:00 2001
+From: Nicholas Marriott <nicholas.marriott@gmail.com>
+Date: Fri, 28 Apr 2023 06:44:40 +0100
+Subject: [PATCH 2/4] Use ncurses' new tparm_s function (added in 6.4-20230424)
+ instead of tparm so it does not object to string arguments in capabilities it
+ doesn't already know.
+
+---
+ configure.ac | 4 ++++
+ tty-term.c | 48 +++++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 43 insertions(+), 9 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 2b8b3b11ac..3c3c187393 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -344,6 +344,10 @@ else
+ AC_MSG_ERROR("curses not found")
+ fi
+ fi
++AC_CHECK_FUNCS([ \
++ tiparm \
++ tiparm_s \
++])
+
+ # Look for utempter.
+ AC_ARG_ENABLE(
+diff --git a/tty-term.c b/tty-term.c
+index 32dd849ac7..18b174208d 100644
+--- a/tty-term.c
++++ b/tty-term.c
+@@ -764,7 +764,13 @@ tty_term_string_i(struct tty_term *term, enum tty_code_code code, int a)
+ {
+ const char *x = tty_term_string(term, code), *s;
+
+- s = tparm((char *)x, a);
++#if defined(HAVE_TIPARM_S)
++ s = tiparm_s(1, 0, x, a);
++#elif defined(HAVE_TIPARM)
++ s = tiparm(x, a);
++#else
++ s = tparm((char *)x, a, 0, 0, 0, 0, 0, 0, 0, 0);
++#endif
+ if (s == NULL)
+ fatalx("could not expand %s", tty_term_codes[code].name);
+ return (s);
+@@ -775,19 +781,31 @@ tty_term_string_ii(struct tty_term *term, enum tty_code_code code, int a, int b)
+ {
+ const char *x = tty_term_string(term, code), *s;
+
+- s = tparm((char *)x, a, b);
++#if defined(HAVE_TIPARM_S)
++ s = tiparm_s(2, 0, x, a, b);
++#elif defined(HAVE_TIPARM)
++ s = tiparm(x, a, b);
++#else
++ s = tparm((char *)x, a, b, 0, 0, 0, 0, 0, 0, 0);
++#endif
+ if (s == NULL)
+ fatalx("could not expand %s", tty_term_codes[code].name);
+ return (s);
+ }
+
+ const char *
+-tty_term_string_iii(struct tty_term *term, enum tty_code_code code, int a, int b,
+- int c)
++tty_term_string_iii(struct tty_term *term, enum tty_code_code code, int a,
++ int b, int c)
+ {
+ const char *x = tty_term_string(term, code), *s;
+
+- s = tparm((char *)x, a, b, c);
++#if defined(HAVE_TIPARM_S)
++ s = tiparm_s(3, 0, x, a, b, c);
++#elif defined(HAVE_TIPARM)
++ s = tiparm(x, a, b, c);
++#else
++ s = tparm((char *)x, a, b, c, 0, 0, 0, 0, 0, 0);
++#endif
+ if (s == NULL)
+ fatalx("could not expand %s", tty_term_codes[code].name);
+ return (s);
+@@ -798,19 +816,31 @@ tty_term_string_s(struct tty_term *term, enum tty_code_code code, const char *a)
+ {
+ const char *x = tty_term_string(term, code), *s;
+
+- s = tparm((char *)x, (long)a);
++#if defined(HAVE_TIPARM_S)
++ s = tiparm_s(1, 1, x, a);
++#elif defined(HAVE_TIPARM)
++ s = tiparm(x, a);
++#else
++ s = tparm((char *)x, (long)a, 0, 0, 0, 0, 0, 0, 0, 0);
++#endif
+ if (s == NULL)
+ fatalx("could not expand %s", tty_term_codes[code].name);
+ return (s);
+ }
+
+ const char *
+-tty_term_string_ss(struct tty_term *term, enum tty_code_code code, const char *a,
+- const char *b)
++tty_term_string_ss(struct tty_term *term, enum tty_code_code code,
++ const char *a, const char *b)
+ {
+ const char *x = tty_term_string(term, code), *s;
+
+- s = tparm((char *)x, (long)a, (long)b);
++#if defined(HAVE_TIPARM_S)
++ s = tiparm_s(2, 3, x, a, b);
++#elif defined(HAVE_TIPARM)
++ s = tiparm(x, a, b);
++#else
++ s = tparm((char *)x, (long)a, b, 0, 0, 0, 0, 0, 0, 0);
++#endif
+ if (s == NULL)
+ fatalx("could not expand %s", tty_term_codes[code].name);
+ return (s);
+--
+2.39.2
+
diff --git a/debian/patches/upstream-8f34504736.diff b/debian/patches/upstream-8f34504736.diff
new file mode 100644
index 0000000..b407d60
--- /dev/null
+++ b/debian/patches/upstream-8f34504736.diff
@@ -0,0 +1,551 @@
+From fcfd84d75749b53f1adabcedf16c83eccb15c1a1 Mon Sep 17 00:00:00 2001
+From: nicm <nicm>
+Date: Tue, 25 Apr 2023 09:31:50 +0000
+Subject: [PATCH 1/4] Tidy tparm wrapper functions to have more obvious names
+ and check tparm return value.
+
+---
+ tmux.h | 26 ++++++------
+ tty-term.c | 47 ++++++++++++++++-----
+ tty.c | 118 ++++++++++++++++++++++++++---------------------------
+ 3 files changed, 108 insertions(+), 83 deletions(-)
+
+diff --git a/tmux.h b/tmux.h
+index 53084b8b07..5a90352e76 100644
+--- a/tmux.h
++++ b/tmux.h
+@@ -2250,12 +2250,12 @@ void tty_margin_off(struct tty *);
+ void tty_cursor(struct tty *, u_int, u_int);
+ void tty_clipboard_query(struct tty *);
+ void tty_putcode(struct tty *, enum tty_code_code);
+-void tty_putcode1(struct tty *, enum tty_code_code, int);
+-void tty_putcode2(struct tty *, enum tty_code_code, int, int);
+-void tty_putcode3(struct tty *, enum tty_code_code, int, int, int);
+-void tty_putcode_ptr1(struct tty *, enum tty_code_code, const void *);
+-void tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *,
+- const void *);
++void tty_putcode_i(struct tty *, enum tty_code_code, int);
++void tty_putcode_ii(struct tty *, enum tty_code_code, int, int);
++void tty_putcode_iii(struct tty *, enum tty_code_code, int, int, int);
++void tty_putcode_s(struct tty *, enum tty_code_code, const char *);
++void tty_putcode_ss(struct tty *, enum tty_code_code, const char *,
++ const char *);
+ void tty_puts(struct tty *, const char *);
+ void tty_putc(struct tty *, u_char);
+ void tty_putn(struct tty *, const void *, size_t, u_int);
+@@ -2318,15 +2318,15 @@ int tty_term_read_list(const char *, int, char ***, u_int *,
+ void tty_term_free_list(char **, u_int);
+ int tty_term_has(struct tty_term *, enum tty_code_code);
+ const char *tty_term_string(struct tty_term *, enum tty_code_code);
+-const char *tty_term_string1(struct tty_term *, enum tty_code_code, int);
+-const char *tty_term_string2(struct tty_term *, enum tty_code_code, int,
++const char *tty_term_string_i(struct tty_term *, enum tty_code_code, int);
++const char *tty_term_string_ii(struct tty_term *, enum tty_code_code, int,
+ int);
+-const char *tty_term_string3(struct tty_term *, enum tty_code_code, int,
++const char *tty_term_string_iii(struct tty_term *, enum tty_code_code, int,
+ int, int);
+-const char *tty_term_ptr1(struct tty_term *, enum tty_code_code,
+- const void *);
+-const char *tty_term_ptr2(struct tty_term *, enum tty_code_code,
+- const void *, const void *);
++const char *tty_term_string_s(struct tty_term *, enum tty_code_code,
++ const char *);
++const char *tty_term_string_ss(struct tty_term *, enum tty_code_code,
++ const char *, const char *);
+ int tty_term_number(struct tty_term *, enum tty_code_code);
+ int tty_term_flag(struct tty_term *, enum tty_code_code);
+ const char *tty_term_describe(struct tty_term *, enum tty_code_code);
+diff --git a/tty-term.c b/tty-term.c
+index fdf0c4faf2..32dd849ac7 100644
+--- a/tty-term.c
++++ b/tty-term.c
+@@ -760,35 +760,60 @@ tty_term_string(struct tty_term *term, enum tty_code_code code)
+ }
+
+ const char *
+-tty_term_string1(struct tty_term *term, enum tty_code_code code, int a)
++tty_term_string_i(struct tty_term *term, enum tty_code_code code, int a)
+ {
+- return (tparm((char *) tty_term_string(term, code), a, 0, 0, 0, 0, 0, 0, 0, 0));
++ const char *x = tty_term_string(term, code), *s;
++
++ s = tparm((char *)x, a);
++ if (s == NULL)
++ fatalx("could not expand %s", tty_term_codes[code].name);
++ return (s);
+ }
+
+ const char *
+-tty_term_string2(struct tty_term *term, enum tty_code_code code, int a, int b)
++tty_term_string_ii(struct tty_term *term, enum tty_code_code code, int a, int b)
+ {
+- return (tparm((char *) tty_term_string(term, code), a, b, 0, 0, 0, 0, 0, 0, 0));
++ const char *x = tty_term_string(term, code), *s;
++
++ s = tparm((char *)x, a, b);
++ if (s == NULL)
++ fatalx("could not expand %s", tty_term_codes[code].name);
++ return (s);
+ }
+
+ const char *
+-tty_term_string3(struct tty_term *term, enum tty_code_code code, int a, int b,
++tty_term_string_iii(struct tty_term *term, enum tty_code_code code, int a, int b,
+ int c)
+ {
+- return (tparm((char *) tty_term_string(term, code), a, b, c, 0, 0, 0, 0, 0, 0));
++ const char *x = tty_term_string(term, code), *s;
++
++ s = tparm((char *)x, a, b, c);
++ if (s == NULL)
++ fatalx("could not expand %s", tty_term_codes[code].name);
++ return (s);
+ }
+
+ const char *
+-tty_term_ptr1(struct tty_term *term, enum tty_code_code code, const void *a)
++tty_term_string_s(struct tty_term *term, enum tty_code_code code, const char *a)
+ {
+- return (tparm((char *) tty_term_string(term, code), (long)a, 0, 0, 0, 0, 0, 0, 0, 0));
++ const char *x = tty_term_string(term, code), *s;
++
++ s = tparm((char *)x, (long)a);
++ if (s == NULL)
++ fatalx("could not expand %s", tty_term_codes[code].name);
++ return (s);
+ }
+
+ const char *
+-tty_term_ptr2(struct tty_term *term, enum tty_code_code code, const void *a,
+- const void *b)
++tty_term_string_ss(struct tty_term *term, enum tty_code_code code, const char *a,
++ const char *b)
+ {
+- return (tparm((char *) tty_term_string(term, code), (long)a, (long)b, 0, 0, 0, 0, 0, 0, 0));
++ const char *x = tty_term_string(term, code), *s;
++
++ s = tparm((char *)x, (long)a, (long)b);
++ if (s == NULL)
++ fatalx("could not expand %s", tty_term_codes[code].name);
++ return (s);
+ }
+
+ int
+diff --git a/tty.c b/tty.c
+index 49cf9795f7..a4d744d0df 100644
+--- a/tty.c
++++ b/tty.c
+@@ -399,7 +399,7 @@ tty_stop_tty(struct tty *tty)
+ if (tcsetattr(c->fd, TCSANOW, &tty->tio) == -1)
+ return;
+
+- tty_raw(tty, tty_term_string2(tty->term, TTYC_CSR, 0, ws.ws_row - 1));
++ tty_raw(tty, tty_term_string_ii(tty->term, TTYC_CSR, 0, ws.ws_row - 1));
+ if (tty_acs_needed(tty))
+ tty_raw(tty, tty_term_string(tty->term, TTYC_RMACS));
+ tty_raw(tty, tty_term_string(tty->term, TTYC_SGR0));
+@@ -409,7 +409,7 @@ tty_stop_tty(struct tty *tty)
+ if (tty_term_has(tty->term, TTYC_SE))
+ tty_raw(tty, tty_term_string(tty->term, TTYC_SE));
+ else if (tty_term_has(tty->term, TTYC_SS))
+- tty_raw(tty, tty_term_string1(tty->term, TTYC_SS, 0));
++ tty_raw(tty, tty_term_string_i(tty->term, TTYC_SS, 0));
+ }
+ if (tty->mode & MODE_BRACKETPASTE)
+ tty_raw(tty, tty_term_string(tty->term, TTYC_DSBP));
+@@ -506,42 +506,42 @@ tty_putcode(struct tty *tty, enum tty_code_code code)
+ }
+
+ void
+-tty_putcode1(struct tty *tty, enum tty_code_code code, int a)
++tty_putcode_i(struct tty *tty, enum tty_code_code code, int a)
+ {
+ if (a < 0)
+ return;
+- tty_puts(tty, tty_term_string1(tty->term, code, a));
++ tty_puts(tty, tty_term_string_i(tty->term, code, a));
+ }
+
+ void
+-tty_putcode2(struct tty *tty, enum tty_code_code code, int a, int b)
++tty_putcode_ii(struct tty *tty, enum tty_code_code code, int a, int b)
+ {
+ if (a < 0 || b < 0)
+ return;
+- tty_puts(tty, tty_term_string2(tty->term, code, a, b));
++ tty_puts(tty, tty_term_string_ii(tty->term, code, a, b));
+ }
+
+ void
+-tty_putcode3(struct tty *tty, enum tty_code_code code, int a, int b, int c)
++tty_putcode_iii(struct tty *tty, enum tty_code_code code, int a, int b, int c)
+ {
+ if (a < 0 || b < 0 || c < 0)
+ return;
+- tty_puts(tty, tty_term_string3(tty->term, code, a, b, c));
++ tty_puts(tty, tty_term_string_iii(tty->term, code, a, b, c));
+ }
+
+ void
+-tty_putcode_ptr1(struct tty *tty, enum tty_code_code code, const void *a)
++tty_putcode_s(struct tty *tty, enum tty_code_code code, const char *a)
+ {
+ if (a != NULL)
+- tty_puts(tty, tty_term_ptr1(tty->term, code, a));
++ tty_puts(tty, tty_term_string_s(tty->term, code, a));
+ }
+
+ void
+-tty_putcode_ptr2(struct tty *tty, enum tty_code_code code, const void *a,
+- const void *b)
++tty_putcode_ss(struct tty *tty, enum tty_code_code code, const char *a,
++ const char *b)
+ {
+ if (a != NULL && b != NULL)
+- tty_puts(tty, tty_term_ptr2(tty->term, code, a, b));
++ tty_puts(tty, tty_term_string_ss(tty->term, code, a, b));
+ }
+
+ static void
+@@ -603,7 +603,7 @@ tty_putc(struct tty *tty, u_char ch)
+ * it works on sensible terminals as well.
+ */
+ if (tty->term->flags & TERM_NOAM)
+- tty_putcode2(tty, TTYC_CUP, tty->cy, tty->cx);
++ tty_putcode_ii(tty, TTYC_CUP, tty->cy, tty->cx);
+ } else
+ tty->cx++;
+ }
+@@ -682,7 +682,7 @@ tty_force_cursor_colour(struct tty *tty, int c)
+ else {
+ colour_split_rgb(c, &r, &g, &b);
+ xsnprintf(s, sizeof s, "rgb:%02hhx/%02hhx/%02hhx", r, g, b);
+- tty_putcode_ptr1(tty, TTYC_CS, s);
++ tty_putcode_s(tty, TTYC_CS, s);
+ }
+ tty->ccolour = c;
+ }
+@@ -743,7 +743,7 @@ tty_update_cursor(struct tty *tty, int mode, struct screen *s)
+ if (tty_term_has(tty->term, TTYC_SE))
+ tty_putcode(tty, TTYC_SE);
+ else
+- tty_putcode1(tty, TTYC_SS, 0);
++ tty_putcode_i(tty, TTYC_SS, 0);
+ }
+ if (cmode & (MODE_CURSOR_BLINKING|MODE_CURSOR_VERY_VISIBLE))
+ tty_putcode(tty, TTYC_CVVIS);
+@@ -751,27 +751,27 @@ tty_update_cursor(struct tty *tty, int mode, struct screen *s)
+ case SCREEN_CURSOR_BLOCK:
+ if (tty_term_has(tty->term, TTYC_SS)) {
+ if (cmode & MODE_CURSOR_BLINKING)
+- tty_putcode1(tty, TTYC_SS, 1);
++ tty_putcode_i(tty, TTYC_SS, 1);
+ else
+- tty_putcode1(tty, TTYC_SS, 2);
++ tty_putcode_i(tty, TTYC_SS, 2);
+ } else if (cmode & MODE_CURSOR_BLINKING)
+ tty_putcode(tty, TTYC_CVVIS);
+ break;
+ case SCREEN_CURSOR_UNDERLINE:
+ if (tty_term_has(tty->term, TTYC_SS)) {
+ if (cmode & MODE_CURSOR_BLINKING)
+- tty_putcode1(tty, TTYC_SS, 3);
++ tty_putcode_i(tty, TTYC_SS, 3);
+ else
+- tty_putcode1(tty, TTYC_SS, 4);
++ tty_putcode_i(tty, TTYC_SS, 4);
+ } else if (cmode & MODE_CURSOR_BLINKING)
+ tty_putcode(tty, TTYC_CVVIS);
+ break;
+ case SCREEN_CURSOR_BAR:
+ if (tty_term_has(tty->term, TTYC_SS)) {
+ if (cmode & MODE_CURSOR_BLINKING)
+- tty_putcode1(tty, TTYC_SS, 5);
++ tty_putcode_i(tty, TTYC_SS, 5);
+ else
+- tty_putcode1(tty, TTYC_SS, 6);
++ tty_putcode_i(tty, TTYC_SS, 6);
+ } else if (cmode & MODE_CURSOR_BLINKING)
+ tty_putcode(tty, TTYC_CVVIS);
+ break;
+@@ -833,7 +833,7 @@ tty_emulate_repeat(struct tty *tty, enum tty_code_code code,
+ enum tty_code_code code1, u_int n)
+ {
+ if (tty_term_has(tty->term, code))
+- tty_putcode1(tty, code, n);
++ tty_putcode_i(tty, code, n);
+ else {
+ while (n-- > 0)
+ tty_putcode(tty, code1);
+@@ -1122,7 +1122,7 @@ tty_clear_line(struct tty *tty, const struct grid_cell *defaults, u_int py,
+ /* Section of line. Use ECH if possible. */
+ if (tty_term_has(tty->term, TTYC_ECH)) {
+ tty_cursor(tty, px, py);
+- tty_putcode1(tty, TTYC_ECH, nx);
++ tty_putcode_i(tty, TTYC_ECH, nx);
+ return;
+ }
+ }
+@@ -1263,7 +1263,7 @@ tty_clear_area(struct tty *tty, const struct grid_cell *defaults, u_int py,
+ tty_term_has(tty->term, TTYC_INDN)) {
+ tty_region(tty, py, py + ny - 1);
+ tty_margin_off(tty);
+- tty_putcode1(tty, TTYC_INDN, ny);
++ tty_putcode_i(tty, TTYC_INDN, ny);
+ return;
+ }
+
+@@ -1278,7 +1278,7 @@ tty_clear_area(struct tty *tty, const struct grid_cell *defaults, u_int py,
+ tty_term_has(tty->term, TTYC_INDN)) {
+ tty_region(tty, py, py + ny - 1);
+ tty_margin(tty, px, px + nx - 1);
+- tty_putcode1(tty, TTYC_INDN, ny);
++ tty_putcode_i(tty, TTYC_INDN, ny);
+ return;
+ }
+ }
+@@ -1579,7 +1579,7 @@ tty_sync_start(struct tty *tty)
+
+ if (tty_term_has(tty->term, TTYC_SYNC)) {
+ log_debug("%s sync start", tty->client->name);
+- tty_putcode1(tty, TTYC_SYNC, 1);
++ tty_putcode_i(tty, TTYC_SYNC, 1);
+ }
+ }
+
+@@ -1594,7 +1594,7 @@ tty_sync_end(struct tty *tty)
+
+ if (tty_term_has(tty->term, TTYC_SYNC)) {
+ log_debug("%s sync end", tty->client->name);
+- tty_putcode1(tty, TTYC_SYNC, 2);
++ tty_putcode_i(tty, TTYC_SYNC, 2);
+ }
+ }
+
+@@ -1793,7 +1793,7 @@ tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx)
+ if (tty_term_has(tty->term, TTYC_RI))
+ tty_putcode(tty, TTYC_RI);
+ else
+- tty_putcode1(tty, TTYC_RIN, 1);
++ tty_putcode_i(tty, TTYC_RIN, 1);
+ }
+
+ void
+@@ -1872,7 +1872,7 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
+ tty_cursor(tty, 0, 0);
+ else
+ tty_cursor(tty, 0, tty->cy);
+- tty_putcode1(tty, TTYC_INDN, ctx->num);
++ tty_putcode_i(tty, TTYC_INDN, ctx->num);
+ }
+ }
+
+@@ -1902,7 +1902,7 @@ tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx)
+ tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper);
+
+ if (tty_term_has(tty->term, TTYC_RIN))
+- tty_putcode1(tty, TTYC_RIN, ctx->num);
++ tty_putcode_i(tty, TTYC_RIN, ctx->num);
+ else {
+ for (i = 0; i < ctx->num; i++)
+ tty_putcode(tty, TTYC_RI);
+@@ -2101,7 +2101,7 @@ tty_set_selection(struct tty *tty, const char *buf, size_t len)
+
+ b64_ntop(buf, len, encoded, size);
+ tty->flags |= TTY_NOBLOCK;
+- tty_putcode_ptr2(tty, TTYC_MS, "", encoded);
++ tty_putcode_ss(tty, TTYC_MS, "", encoded);
+
+ free(encoded);
+ }
+@@ -2246,7 +2246,7 @@ tty_region(struct tty *tty, u_int rupper, u_int rlower)
+ tty_cursor(tty, 0, tty->cy);
+ }
+
+- tty_putcode2(tty, TTYC_CSR, tty->rupper, tty->rlower);
++ tty_putcode_ii(tty, TTYC_CSR, tty->rupper, tty->rlower);
+ tty->cx = tty->cy = UINT_MAX;
+ }
+
+@@ -2274,7 +2274,7 @@ tty_margin(struct tty *tty, u_int rleft, u_int rright)
+ if (tty->rleft == rleft && tty->rright == rright)
+ return;
+
+- tty_putcode2(tty, TTYC_CSR, tty->rupper, tty->rlower);
++ tty_putcode_ii(tty, TTYC_CSR, tty->rupper, tty->rlower);
+
+ tty->rleft = rleft;
+ tty->rright = rright;
+@@ -2282,7 +2282,7 @@ tty_margin(struct tty *tty, u_int rleft, u_int rright)
+ if (rleft == 0 && rright == tty->sx - 1)
+ tty_putcode(tty, TTYC_CLMG);
+ else
+- tty_putcode2(tty, TTYC_CMG, rleft, rright);
++ tty_putcode_ii(tty, TTYC_CMG, rleft, rright);
+ tty->cx = tty->cy = UINT_MAX;
+ }
+
+@@ -2392,7 +2392,7 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy)
+ * the cursor with CUB/CUF.
+ */
+ if ((u_int) abs(change) > cx && tty_term_has(term, TTYC_HPA)) {
+- tty_putcode1(tty, TTYC_HPA, cx);
++ tty_putcode_i(tty, TTYC_HPA, cx);
+ goto out;
+ } else if (change > 0 &&
+ tty_term_has(term, TTYC_CUB) &&
+@@ -2402,12 +2402,12 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy)
+ tty_putcode(tty, TTYC_CUB1);
+ goto out;
+ }
+- tty_putcode1(tty, TTYC_CUB, change);
++ tty_putcode_i(tty, TTYC_CUB, change);
+ goto out;
+ } else if (change < 0 &&
+ tty_term_has(term, TTYC_CUF) &&
+ !tty_use_margin(tty)) {
+- tty_putcode1(tty, TTYC_CUF, -change);
++ tty_putcode_i(tty, TTYC_CUF, -change);
+ goto out;
+ }
+ } else if (cx == thisx) {
+@@ -2440,21 +2440,21 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy)
+ (change < 0 && cy - change > tty->rlower) ||
+ (change > 0 && cy - change < tty->rupper)) {
+ if (tty_term_has(term, TTYC_VPA)) {
+- tty_putcode1(tty, TTYC_VPA, cy);
++ tty_putcode_i(tty, TTYC_VPA, cy);
+ goto out;
+ }
+ } else if (change > 0 && tty_term_has(term, TTYC_CUU)) {
+- tty_putcode1(tty, TTYC_CUU, change);
++ tty_putcode_i(tty, TTYC_CUU, change);
+ goto out;
+ } else if (change < 0 && tty_term_has(term, TTYC_CUD)) {
+- tty_putcode1(tty, TTYC_CUD, -change);
++ tty_putcode_i(tty, TTYC_CUD, -change);
+ goto out;
+ }
+ }
+
+ absolute:
+ /* Absolute movement. */
+- tty_putcode2(tty, TTYC_CUP, cy, cx);
++ tty_putcode_ii(tty, TTYC_CUP, cy, cx);
+
+ out:
+ tty->cx = cx;
+@@ -2533,13 +2533,13 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc,
+ !tty_term_has(tty->term, TTYC_SMULX))
+ tty_putcode(tty, TTYC_SMUL);
+ else if (changed & GRID_ATTR_UNDERSCORE_2)
+- tty_putcode1(tty, TTYC_SMULX, 2);
++ tty_putcode_i(tty, TTYC_SMULX, 2);
+ else if (changed & GRID_ATTR_UNDERSCORE_3)
+- tty_putcode1(tty, TTYC_SMULX, 3);
++ tty_putcode_i(tty, TTYC_SMULX, 3);
+ else if (changed & GRID_ATTR_UNDERSCORE_4)
+- tty_putcode1(tty, TTYC_SMULX, 4);
++ tty_putcode_i(tty, TTYC_SMULX, 4);
+ else if (changed & GRID_ATTR_UNDERSCORE_5)
+- tty_putcode1(tty, TTYC_SMULX, 5);
++ tty_putcode_i(tty, TTYC_SMULX, 5);
+ }
+ if (changed & GRID_ATTR_BLINK)
+ tty_putcode(tty, TTYC_BLINK);
+@@ -2593,14 +2593,14 @@ tty_colours(struct tty *tty, const struct grid_cell *gc)
+ if (have_ax)
+ tty_puts(tty, "\033[39m");
+ else if (tc->fg != 7)
+- tty_putcode1(tty, TTYC_SETAF, 7);
++ tty_putcode_i(tty, TTYC_SETAF, 7);
+ tc->fg = gc->fg;
+ }
+ if (COLOUR_DEFAULT(gc->bg) && !COLOUR_DEFAULT(tc->bg)) {
+ if (have_ax)
+ tty_puts(tty, "\033[49m");
+ else if (tc->bg != 0)
+- tty_putcode1(tty, TTYC_SETAB, 0);
++ tty_putcode_i(tty, TTYC_SETAB, 0);
+ tc->bg = gc->bg;
+ }
+ }
+@@ -2768,12 +2768,12 @@ tty_colours_fg(struct tty *tty, const struct grid_cell *gc)
+ xsnprintf(s, sizeof s, "\033[%dm", gc->fg);
+ tty_puts(tty, s);
+ } else
+- tty_putcode1(tty, TTYC_SETAF, gc->fg - 90 + 8);
++ tty_putcode_i(tty, TTYC_SETAF, gc->fg - 90 + 8);
+ goto save;
+ }
+
+ /* Otherwise set the foreground colour. */
+- tty_putcode1(tty, TTYC_SETAF, gc->fg);
++ tty_putcode_i(tty, TTYC_SETAF, gc->fg);
+
+ save:
+ /* Save the new values in the terminal current cell. */
+@@ -2800,12 +2800,12 @@ tty_colours_bg(struct tty *tty, const struct grid_cell *gc)
+ xsnprintf(s, sizeof s, "\033[%dm", gc->bg + 10);
+ tty_puts(tty, s);
+ } else
+- tty_putcode1(tty, TTYC_SETAB, gc->bg - 90 + 8);
++ tty_putcode_i(tty, TTYC_SETAB, gc->bg - 90 + 8);
+ goto save;
+ }
+
+ /* Otherwise set the background colour. */
+- tty_putcode1(tty, TTYC_SETAB, gc->bg);
++ tty_putcode_i(tty, TTYC_SETAB, gc->bg);
+
+ save:
+ /* Save the new values in the terminal current cell. */
+@@ -2841,10 +2841,10 @@ tty_colours_us(struct tty *tty, const struct grid_cell *gc)
+ * non-RGB version may be wrong.
+ */
+ if (tty_term_has(tty->term, TTYC_SETULC))
+- tty_putcode1(tty, TTYC_SETULC, c);
++ tty_putcode_i(tty, TTYC_SETULC, c);
+ else if (tty_term_has(tty->term, TTYC_SETAL) &&
+ tty_term_has(tty->term, TTYC_RGB))
+- tty_putcode1(tty, TTYC_SETAL, c);
++ tty_putcode_i(tty, TTYC_SETAL, c);
+
+ save:
+ /* Save the new values in the terminal current cell. */
+@@ -2858,18 +2858,18 @@ tty_try_colour(struct tty *tty, int colour, const char *type)
+
+ if (colour & COLOUR_FLAG_256) {
+ if (*type == '3' && tty_term_has(tty->term, TTYC_SETAF))
+- tty_putcode1(tty, TTYC_SETAF, colour & 0xff);
++ tty_putcode_i(tty, TTYC_SETAF, colour & 0xff);
+ else if (tty_term_has(tty->term, TTYC_SETAB))
+- tty_putcode1(tty, TTYC_SETAB, colour & 0xff);
++ tty_putcode_i(tty, TTYC_SETAB, colour & 0xff);
+ return (0);
+ }
+
+ if (colour & COLOUR_FLAG_RGB) {
+ colour_split_rgb(colour & 0xffffff, &r, &g, &b);
+ if (*type == '3' && tty_term_has(tty->term, TTYC_SETRGBF))
+- tty_putcode3(tty, TTYC_SETRGBF, r, g, b);
++ tty_putcode_iii(tty, TTYC_SETRGBF, r, g, b);
+ else if (tty_term_has(tty->term, TTYC_SETRGBB))
+- tty_putcode3(tty, TTYC_SETRGBB, r, g, b);
++ tty_putcode_iii(tty, TTYC_SETRGBB, r, g, b);
+ return (0);
+ }
+
+@@ -2953,7 +2953,7 @@ tty_clipboard_query(struct tty *tty)
+
+ if ((~tty->flags & TTY_STARTED) || (tty->flags & TTY_OSC52QUERY))
+ return;
+- tty_putcode_ptr2(tty, TTYC_MS, "", "?");
++ tty_putcode_ss(tty, TTYC_MS, "", "?");
+
+ tty->flags |= TTY_OSC52QUERY;
+ evtimer_set(&tty->clipboard_timer, tty_clipboard_query_callback, tty);
+--
+2.39.2
+
diff --git a/debian/patches/upstream-bf636d9575.diff b/debian/patches/upstream-bf636d9575.diff
new file mode 100644
index 0000000..551b36b
--- /dev/null
+++ b/debian/patches/upstream-bf636d9575.diff
@@ -0,0 +1,77 @@
+From 624b9567c70976766065c826b73234925b052595 Mon Sep 17 00:00:00 2001
+From: nicm <nicm>
+Date: Fri, 28 Apr 2023 05:59:35 +0000
+Subject: [PATCH 4/4] Do not fatal if tparm fails, instead just log it (not
+ working sequences are better than exiting).
+
+---
+ tty-term.c | 32 ++++++++++++++++++++++----------
+ 1 file changed, 22 insertions(+), 10 deletions(-)
+
+--- a/tty-term.c
++++ b/tty-term.c
+@@ -771,8 +771,10 @@
+ #else
+ s = tparm((char *)x, a, 0, 0, 0, 0, 0, 0, 0, 0);
+ #endif
+- if (s == NULL)
+- fatalx("could not expand %s", tty_term_codes[code].name);
++ if (s == NULL) {
++ log_debug("could not expand %s", tty_term_codes[code].name);
++ return ("");
++ }
+ return (s);
+ }
+
+@@ -788,8 +790,10 @@
+ #else
+ s = tparm((char *)x, a, b, 0, 0, 0, 0, 0, 0, 0);
+ #endif
+- if (s == NULL)
+- fatalx("could not expand %s", tty_term_codes[code].name);
++ if (s == NULL) {
++ log_debug("could not expand %s", tty_term_codes[code].name);
++ return ("");
++ }
+ return (s);
+ }
+
+@@ -806,8 +810,10 @@
+ #else
+ s = tparm((char *)x, a, b, c, 0, 0, 0, 0, 0, 0);
+ #endif
+- if (s == NULL)
+- fatalx("could not expand %s", tty_term_codes[code].name);
++ if (s == NULL) {
++ log_debug("could not expand %s", tty_term_codes[code].name);
++ return ("");
++ }
+ return (s);
+ }
+
+@@ -823,8 +829,10 @@
+ #else
+ s = tparm((char *)x, (long)a, 0, 0, 0, 0, 0, 0, 0, 0);
+ #endif
+- if (s == NULL)
+- fatalx("could not expand %s", tty_term_codes[code].name);
++ if (s == NULL) {
++ log_debug("could not expand %s", tty_term_codes[code].name);
++ return ("");
++ }
+ return (s);
+ }
+
+@@ -841,8 +849,10 @@
+ #else
+ s = tparm((char *)x, (long)a, (long)b, 0, 0, 0, 0, 0, 0, 0);
+ #endif
+- if (s == NULL)
+- fatalx("could not expand %s", tty_term_codes[code].name);
++ if (s == NULL) {
++ log_debug("could not expand %s", tty_term_codes[code].name);
++ return ("");
++ }
+ return (s);
+ }
+