From 84a7643638a73b4efb792481762d22e6935da1db Mon Sep 17 00:00:00 2001 From: purplerain Date: Mon, 26 Aug 2024 19:12:03 +0000 Subject: [PATCH] sync with OpenBSD -current --- bin/hostname/hostname.1 | 8 +- distrib/amd64/Makefile | 3 +- include/bitstring.h | 20 ++- lib/libutil/imsg-buffer.c | 5 +- regress/include/bitstring/Makefile | 29 ++-- regress/include/bitstring/bitstring_test.c | 49 +++++- regress/include/bitstring/good/27 | 14 ++ regress/include/bitstring/good/32 | 14 ++ regress/include/bitstring/good/49 | 14 ++ regress/include/bitstring/good/64 | 14 ++ regress/include/bitstring/good/67 | 14 ++ regress/include/bitstring/good/8 | 14 ++ sbin/dhcpleased/control.c | 54 ++++--- sbin/dhcpleased/dhcpleased.c | 153 ++++++++++++------ sbin/dhcpleased/dhcpleased.h | 12 +- sbin/dhcpleased/engine.c | 179 +++++++++++---------- sbin/dhcpleased/frontend.c | 144 +++++++++-------- sbin/slaacd/slaacd.h | 6 +- sys/arch/arm64/arm64/pmap.c | 23 +-- sys/kern/kern_sysctl.c | 6 +- sys/netinet/tcp_input.c | 19 +-- usr.bin/printf/printf.c | 26 +-- usr.bin/sndiod/sock.c | 6 +- usr.bin/tmux/client.c | 7 +- usr.bin/tmux/cmd-copy-mode.c | 8 +- usr.bin/tmux/colour.c | 16 +- usr.bin/tmux/format.c | 8 +- usr.bin/tmux/input-keys.c | 7 +- usr.bin/tmux/screen-redraw.c | 73 +++++---- usr.bin/tmux/server-client.c | 23 +-- usr.bin/tmux/server.c | 8 +- usr.bin/tmux/style.c | 32 ++-- usr.bin/tmux/tmux.1 | 12 +- usr.bin/tmux/tmux.h | 13 +- usr.bin/tmux/tty-keys.c | 7 +- usr.bin/tmux/tty-term.c | 14 +- usr.bin/tmux/window-copy.c | 24 ++- usr.bin/tmux/window.c | 14 +- 38 files changed, 674 insertions(+), 418 deletions(-) diff --git a/bin/hostname/hostname.1 b/bin/hostname/hostname.1 index 950b1e334..b0e0f974b 100644 --- a/bin/hostname/hostname.1 +++ b/bin/hostname/hostname.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: hostname.1,v 1.21 2011/01/24 19:58:32 jmc Exp $ +.\" $OpenBSD: hostname.1,v 1.22 2024/08/25 09:32:08 tb Exp $ .\" $NetBSD: hostname.1,v 1.11 1995/09/07 06:28:39 jtc Exp $ .\" .\" Copyright (c) 1983, 1988, 1990, 1993 @@ -30,7 +30,7 @@ .\" .\" @(#)hostname.1 8.2 (Berkeley) 4/28/95 .\" -.Dd $Mdocdate: January 24 2011 $ +.Dd $Mdocdate: August 25 2024 $ .Dt HOSTNAME 1 .Os .Sh NAME @@ -53,7 +53,7 @@ or by supplying a .Xr myname 5 file, which is used at system boot time by -.Xr netstart 8 +.Xr rc 8 to initialize the hostname. .Pp The options are as follows: @@ -67,7 +67,7 @@ name. .Xr gethostname 3 , .Xr myname 5 , .Xr hostname 7 , -.Xr netstart 8 +.Xr rc 8 .Sh HISTORY The .Nm diff --git a/distrib/amd64/Makefile b/distrib/amd64/Makefile index 52c19d91b..ba8c513e2 100644 --- a/distrib/amd64/Makefile +++ b/distrib/amd64/Makefile @@ -1,6 +1,6 @@ # $OpenBSD: Makefile,v 1.5 2019/04/30 20:38:30 deraadt Exp $ -SUBDIR= ramdisk_cd ramdiskA +SUBDIR= ramdisk_cd .if make(obj) || make(cleandir) || make(clean) SUBDIR+= iso @@ -8,6 +8,5 @@ SUBDIR+= iso unconfig: cd ramdisk_cd; ${MAKE} unconfig - cd ramdiskA; ${MAKE} unconfig .include diff --git a/include/bitstring.h b/include/bitstring.h index 135287468..406a97358 100644 --- a/include/bitstring.h +++ b/include/bitstring.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bitstring.h,v 1.6 2020/05/10 00:56:06 guenther Exp $ */ +/* $OpenBSD: bitstring.h,v 1.7 2024/08/26 11:52:54 bluhm Exp $ */ /* $NetBSD: bitstring.h,v 1.5 1997/05/14 15:49:55 pk Exp $ */ /* @@ -70,16 +70,22 @@ typedef unsigned char bitstr_t; ((name)[bitstr_size(nbits)]) /* is bit N of bitstring name set? */ -#define bit_test(name, bit) \ - ((name)[_bit_byte(bit)] & _bit_mask(bit)) +#define bit_test(name, bit) ({ \ + register int __tbit = (bit); \ + ((name)[_bit_byte(__tbit)] & _bit_mask(__tbit)); \ +}) /* set bit N of bitstring name */ -#define bit_set(name, bit) \ - ((name)[_bit_byte(bit)] |= _bit_mask(bit)) +#define bit_set(name, bit) do { \ + register int __sbit = (bit); \ + ((name)[_bit_byte(__sbit)] |= _bit_mask(__sbit)); \ +} while(0) /* clear bit N of bitstring name */ -#define bit_clear(name, bit) \ - ((name)[_bit_byte(bit)] &= ~_bit_mask(bit)) +#define bit_clear(name, bit) do { \ + register int __cbit = (bit); \ + ((name)[_bit_byte(__cbit)] &= ~_bit_mask(__cbit)); \ +} while(0) /* clear bits start ... stop in bitstring */ #define bit_nclear(name, start, stop) do { \ diff --git a/lib/libutil/imsg-buffer.c b/lib/libutil/imsg-buffer.c index 0708f486e..d45802d8d 100644 --- a/lib/libutil/imsg-buffer.c +++ b/lib/libutil/imsg-buffer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: imsg-buffer.c,v 1.18 2023/12/12 15:47:41 claudio Exp $ */ +/* $OpenBSD: imsg-buffer.c,v 1.19 2024/08/26 13:57:34 claudio Exp $ */ /* * Copyright (c) 2023 Claudio Jeker @@ -94,9 +94,10 @@ ibuf_realloc(struct ibuf *buf, size_t len) return (-1); } - b = recallocarray(buf->buf, buf->size, buf->wpos + len, 1); + b = realloc(buf->buf, buf->wpos + len); if (b == NULL) return (-1); + memset(b + buf->size, 0, buf->wpos + len - buf->size); buf->buf = b; buf->size = buf->wpos + len; diff --git a/regress/include/bitstring/Makefile b/regress/include/bitstring/Makefile index 90f8baf76..98fe9f435 100644 --- a/regress/include/bitstring/Makefile +++ b/regress/include/bitstring/Makefile @@ -1,27 +1,20 @@ -# $OpenBSD: Makefile,v 1.4 2002/09/02 20:01:43 avsm Exp $ +# $OpenBSD: Makefile,v 1.5 2024/08/26 12:15:40 bluhm Exp $ # $NetBSD: Makefile,v 1.4 1995/04/20 22:37:50 cgd Exp $ -PROG= ./bitstring_test +PROG= bitstring_test -REGRESS_TARGETS=test-8 test-27 test-32 test-49 test-64 test-67 +REGRESS_TARGETS= -test-8: ${PROG} - ${PROG} 8 | diff - ${.CURDIR}/good/8 +.for i in 8 27 32 49 64 67 -test-27: ${PROG} - ${PROG} 27 | diff - ${.CURDIR}/good/27 +REGRESS_TARGETS+= run-test-$i +run-test-$i: ${PROG} + ./${PROG} $i | diff - ${.CURDIR}/good/$i -test-32: ${PROG} - ${PROG} 32 | diff - ${.CURDIR}/good/32 - -test-49: ${PROG} - ${PROG} 49 | diff - ${.CURDIR}/good/49 - -test-64: ${PROG} - ${PROG} 64 | diff - ${.CURDIR}/good/64 - -test-67: ${PROG} - ${PROG} 67 | diff - ${.CURDIR}/good/67 +create-good: create-$i +create-$i: ${PROG} + ./${PROG} $i >${.CURDIR}/good/$i +.endfor .include diff --git a/regress/include/bitstring/bitstring_test.c b/regress/include/bitstring/bitstring_test.c index 836c021bf..d58ed0b27 100644 --- a/regress/include/bitstring/bitstring_test.c +++ b/regress/include/bitstring/bitstring_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bitstring_test.c,v 1.6 2024/08/23 17:19:16 florian Exp $ */ +/* $OpenBSD: bitstring_test.c,v 1.7 2024/08/26 12:15:40 bluhm Exp $ */ /* $NetBSD: bitstring_test.c,v 1.4 1995/04/29 05:44:35 cgd Exp $ */ /* @@ -6,7 +6,7 @@ * inspect the output, you should notice problems * choose the ATT or BSD flavor */ -/* #define ATT /*- */ +// #define ATT /*-*/ #define BSD /*-*/ /* @@ -39,7 +39,7 @@ clearbits(bitstr_t *b, int n) static void printbits(bitstr_t *b, int n) { - register int i; + register int i, k; int jc, js; bit_ffc(b, n, &jc); @@ -54,7 +54,7 @@ printbits(bitstr_t *b, int n) int main(int argc, char *argv[]) { - int i; + int i, j, k, *p; bitstr_t *bs; bitstr_t bit_decl(bss, DECL_TEST_LENGTH); @@ -64,7 +64,8 @@ main(int argc, char *argv[]) TEST_LENGTH = DECL_TEST_LENGTH; if (TEST_LENGTH < 4) { - fprintf(stderr, "TEST_LENGTH must be at least 4, but it is %d\n", + fprintf(stderr, + "TEST_LENGTH must be at least 4, but it is %d\n", TEST_LENGTH); exit(1); } @@ -92,7 +93,7 @@ main(int argc, char *argv[]) } (void) printf("be: 1 0 "); for (i = 0; i < TEST_LENGTH; i++) - (void) putchar(*("100" + (i % 3))); + (void) putchar("100"[i % 3]); (void) printf("\nis: "); printbits(bs, TEST_LENGTH); @@ -102,7 +103,7 @@ main(int argc, char *argv[]) } (void) printf("be: 0 3 "); for (i = 0; i < TEST_LENGTH; i++) - (void) putchar(*("000100" + (i % 6))); + (void) putchar("000100"[i % 6]); (void) printf("\nis: "); printbits(bs, TEST_LENGTH); @@ -220,6 +221,38 @@ main(int argc, char *argv[]) printbits(bs, TEST_LENGTH); } + (void) printf("\n"); + (void) printf("macros should evaluate arguments only once\n"); + i = j = 0; + _bit_byte(i++); + (void) printf("_bit_byte(%d) -> %d\n", j++, i); + _bit_mask(i++); + (void) printf("_bit_mask(%d) -> %d\n", j++, i); + bitstr_size(i++); + (void) printf("bitstr_size(%d) -> %d\n", j++, i); + free(bit_alloc(i++)); + (void) printf("bit_alloc(%d) -> %d\n", j++, i); + { bitstr_t bit_decl(bd, i++); } + (void) printf("bit_alloc(%d) -> %d\n", j++, i); + bit_test(bs, i++); + (void) printf("bit_test(%d) -> %d\n", j++, i); + bit_set(bs, i++); + (void) printf("bit_set(%d) -> %d\n", j++, i); + bit_clear(bs, i++); + (void) printf("bit_clear(%d) -> %d\n", j++, i); + i %= TEST_LENGTH; j %= TEST_LENGTH; + bit_nclear(bs, i++, i++); + (void) printf("bit_nclear(%d, %d) -> %d\n", j, j + 1, i); + j += 2; + bit_nset(bs, i++, i++); + (void) printf("bit_nset(%d, %d) -> %d\n", j, j + 1, i); + j += 2; + p = &k; + bit_ffc(bs, i++, p++); + (void) printf("bit_ffc(%d, %ld) -> %d\n", j++, --p - &k, i); + bit_ffs(bs, i++, p++); + (void) printf("bit_ffs(%d, %ld) -> %d\n", j++, --p - &k, i); + (void) free(bs); - (void) exit(0); + return (0); } diff --git a/regress/include/bitstring/good/27 b/regress/include/bitstring/good/27 index f1479dde8..f1acb16b0 100644 --- a/regress/include/bitstring/good/27 +++ b/regress/include/bitstring/good/27 @@ -290,3 +290,17 @@ CHI square test 24 0 2 001000000000000000000000100 25 0 1 010000000000000000000000010 26 1 0 100000000000000000000000001 + +macros should evaluate arguments only once +_bit_byte(0) -> 1 +_bit_mask(1) -> 2 +bitstr_size(2) -> 3 +bit_alloc(3) -> 4 +bit_alloc(4) -> 5 +bit_test(5) -> 6 +bit_set(6) -> 7 +bit_clear(7) -> 8 +bit_nclear(8, 9) -> 10 +bit_nset(10, 11) -> 12 +bit_ffc(12, 0) -> 13 +bit_ffs(13, 0) -> 14 diff --git a/regress/include/bitstring/good/32 b/regress/include/bitstring/good/32 index 7474b9662..011e6aaa1 100644 --- a/regress/include/bitstring/good/32 +++ b/regress/include/bitstring/good/32 @@ -335,3 +335,17 @@ CHI square test 29 0 2 00100000000000000000000000000100 30 0 1 01000000000000000000000000000010 31 1 0 10000000000000000000000000000001 + +macros should evaluate arguments only once +_bit_byte(0) -> 1 +_bit_mask(1) -> 2 +bitstr_size(2) -> 3 +bit_alloc(3) -> 4 +bit_alloc(4) -> 5 +bit_test(5) -> 6 +bit_set(6) -> 7 +bit_clear(7) -> 8 +bit_nclear(8, 9) -> 10 +bit_nset(10, 11) -> 12 +bit_ffc(12, 0) -> 13 +bit_ffs(13, 0) -> 14 diff --git a/regress/include/bitstring/good/49 b/regress/include/bitstring/good/49 index 42e55b337..08b46ffcd 100644 --- a/regress/include/bitstring/good/49 +++ b/regress/include/bitstring/good/49 @@ -488,3 +488,17 @@ CHI square test 46 0 2 0010000000000000000000000000000000000000000000100 47 0 1 0100000000000000000000000000000000000000000000010 48 1 0 1000000000000000000000000000000000000000000000001 + +macros should evaluate arguments only once +_bit_byte(0) -> 1 +_bit_mask(1) -> 2 +bitstr_size(2) -> 3 +bit_alloc(3) -> 4 +bit_alloc(4) -> 5 +bit_test(5) -> 6 +bit_set(6) -> 7 +bit_clear(7) -> 8 +bit_nclear(8, 9) -> 10 +bit_nset(10, 11) -> 12 +bit_ffc(12, 0) -> 13 +bit_ffs(13, 0) -> 14 diff --git a/regress/include/bitstring/good/64 b/regress/include/bitstring/good/64 index deb94b6c7..a2a85cb47 100644 --- a/regress/include/bitstring/good/64 +++ b/regress/include/bitstring/good/64 @@ -623,3 +623,17 @@ CHI square test 61 0 2 0010000000000000000000000000000000000000000000000000000000000100 62 0 1 0100000000000000000000000000000000000000000000000000000000000010 63 1 0 1000000000000000000000000000000000000000000000000000000000000001 + +macros should evaluate arguments only once +_bit_byte(0) -> 1 +_bit_mask(1) -> 2 +bitstr_size(2) -> 3 +bit_alloc(3) -> 4 +bit_alloc(4) -> 5 +bit_test(5) -> 6 +bit_set(6) -> 7 +bit_clear(7) -> 8 +bit_nclear(8, 9) -> 10 +bit_nset(10, 11) -> 12 +bit_ffc(12, 0) -> 13 +bit_ffs(13, 0) -> 14 diff --git a/regress/include/bitstring/good/67 b/regress/include/bitstring/good/67 index 83cd3fdf0..3280b31aa 100644 --- a/regress/include/bitstring/good/67 +++ b/regress/include/bitstring/good/67 @@ -650,3 +650,17 @@ CHI square test 64 0 2 0010000000000000000000000000000000000000000000000000000000000000100 65 0 1 0100000000000000000000000000000000000000000000000000000000000000010 66 1 0 1000000000000000000000000000000000000000000000000000000000000000001 + +macros should evaluate arguments only once +_bit_byte(0) -> 1 +_bit_mask(1) -> 2 +bitstr_size(2) -> 3 +bit_alloc(3) -> 4 +bit_alloc(4) -> 5 +bit_test(5) -> 6 +bit_set(6) -> 7 +bit_clear(7) -> 8 +bit_nclear(8, 9) -> 10 +bit_nset(10, 11) -> 12 +bit_ffc(12, 0) -> 13 +bit_ffs(13, 0) -> 14 diff --git a/regress/include/bitstring/good/8 b/regress/include/bitstring/good/8 index 1def32253..bdf55cff0 100644 --- a/regress/include/bitstring/good/8 +++ b/regress/include/bitstring/good/8 @@ -119,3 +119,17 @@ CHI square test 5 0 2 00100100 6 0 1 01000010 7 1 0 10000001 + +macros should evaluate arguments only once +_bit_byte(0) -> 1 +_bit_mask(1) -> 2 +bitstr_size(2) -> 3 +bit_alloc(3) -> 4 +bit_alloc(4) -> 5 +bit_test(5) -> 6 +bit_set(6) -> 7 +bit_clear(7) -> 8 +bit_nclear(0, 1) -> 2 +bit_nset(2, 3) -> 4 +bit_ffc(4, 0) -> 5 +bit_ffs(5, 0) -> 6 diff --git a/sbin/dhcpleased/control.c b/sbin/dhcpleased/control.c index d29e3fb16..b6043f580 100644 --- a/sbin/dhcpleased/control.c +++ b/sbin/dhcpleased/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.4 2021/08/01 09:07:03 florian Exp $ */ +/* $OpenBSD: control.c,v 1.5 2024/08/25 09:53:53 florian Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -224,6 +224,8 @@ control_dispatch_imsg(int fd, short event, void *bula) struct imsg imsg; ssize_t n; int verbose; + uint32_t if_index, type; + pid_t pid; if ((c = control_connbyfd(fd)) == NULL) { log_warnx("%s: fd %d: not found", __func__, fd); @@ -252,40 +254,47 @@ control_dispatch_imsg(int fd, short event, void *bula) if (n == 0) break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + pid = imsg_get_pid(&imsg); + + switch (type) { case IMSG_CTL_RELOAD: - frontend_imsg_compose_main(imsg.hdr.type, 0, NULL, 0); + frontend_imsg_compose_main(type, 0, NULL, 0); break; case IMSG_CTL_LOG_VERBOSE: - if (IMSG_DATA_SIZE(imsg) != sizeof(verbose)) + if (imsg_get_data(&imsg, &verbose, + sizeof(verbose)) == -1) break; - c->iev.ibuf.pid = imsg.hdr.pid; - /* Forward to all other processes. */ - frontend_imsg_compose_main(imsg.hdr.type, imsg.hdr.pid, - imsg.data, IMSG_DATA_SIZE(imsg)); - frontend_imsg_compose_engine(imsg.hdr.type, 0, - imsg.hdr.pid, imsg.data, IMSG_DATA_SIZE(imsg)); - memcpy(&verbose, imsg.data, sizeof(verbose)); + c->iev.ibuf.pid = pid; + /* Forward to all other processes. */ + frontend_imsg_compose_main(type, pid, &verbose, + sizeof(verbose)); + frontend_imsg_compose_engine(type, 0, pid, &verbose, + sizeof(verbose)); + log_setverbose(verbose); break; case IMSG_CTL_SHOW_INTERFACE_INFO: - if (IMSG_DATA_SIZE(imsg) != sizeof(uint32_t)) + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) break; - c->iev.ibuf.pid = imsg.hdr.pid; - frontend_imsg_compose_engine(imsg.hdr.type, 0, - imsg.hdr.pid, imsg.data, IMSG_DATA_SIZE(imsg)); + + c->iev.ibuf.pid = pid; + frontend_imsg_compose_engine(type, 0, pid, &if_index, + sizeof(if_index)); break; case IMSG_CTL_SEND_REQUEST: - if (IMSG_DATA_SIZE(imsg) != sizeof(uint32_t)) + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) break; - c->iev.ibuf.pid = imsg.hdr.pid; + + c->iev.ibuf.pid = pid; frontend_imsg_compose_engine(IMSG_REQUEST_REBOOT, 0, - imsg.hdr.pid, imsg.data, IMSG_DATA_SIZE(imsg)); + pid, &if_index, sizeof(&if_index)); break; default: - log_debug("%s: error handling imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: error handling imsg %d", __func__, type); break; } imsg_free(&imsg); @@ -299,9 +308,8 @@ control_imsg_relay(struct imsg *imsg) { struct ctl_conn *c; - if ((c = control_connbypid(imsg->hdr.pid)) == NULL) + if ((c = control_connbypid(imsg_get_pid(imsg))) == NULL) return (0); - return (imsg_compose_event(&c->iev, imsg->hdr.type, 0, imsg->hdr.pid, - -1, imsg->data, IMSG_DATA_SIZE(*imsg))); + return (imsg_forward_event(&c->iev, imsg)); } diff --git a/sbin/dhcpleased/dhcpleased.c b/sbin/dhcpleased/dhcpleased.c index b5f650468..0a6a7e594 100644 --- a/sbin/dhcpleased/dhcpleased.c +++ b/sbin/dhcpleased/dhcpleased.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcpleased.c,v 1.30 2023/10/10 16:09:53 florian Exp $ */ +/* $OpenBSD: dhcpleased.c,v 1.31 2024/08/25 09:53:53 florian Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -436,7 +436,7 @@ main_dispatch_frontend(int fd, short event, void *bula) struct imsg_ifinfo imsg_ifinfo; ssize_t n; int shut = 0; - uint32_t if_index; + uint32_t if_index, type; #ifndef SMALL int verbose; #endif /* SMALL */ @@ -462,12 +462,14 @@ main_dispatch_frontend(int fd, short event, void *bula) if (n == 0) /* No more messages. */ break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + + switch (type) { case IMSG_OPEN_BPFSOCK: - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_OPEN_BPFSOCK wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + open_bpfsock(if_index); break; #ifndef SMALL @@ -478,25 +480,24 @@ main_dispatch_frontend(int fd, short event, void *bula) log_warnx("configuration reloaded"); break; case IMSG_CTL_LOG_VERBOSE: - if (IMSG_DATA_SIZE(imsg) != sizeof(verbose)) - fatalx("%s: IMSG_CTL_LOG_VERBOSE wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&verbose, imsg.data, sizeof(verbose)); + if (imsg_get_data(&imsg, &verbose, + sizeof(verbose)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + log_setverbose(verbose); break; #endif /* SMALL */ case IMSG_UPDATE_IF: - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_ifinfo)) - fatalx("%s: IMSG_UPDATE_IF wrong length: %lu", - __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_ifinfo, imsg.data, sizeof(imsg_ifinfo)); + if (imsg_get_data(&imsg, &imsg_ifinfo, + sizeof(imsg_ifinfo)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + read_lease_file(&imsg_ifinfo); main_imsg_compose_engine(IMSG_UPDATE_IF, -1, &imsg_ifinfo, sizeof(imsg_ifinfo)); break; default: - log_debug("%s: error handling imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: error handling imsg %d", __func__, type); break; } imsg_free(&imsg); @@ -517,6 +518,7 @@ main_dispatch_engine(int fd, short event, void *bula) struct imsgbuf *ibuf; struct imsg imsg; ssize_t n; + uint32_t type; int shut = 0; ibuf = &iev->ibuf; @@ -540,15 +542,16 @@ main_dispatch_engine(int fd, short event, void *bula) if (n == 0) /* No more messages. */ break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + + switch (type) { case IMSG_CONFIGURE_INTERFACE: { struct imsg_configure_interface imsg_interface; - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_interface)) - fatalx("%s: IMSG_CONFIGURE_INTERFACE wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_interface, imsg.data, - sizeof(imsg_interface)); + + if (imsg_get_data(&imsg, &imsg_interface, + sizeof(imsg_interface)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + if (imsg_interface.routes_len >= MAX_DHCP_ROUTES) fatalx("%s: too many routes in imsg", __func__); configure_interface(&imsg_interface); @@ -556,14 +559,13 @@ main_dispatch_engine(int fd, short event, void *bula) } case IMSG_DECONFIGURE_INTERFACE: { struct imsg_configure_interface imsg_interface; - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_interface)) - fatalx("%s: IMSG_CONFIGURE_INTERFACE wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_interface, imsg.data, - sizeof(imsg_interface)); + + if (imsg_get_data(&imsg, &imsg_interface, + sizeof(imsg_interface)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); if (imsg_interface.routes_len >= MAX_DHCP_ROUTES) fatalx("%s: too many routes in imsg", __func__); + deconfigure_interface(&imsg_interface); main_imsg_compose_frontend(IMSG_CLOSE_UDPSOCK, -1, &imsg_interface.if_index, @@ -572,48 +574,44 @@ main_dispatch_engine(int fd, short event, void *bula) } case IMSG_WITHDRAW_ROUTES: { struct imsg_configure_interface imsg_interface; - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_interface)) - fatalx("%s: IMSG_CONFIGURE_INTERFACE wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_interface, imsg.data, - sizeof(imsg_interface)); + + if (imsg_get_data(&imsg, &imsg_interface, + sizeof(imsg_interface)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); if (imsg_interface.routes_len >= MAX_DHCP_ROUTES) fatalx("%s: too many routes in imsg", __func__); + if (imsg_interface.routes_len > 0) configure_routes(RTM_DELETE, &imsg_interface); break; } case IMSG_PROPOSE_RDNS: { struct imsg_propose_rdns rdns; - if (IMSG_DATA_SIZE(imsg) != sizeof(rdns)) - fatalx("%s: IMSG_PROPOSE_RDNS wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&rdns, imsg.data, sizeof(rdns)); + + if (imsg_get_data(&imsg, &rdns, sizeof(rdns)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); if ((2 + rdns.rdns_count * sizeof(struct in_addr)) > sizeof(struct sockaddr_rtdns)) fatalx("%s: rdns_count too big: %d", __func__, rdns.rdns_count); + propose_rdns(&rdns); break; } case IMSG_WITHDRAW_RDNS: { struct imsg_propose_rdns rdns; - if (IMSG_DATA_SIZE(imsg) != sizeof(rdns)) - fatalx("%s: IMSG_WITHDRAW_RDNS wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&rdns, imsg.data, sizeof(rdns)); + + if (imsg_get_data(&imsg, &rdns, sizeof(rdns)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); if (rdns.rdns_count != 0) fatalx("%s: expected rdns_count == 0: %d", __func__, rdns.rdns_count); + propose_rdns(&rdns); break; } default: - log_debug("%s: error handling imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: error handling imsg %d", __func__, type); break; } imsg_free(&imsg); @@ -672,6 +670,17 @@ imsg_compose_event(struct imsgev *iev, uint16_t type, uint32_t peerid, return (ret); } +int +imsg_forward_event(struct imsgev *iev, struct imsg *imsg) +{ + int ret; + + if ((ret = imsg_forward(&iev->ibuf, imsg)) != -1) + imsg_event_add(iev); + + return (ret); +} + static int main_imsg_send_ipc_sockets(struct imsgbuf *frontend_buf, struct imsgbuf *engine_buf) @@ -1293,4 +1302,52 @@ config_clear(struct dhcpleased_conf *conf) free(conf); } + +#define I2S(x) case x: return #x + +const char* +i2s(uint32_t type) +{ + static char unknown[sizeof("IMSG_4294967295")]; + + switch (type) { + I2S(IMSG_NONE); + I2S(IMSG_CTL_LOG_VERBOSE); + I2S(IMSG_CTL_SHOW_INTERFACE_INFO); + I2S(IMSG_CTL_SEND_REQUEST); + I2S(IMSG_CTL_RELOAD); + I2S(IMSG_CTL_END); + I2S(IMSG_RECONF_CONF); + I2S(IMSG_RECONF_IFACE); + I2S(IMSG_RECONF_VC_ID); + I2S(IMSG_RECONF_C_ID); + I2S(IMSG_RECONF_H_NAME); + I2S(IMSG_RECONF_END); + I2S(IMSG_SEND_DISCOVER); + I2S(IMSG_SEND_REQUEST); + I2S(IMSG_SOCKET_IPC); + I2S(IMSG_OPEN_BPFSOCK); + I2S(IMSG_BPFSOCK); + I2S(IMSG_UDPSOCK); + I2S(IMSG_CLOSE_UDPSOCK); + I2S(IMSG_ROUTESOCK); + I2S(IMSG_CONTROLFD); + I2S(IMSG_STARTUP); + I2S(IMSG_UPDATE_IF); + I2S(IMSG_REMOVE_IF); + I2S(IMSG_DHCP); + I2S(IMSG_CONFIGURE_INTERFACE); + I2S(IMSG_DECONFIGURE_INTERFACE); + I2S(IMSG_PROPOSE_RDNS); + I2S(IMSG_WITHDRAW_RDNS); + I2S(IMSG_WITHDRAW_ROUTES); + I2S(IMSG_REPROPOSE_RDNS); + I2S(IMSG_REQUEST_REBOOT); + default: + snprintf(unknown, sizeof(unknown), "IMSG_%u", type); + return unknown; + } +} +#undef I2S + #endif /* SMALL */ diff --git a/sbin/dhcpleased/dhcpleased.h b/sbin/dhcpleased/dhcpleased.h index 41749fc50..d3d79b61c 100644 --- a/sbin/dhcpleased/dhcpleased.h +++ b/sbin/dhcpleased/dhcpleased.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcpleased.h,v 1.16 2024/01/26 21:14:08 jan Exp $ */ +/* $OpenBSD: dhcpleased.h,v 1.17 2024/08/25 09:53:53 florian Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -158,7 +158,6 @@ #define MAX_SERVERS 16 /* max servers that can be ignored per if */ -#define IMSG_DATA_SIZE(imsg) ((imsg).hdr.len - IMSG_HEADER_SIZE) #define DHCP_SNAME_LEN 64 #define DHCP_FILE_LEN 128 @@ -252,9 +251,9 @@ struct iface_conf { SIMPLEQ_ENTRY(iface_conf) entry; char name[IF_NAMESIZE]; uint8_t *vc_id; - int vc_id_len; + size_t vc_id_len; uint8_t *c_id; - int c_id_len; + size_t c_id_len; char *h_name; int ignore; struct in_addr ignore_servers[MAX_SERVERS]; @@ -304,12 +303,14 @@ struct imsg_req_dhcp { void imsg_event_add(struct imsgev *); int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, int, void *, uint16_t); +int imsg_forward_event(struct imsgev *, struct imsg *); #ifndef SMALL void config_clear(struct dhcpleased_conf *); struct dhcpleased_conf *config_new_empty(void); void merge_config(struct dhcpleased_conf *, struct dhcpleased_conf *); const char *sin_to_str(struct sockaddr_in *); +const char *i2s(uint32_t); /* frontend.c */ struct iface_conf *find_iface_conf(struct iface_conf_head *, char *); @@ -323,6 +324,7 @@ void print_config(struct dhcpleased_conf *); struct dhcpleased_conf *parse_config(const char *); int cmdline_symset(char *); #else -#define sin_to_str(x...) "" +#define sin_to_str(x) "" +#define i2s(x) "" #endif /* SMALL */ diff --git a/sbin/dhcpleased/engine.c b/sbin/dhcpleased/engine.c index 289dffdf2..f7c433895 100644 --- a/sbin/dhcpleased/engine.c +++ b/sbin/dhcpleased/engine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: engine.c,v 1.45 2024/06/03 17:58:33 deraadt Exp $ */ +/* $OpenBSD: engine.c,v 1.49 2024/08/26 06:06:04 florian Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -127,7 +127,7 @@ void engine_dispatch_frontend(int, short, void *); void engine_dispatch_main(int, short, void *); #ifndef SMALL void send_interface_info(struct dhcpleased_iface *, pid_t); -void engine_showinfo_ctl(struct imsg *, uint32_t); +void engine_showinfo_ctl(pid_t, uint32_t); #endif /* SMALL */ void engine_update_iface(struct imsg_ifinfo *); struct dhcpleased_iface *get_dhcpleased_iface_by_id(uint32_t); @@ -286,7 +286,7 @@ engine_dispatch_frontend(int fd, short event, void *bula) #ifndef SMALL int verbose; #endif /* SMALL */ - uint32_t if_index; + uint32_t if_index, type; if (event & EV_READ) { if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) @@ -307,29 +307,29 @@ engine_dispatch_frontend(int fd, short event, void *bula) if (n == 0) /* No more messages. */ break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + + switch (type) { #ifndef SMALL case IMSG_CTL_LOG_VERBOSE: - if (IMSG_DATA_SIZE(imsg) != sizeof(verbose)) - fatalx("%s: IMSG_CTL_LOG_VERBOSE wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&verbose, imsg.data, sizeof(verbose)); + if (imsg_get_data(&imsg, &verbose, + sizeof(verbose)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + log_setverbose(verbose); break; case IMSG_CTL_SHOW_INTERFACE_INFO: - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_CTL_SHOW_INTERFACE_INFO wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); - engine_showinfo_ctl(&imsg, if_index); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + + engine_showinfo_ctl(imsg_get_pid(&imsg), if_index); break; case IMSG_REQUEST_REBOOT: - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_CTL_SEND_DISCOVER wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + iface = get_dhcpleased_iface_by_id(if_index); if (iface != NULL) { switch (iface->state) { @@ -351,18 +351,19 @@ engine_dispatch_frontend(int fd, short event, void *bula) break; #endif /* SMALL */ case IMSG_REMOVE_IF: - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_REMOVE_IF wrong length: %lu", - __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + remove_dhcpleased_iface(if_index); break; case IMSG_DHCP: { struct imsg_dhcp imsg_dhcp; - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_dhcp)) - fatalx("%s: IMSG_DHCP wrong length: %lu", - __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_dhcp, imsg.data, sizeof(imsg_dhcp)); + + if (imsg_get_data(&imsg, &imsg_dhcp, + sizeof(imsg_dhcp)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + iface = get_dhcpleased_iface_by_id(imsg_dhcp.if_index); if (iface != NULL) parse_dhcp(iface, &imsg_dhcp); @@ -373,8 +374,7 @@ engine_dispatch_frontend(int fd, short event, void *bula) send_rdns_proposal(iface); break; default: - log_debug("%s: unexpected imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: unexpected imsg %d", __func__, type); break; } imsg_free(&imsg); @@ -400,6 +400,7 @@ engine_dispatch_main(int fd, short event, void *bula) struct imsgbuf *ibuf = &iev->ibuf; struct imsg_ifinfo imsg_ifinfo; ssize_t n; + uint32_t type; int shut = 0; if (event & EV_READ) { @@ -421,7 +422,9 @@ engine_dispatch_main(int fd, short event, void *bula) if (n == 0) /* No more messages. */ break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + + switch (type) { case IMSG_SOCKET_IPC: /* * Setup pipe and event handler to the frontend @@ -453,12 +456,12 @@ engine_dispatch_main(int fd, short event, void *bula) break; case IMSG_UPDATE_IF: - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_ifinfo)) - fatalx("%s: IMSG_UPDATE_IF wrong length: %lu", - __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_ifinfo, imsg.data, sizeof(imsg_ifinfo)); + if (imsg_get_data(&imsg, &imsg_ifinfo, + sizeof(imsg_ifinfo)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); if (imsg_ifinfo.lease[LEASE_SIZE - 1] != '\0') fatalx("Invalid lease"); + engine_update_iface(&imsg_ifinfo); break; #ifndef SMALL @@ -472,15 +475,14 @@ engine_dispatch_main(int fd, short event, void *bula) SIMPLEQ_INIT(&nconf->iface_list); break; case IMSG_RECONF_IFACE: - if (IMSG_DATA_SIZE(imsg) != sizeof(struct - iface_conf)) - fatalx("%s: IMSG_RECONF_IFACE wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); if ((iface_conf = malloc(sizeof(struct iface_conf))) == NULL) fatal(NULL); - memcpy(iface_conf, imsg.data, sizeof(struct - iface_conf)); + + if (imsg_get_data(&imsg, iface_conf, + sizeof(struct iface_conf)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + iface_conf->vc_id = NULL; iface_conf->vc_id_len = 0; iface_conf->c_id = NULL; @@ -491,44 +493,57 @@ engine_dispatch_main(int fd, short event, void *bula) break; case IMSG_RECONF_VC_ID: if (iface_conf == NULL) - fatal("IMSG_RECONF_VC_ID without " - "IMSG_RECONF_IFACE"); - if (IMSG_DATA_SIZE(imsg) > 255 + 2) - fatalx("%s: IMSG_RECONF_VC_ID wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - if ((iface_conf->vc_id = malloc(IMSG_DATA_SIZE(imsg))) + fatalx("%s: %s without IMSG_RECONF_IFACE", + __func__, i2s(type)); + if (iface_conf->vc_id != NULL) + fatalx("%s: multiple %s for the same interface", + __func__, i2s(type)); + if ((iface_conf->vc_id_len = imsg_get_len(&imsg)) + > 255 + 2 || iface_conf->vc_id_len == 0) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface_conf->vc_id = malloc(iface_conf->vc_id_len)) == NULL) fatal(NULL); - memcpy(iface_conf->vc_id, imsg.data, - IMSG_DATA_SIZE(imsg)); - iface_conf->vc_id_len = IMSG_DATA_SIZE(imsg); + if (imsg_get_data(&imsg, iface_conf->vc_id, + iface_conf->vc_id_len) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); break; case IMSG_RECONF_C_ID: if (iface_conf == NULL) - fatal("IMSG_RECONF_C_ID without " - "IMSG_RECONF_IFACE"); - if (IMSG_DATA_SIZE(imsg) > 255 + 2) - fatalx("%s: IMSG_RECONF_C_ID wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - if ((iface_conf->c_id = malloc(IMSG_DATA_SIZE(imsg))) + fatalx("%s: %s without IMSG_RECONF_IFACE", + __func__, i2s(type)); + if (iface_conf->c_id != NULL) + fatalx("%s: multiple %s for the same interface", + __func__, i2s(type)); + if ((iface_conf->c_id_len = imsg_get_len(&imsg)) + > 255 + 2 || iface_conf->c_id_len == 0) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface_conf->c_id = malloc(iface_conf->c_id_len)) == NULL) fatal(NULL); - memcpy(iface_conf->c_id, imsg.data, - IMSG_DATA_SIZE(imsg)); - iface_conf->c_id_len = IMSG_DATA_SIZE(imsg); + if (imsg_get_data(&imsg, iface_conf->c_id, + iface_conf->c_id_len) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); break; - case IMSG_RECONF_H_NAME: + case IMSG_RECONF_H_NAME: { + size_t len; + if (iface_conf == NULL) - fatal("IMSG_RECONF_H_NAME without " - "IMSG_RECONF_IFACE"); - if (((char *)imsg.data)[IMSG_DATA_SIZE(imsg) - 1] != - '\0') - fatalx("Invalid hostname"); - if (IMSG_DATA_SIZE(imsg) > 256) - fatalx("Invalid hostname"); - if ((iface_conf->h_name = strdup(imsg.data)) == NULL) + fatalx("%s: %s without IMSG_RECONF_IFACE", + __func__, i2s(type)); + if (iface_conf->h_name != NULL) + fatalx("%s: multiple %s for the same interface", + __func__, i2s(type)); + if ((len = imsg_get_len(&imsg)) > 256 || len == 0) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface_conf->h_name = malloc(len)) == NULL) fatal(NULL); + if (imsg_get_data(&imsg, iface_conf->h_name, len) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + if (iface_conf->h_name[len - 1] != '\0') + fatalx("Invalid hostname"); break; + } case IMSG_RECONF_END: { struct dhcpleased_iface *iface; int *ifaces; @@ -537,8 +552,9 @@ engine_dispatch_main(int fd, short event, void *bula) char ifnamebuf[IF_NAMESIZE]; if (nconf == NULL) - fatalx("%s: IMSG_RECONF_END without " - "IMSG_RECONF_CONF", __func__); + fatalx("%s: %s without IMSG_RECONF_CONF", + __func__, i2s(type)); + ifaces = changed_ifaces(engine_conf, nconf); merge_config(engine_conf, nconf); nconf = NULL; @@ -562,8 +578,7 @@ engine_dispatch_main(int fd, short event, void *bula) } #endif /* SMALL */ default: - log_debug("%s: unexpected imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: unexpected imsg %d", __func__, type); break; } imsg_free(&imsg); @@ -605,22 +620,14 @@ send_interface_info(struct dhcpleased_iface *iface, pid_t pid) } void -engine_showinfo_ctl(struct imsg *imsg, uint32_t if_index) +engine_showinfo_ctl(pid_t pid, uint32_t if_index) { struct dhcpleased_iface *iface; - switch (imsg->hdr.type) { - case IMSG_CTL_SHOW_INTERFACE_INFO: - if ((iface = get_dhcpleased_iface_by_id(if_index)) != NULL) - send_interface_info(iface, imsg->hdr.pid); - else - engine_imsg_compose_frontend(IMSG_CTL_END, - imsg->hdr.pid, NULL, 0); - break; - default: - log_debug("%s: error handling imsg", __func__); - break; - } + if ((iface = get_dhcpleased_iface_by_id(if_index)) != NULL) + send_interface_info(iface, pid); + else + engine_imsg_compose_frontend(IMSG_CTL_END, pid, NULL, 0); } #endif /* SMALL */ @@ -1427,7 +1434,7 @@ state_transition(struct dhcpleased_iface *iface, enum if_state new_state) iface->xid = arc4random(); break; case IF_BOUND: - fatal("invalid transition Bound -> Init"); + fatalx("invalid transition Bound -> Init"); break; } request_dhcp_discover(iface); @@ -1491,7 +1498,7 @@ state_transition(struct dhcpleased_iface *iface, enum if_state new_state) iface->timo.tv_sec = iface->ipv6_only_time; break; case IF_BOUND: - fatal("invalid transition Bound -> IPv6 only"); + fatalx("invalid transition Bound -> IPv6 only"); break; } } diff --git a/sbin/dhcpleased/frontend.c b/sbin/dhcpleased/frontend.c index fdc4ae8ca..399345c99 100644 --- a/sbin/dhcpleased/frontend.c +++ b/sbin/dhcpleased/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.35 2024/06/27 14:53:06 florian Exp $ */ +/* $OpenBSD: frontend.c,v 1.38 2024/08/26 06:06:04 florian Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -238,6 +238,7 @@ frontend_dispatch_main(int fd, short event, void *bula) struct imsgbuf *ibuf = &iev->ibuf; struct iface *iface; ssize_t n; + uint32_t type; int shut = 0, bpfsock, if_index, udpsock; if (event & EV_READ) { @@ -259,7 +260,9 @@ frontend_dispatch_main(int fd, short event, void *bula) if (n == 0) /* No more messages. */ break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + + switch (type) { case IMSG_SOCKET_IPC: /* * Setup pipe and event handler to the engine @@ -291,10 +294,10 @@ frontend_dispatch_main(int fd, short event, void *bula) fatalx("%s: expected to receive imsg " "bpf fd but didn't receive any", __func__); - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_BPFSOCK wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + set_bpfsock(bpfsock, if_index); break; case IMSG_UDPSOCK: @@ -302,10 +305,10 @@ frontend_dispatch_main(int fd, short event, void *bula) fatalx("%s: expected to receive imsg " "udpsocket fd but didn't receive any", __func__); - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_UDPSOCK wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface = get_iface_by_id(if_index)) == NULL) { close(fd); break; @@ -316,10 +319,10 @@ frontend_dispatch_main(int fd, short event, void *bula) iface->udpsock = udpsock; break; case IMSG_CLOSE_UDPSOCK: - if (IMSG_DATA_SIZE(imsg) != sizeof(if_index)) - fatalx("%s: IMSG_UDPSOCK wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - memcpy(&if_index, imsg.data, sizeof(if_index)); + if (imsg_get_data(&imsg, &if_index, + sizeof(if_index)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface = get_iface_by_id(if_index)) != NULL && iface->udpsock != -1) { close(iface->udpsock); @@ -348,15 +351,14 @@ frontend_dispatch_main(int fd, short event, void *bula) SIMPLEQ_INIT(&nconf->iface_list); break; case IMSG_RECONF_IFACE: - if (IMSG_DATA_SIZE(imsg) != sizeof(struct - iface_conf)) - fatalx("%s: IMSG_RECONF_IFACE wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); if ((iface_conf = malloc(sizeof(struct iface_conf))) == NULL) fatal(NULL); - memcpy(iface_conf, imsg.data, sizeof(struct - iface_conf)); + + if (imsg_get_data(&imsg, iface_conf, + sizeof(struct iface_conf)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + iface_conf->vc_id = NULL; iface_conf->vc_id_len = 0; iface_conf->c_id = NULL; @@ -367,52 +369,65 @@ frontend_dispatch_main(int fd, short event, void *bula) break; case IMSG_RECONF_VC_ID: if (iface_conf == NULL) - fatal("IMSG_RECONF_VC_ID without " - "IMSG_RECONF_IFACE"); - if (IMSG_DATA_SIZE(imsg) > 255 + 2) - fatalx("%s: IMSG_RECONF_VC_ID wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - if ((iface_conf->vc_id = malloc(IMSG_DATA_SIZE(imsg))) + fatalx("%s: %s without IMSG_RECONF_IFACE", + __func__, i2s(type)); + if (iface_conf->vc_id != NULL) + fatalx("%s: multiple %s for the same interface", + __func__, i2s(type)); + if ((iface_conf->vc_id_len = imsg_get_len(&imsg)) + > 255 + 2 || iface_conf->vc_id_len == 0) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface_conf->vc_id = malloc(iface_conf->vc_id_len)) == NULL) fatal(NULL); - memcpy(iface_conf->vc_id, imsg.data, - IMSG_DATA_SIZE(imsg)); - iface_conf->vc_id_len = IMSG_DATA_SIZE(imsg); + if (imsg_get_data(&imsg, iface_conf->vc_id, + iface_conf->vc_id_len) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); break; case IMSG_RECONF_C_ID: if (iface_conf == NULL) - fatal("IMSG_RECONF_C_ID without " - "IMSG_RECONF_IFACE"); - if (IMSG_DATA_SIZE(imsg) > 255 + 2) - fatalx("%s: IMSG_RECONF_C_ID wrong length: " - "%lu", __func__, IMSG_DATA_SIZE(imsg)); - if ((iface_conf->c_id = malloc(IMSG_DATA_SIZE(imsg))) + fatalx("%s: %s without IMSG_RECONF_IFACE", + __func__, i2s(type)); + if (iface_conf->c_id != NULL) + fatalx("%s: multiple %s for the same interface", + __func__, i2s(type)); + if ((iface_conf->c_id_len = imsg_get_len(&imsg)) + > 255 + 2 || iface_conf->c_id_len == 0) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface_conf->c_id = malloc(iface_conf->c_id_len)) == NULL) fatal(NULL); - memcpy(iface_conf->c_id, imsg.data, - IMSG_DATA_SIZE(imsg)); - iface_conf->c_id_len = IMSG_DATA_SIZE(imsg); + if (imsg_get_data(&imsg, iface_conf->c_id, + iface_conf->c_id_len) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); break; - case IMSG_RECONF_H_NAME: + case IMSG_RECONF_H_NAME: { + size_t len; + if (iface_conf == NULL) - fatal("IMSG_RECONF_H_NAME without " - "IMSG_RECONF_IFACE"); - if (((char *)imsg.data)[IMSG_DATA_SIZE(imsg) - 1] != - '\0') - fatalx("Invalid hostname"); - if (IMSG_DATA_SIZE(imsg) > 256) - fatalx("Invalid hostname"); - if ((iface_conf->h_name = strdup(imsg.data)) == NULL) + fatalx("%s: %s without IMSG_RECONF_IFACE", + __func__, i2s(type)); + if (iface_conf->h_name != NULL) + fatalx("%s: multiple %s for the same interface", + __func__, i2s(type)); + if ((len = imsg_get_len(&imsg)) > 256 || len == 0) + fatalx("%s: invalid %s", __func__, i2s(type)); + if ((iface_conf->h_name = malloc(len)) == NULL) fatal(NULL); + if (imsg_get_data(&imsg, iface_conf->h_name, len) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); + if (iface_conf->h_name[len - 1] != '\0') + fatalx("Invalid hostname"); break; + } case IMSG_RECONF_END: { int i; int *ifaces; char ifnamebuf[IF_NAMESIZE], *if_name; if (nconf == NULL) - fatalx("%s: IMSG_RECONF_END without " - "IMSG_RECONF_CONF", __func__); + fatalx("%s: %s without IMSG_RECONF_CONF", + __func__, i2s(type)); ifaces = changed_ifaces(frontend_conf, nconf); merge_config(frontend_conf, nconf); @@ -442,8 +457,7 @@ frontend_dispatch_main(int fd, short event, void *bula) break; #endif /* SMALL */ default: - log_debug("%s: error handling imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: error handling imsg %d", __func__, type); break; } imsg_free(&imsg); @@ -465,6 +479,7 @@ frontend_dispatch_engine(int fd, short event, void *bula) struct imsg imsg; struct iface *iface; ssize_t n; + uint32_t type; int shut = 0; if (event & EV_READ) { @@ -486,7 +501,9 @@ frontend_dispatch_engine(int fd, short event, void *bula) if (n == 0) /* No more messages. */ break; - switch (imsg.hdr.type) { + type = imsg_get_type(&imsg); + + switch (type) { #ifndef SMALL case IMSG_CTL_END: case IMSG_CTL_SHOW_INTERFACE_INFO: @@ -495,12 +512,10 @@ frontend_dispatch_engine(int fd, short event, void *bula) #endif /* SMALL */ case IMSG_SEND_DISCOVER: { struct imsg_req_dhcp imsg_req_dhcp; - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_req_dhcp)) - fatalx("%s: IMSG_SEND_DISCOVER wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_req_dhcp, imsg.data, - sizeof(imsg_req_dhcp)); + + if (imsg_get_data(&imsg, &imsg_req_dhcp, + sizeof(imsg_req_dhcp)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); iface = get_iface_by_id(imsg_req_dhcp.if_index); @@ -513,12 +528,10 @@ frontend_dispatch_engine(int fd, short event, void *bula) } case IMSG_SEND_REQUEST: { struct imsg_req_dhcp imsg_req_dhcp; - if (IMSG_DATA_SIZE(imsg) != sizeof(imsg_req_dhcp)) - fatalx("%s: IMSG_SEND_REQUEST wrong " - "length: %lu", __func__, - IMSG_DATA_SIZE(imsg)); - memcpy(&imsg_req_dhcp, imsg.data, - sizeof(imsg_req_dhcp)); + + if (imsg_get_data(&imsg, &imsg_req_dhcp, + sizeof(imsg_req_dhcp)) == -1) + fatalx("%s: invalid %s", __func__, i2s(type)); iface = get_iface_by_id(imsg_req_dhcp.if_index); @@ -530,8 +543,7 @@ frontend_dispatch_engine(int fd, short event, void *bula) break; } default: - log_debug("%s: error handling imsg %d", __func__, - imsg.hdr.type); + log_debug("%s: error handling imsg %d", __func__, type); break; } imsg_free(&imsg); diff --git a/sbin/slaacd/slaacd.h b/sbin/slaacd/slaacd.h index 9f7ba4574..515843ef5 100644 --- a/sbin/slaacd/slaacd.h +++ b/sbin/slaacd/slaacd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: slaacd.h,v 1.40 2024/08/24 16:34:23 florian Exp $ */ +/* $OpenBSD: slaacd.h,v 1.41 2024/08/25 07:04:05 florian Exp $ */ /* * Copyright (c) 2017 Florian Obser @@ -207,6 +207,6 @@ int imsg_forward_event(struct imsgev *, struct imsg *); const char *sin6_to_str(struct sockaddr_in6 *); const char *i2s(uint32_t); #else -#define sin6_to_str(x...) "" -#define i2s(x...) "" +#define sin6_to_str(x) "" +#define i2s(x) "" #endif /* SMALL */ diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c index ecb70109c..b4bfe6e2d 100644 --- a/sys/arch/arm64/arm64/pmap.c +++ b/sys/arch/arm64/arm64/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.103 2024/05/28 15:16:45 claudio Exp $ */ +/* $OpenBSD: pmap.c,v 1.104 2024/08/26 03:37:56 jsg Exp $ */ /* * Copyright (c) 2008-2009,2014-2016 Dale Rahn * @@ -2237,34 +2237,35 @@ pmap_show_mapping(uint64_t va) pted, vp3->l3[VP_IDX3(va)], VP_IDX3(va)*8); } +__attribute__((target("+pauth"))) void pmap_setpauthkeys(struct pmap *pm) { if (ID_AA64ISAR1_APA(cpu_id_aa64isar1) >= ID_AA64ISAR1_APA_BASE || ID_AA64ISAR1_API(cpu_id_aa64isar1) >= ID_AA64ISAR1_API_BASE) { - __asm volatile (".arch armv8.3-a; msr apiakeylo_el1, %0" + __asm volatile ("msr apiakeylo_el1, %0" :: "r"(pm->pm_apiakey[0])); - __asm volatile (".arch armv8.3-a; msr apiakeyhi_el1, %0" + __asm volatile ("msr apiakeyhi_el1, %0" :: "r"(pm->pm_apiakey[1])); - __asm volatile (".arch armv8.3-a; msr apdakeylo_el1, %0" + __asm volatile ("msr apdakeylo_el1, %0" :: "r"(pm->pm_apdakey[0])); - __asm volatile (".arch armv8.3-a; msr apdakeyhi_el1, %0" + __asm volatile ("msr apdakeyhi_el1, %0" :: "r"(pm->pm_apdakey[1])); - __asm volatile (".arch armv8.3-a; msr apibkeylo_el1, %0" + __asm volatile ("msr apibkeylo_el1, %0" :: "r"(pm->pm_apibkey[0])); - __asm volatile (".arch armv8.3-a; msr apibkeyhi_el1, %0" + __asm volatile ("msr apibkeyhi_el1, %0" :: "r"(pm->pm_apibkey[1])); - __asm volatile (".arch armv8.3-a; msr apdbkeylo_el1, %0" + __asm volatile ("msr apdbkeylo_el1, %0" :: "r"(pm->pm_apdbkey[0])); - __asm volatile (".arch armv8.3-a; msr apdbkeyhi_el1, %0" + __asm volatile ("msr apdbkeyhi_el1, %0" :: "r"(pm->pm_apdbkey[1])); } if (ID_AA64ISAR1_GPA(cpu_id_aa64isar1) >= ID_AA64ISAR1_GPA_IMPL || ID_AA64ISAR1_GPI(cpu_id_aa64isar1) >= ID_AA64ISAR1_GPI_IMPL) { - __asm volatile (".arch armv8.3-a; msr apgakeylo_el1, %0" + __asm volatile ("msr apgakeylo_el1, %0" :: "r"(pm->pm_apgakey[0])); - __asm volatile (".arch armv8.3-a; msr apgakeyhi_el1, %0" + __asm volatile ("msr apgakeyhi_el1, %0" :: "r"(pm->pm_apgakey[1])); } } diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index aca80b54c..b357d3555 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sysctl.c,v 1.444 2024/08/23 01:31:04 mvs Exp $ */ +/* $OpenBSD: kern_sysctl.c,v 1.445 2024/08/26 08:24:25 mvs Exp $ */ /* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */ /*- @@ -487,8 +487,8 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, switch (name[0]) { #if NAUDIO > 0 case KERN_AUDIO: - return (sysctl_audio(name + 1, namelen - 1, oldp, oldlenp, - newp, newlen)); + return (sysctl_audio(name + 1, namelen - 1, + oldp, oldlenp, newp, newlen)); #endif default: break; diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 9ba66ae6d..0cd61cca6 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_input.c,v 1.406 2024/06/07 08:02:17 jsg Exp $ */ +/* $OpenBSD: tcp_input.c,v 1.407 2024/08/26 13:55:14 bluhm Exp $ */ /* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */ /* @@ -871,14 +871,15 @@ findpcb: /* * Process options. */ + if (optp #ifdef TCP_SIGNATURE - if (optp || (tp->t_flags & TF_SIGNATURE)) -#else - if (optp) + || (tp->t_flags & TF_SIGNATURE) #endif + ) { if (tcp_dooptions(tp, optp, optlen, th, m, iphlen, &opti, m->m_pkthdr.ph_rtableid, now)) goto drop; + } if (opti.ts_present && opti.ts_ecr) { int32_t rtt_test; @@ -2124,7 +2125,7 @@ tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, struct tcphdr *th, #ifdef TCP_SIGNATURE caddr_t sigp = NULL; struct tdb *tdb = NULL; -#endif /* TCP_SIGNATURE */ +#endif for (; cp && cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[0]; @@ -2289,7 +2290,7 @@ tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, struct tcphdr *th, #ifdef TCP_SIGNATURE bad: tdb_unref(tdb); -#endif /* TCP_SIGNATURE */ +#endif return (-1); } @@ -3783,11 +3784,11 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, win = TCP_MAXWIN; bzero(&tb, sizeof(tb)); + if (optp #ifdef TCP_SIGNATURE - if (optp || (tp->t_flags & TF_SIGNATURE)) { -#else - if (optp) { + || (tp->t_flags & TF_SIGNATURE) #endif + ) { tb.pf = tp->pf; tb.sack_enable = tp->sack_enable; tb.t_flags = tcp_do_rfc1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0; diff --git a/usr.bin/printf/printf.c b/usr.bin/printf/printf.c index fc6a8b35c..5723a1739 100644 --- a/usr.bin/printf/printf.c +++ b/usr.bin/printf/printf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: printf.c,v 1.27 2021/05/07 14:31:27 martijn Exp $ */ +/* $OpenBSD: printf.c,v 1.28 2024/08/26 03:49:06 deraadt Exp $ */ /* * Copyright (c) 1989 The Regents of the University of California. @@ -113,7 +113,7 @@ main(int argc, char *argv[]) start = fmt++; if (*fmt == '%') { - putchar ('%'); + putchar('%'); break; } else if (*fmt == 'b') { char *p = getstr(); @@ -149,7 +149,7 @@ main(int argc, char *argv[]) } if (!*fmt) { - warnx ("missing format character"); + warnx("missing format character"); return(1); } @@ -206,7 +206,7 @@ main(int argc, char *argv[]) break; } default: - warnx ("%s: invalid directive", start); + warnx("%s: invalid directive", start); return(1); } *(fmt + 1) = nextch; @@ -217,7 +217,7 @@ main(int argc, char *argv[]) break; default: - putchar (*fmt); + putchar(*fmt); break; } } @@ -251,7 +251,7 @@ print_escape_str(const char *str) value <<= 3; value += octtobin(*str); } - putchar (value); + putchar(value); str--; } else if (*str == 'c') { return 1; @@ -260,7 +260,7 @@ print_escape_str(const char *str) str += print_escape(str); } } else { - putchar (*str); + putchar(*str); } str++; } @@ -297,7 +297,7 @@ print_escape(const char *str) value <<= 4; value += hextobin(*str); } - putchar (value); + putchar(value); return str - start - 1; /* NOTREACHED */ @@ -433,7 +433,7 @@ getlong(void) return (unsigned char) *((*gargv++)+1); errno = 0; - val = strtol (*gargv, &ep, 0); + val = strtol(*gargv, &ep, 0); check_conversion(*gargv++, ep); return val; } @@ -451,7 +451,7 @@ getulong(void) return (unsigned char) *((*gargv++)+1); errno = 0; - val = strtoul (*gargv, &ep, 0); + val = strtoul(*gargv, &ep, 0); check_conversion(*gargv++, ep); return val; } @@ -469,7 +469,7 @@ getdouble(void) return (unsigned char) *((*gargv++)+1); errno = 0; - val = strtod (*gargv, &ep); + val = strtod(*gargv, &ep); check_conversion(*gargv++, ep); return val; } @@ -479,9 +479,9 @@ check_conversion(const char *s, const char *ep) { if (*ep) { if (ep == s) - warnx ("%s: expected numeric value", s); + warnx("%s: expected numeric value", s); else - warnx ("%s: not completely converted", s); + warnx("%s: not completely converted", s); rval = 1; } else if (errno == ERANGE) { warnc(ERANGE, "%s", s); diff --git a/usr.bin/sndiod/sock.c b/usr.bin/sndiod/sock.c index 969ea9f0f..6402fabda 100644 --- a/usr.bin/sndiod/sock.c +++ b/usr.bin/sndiod/sock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sock.c,v 1.50 2024/08/01 14:36:27 ratchov Exp $ */ +/* $OpenBSD: sock.c,v 1.51 2024/08/25 05:43:36 jsg Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -1805,7 +1805,7 @@ sock_write(struct sock *f) } f->wstate = SOCK_WDATA; f->wsize = f->wtodo = ntohl(f->wmsg.u.data.size); - /* PASSTHROUGH */ + /* FALLTHROUGH */ case SOCK_WDATA: if (!sock_wdata(f)) return 0; @@ -1823,7 +1823,7 @@ sock_write(struct sock *f) } #endif } - /* PASSTHROUGH */ + /* FALLTHROUGH */ case SOCK_WIDLE: if (f->rstate == SOCK_RRET) { f->wmsg = f->rmsg; diff --git a/usr.bin/tmux/client.c b/usr.bin/tmux/client.c index dfbf36939..be281848f 100644 --- a/usr.bin/tmux/client.c +++ b/usr.bin/tmux/client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.162 2024/05/15 09:59:12 nicm Exp $ */ +/* $OpenBSD: client.c,v 1.163 2024/08/26 07:30:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -445,11 +445,12 @@ client_send_identify(const char *ttynam, const char *termname, char **caps, { char **ss; size_t sslen; - int fd, flags = client_flags; + int fd; + uint64_t flags = client_flags; pid_t pid; u_int i; - proc_send(client_peer, MSG_IDENTIFY_FLAGS, -1, &flags, sizeof flags); + proc_send(client_peer, MSG_IDENTIFY_LONGFLAGS, -1, &flags, sizeof flags); proc_send(client_peer, MSG_IDENTIFY_LONGFLAGS, -1, &client_flags, sizeof client_flags); diff --git a/usr.bin/tmux/cmd-copy-mode.c b/usr.bin/tmux/cmd-copy-mode.c index 84b7521c7..a9110cf87 100644 --- a/usr.bin/tmux/cmd-copy-mode.c +++ b/usr.bin/tmux/cmd-copy-mode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-copy-mode.c,v 1.47 2021/08/21 10:22:38 nicm Exp $ */ +/* $OpenBSD: cmd-copy-mode.c,v 1.48 2024/08/26 07:09:34 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -30,8 +30,8 @@ const struct cmd_entry cmd_copy_mode_entry = { .name = "copy-mode", .alias = NULL, - .args = { "eHMs:t:uq", 0, 0, NULL }, - .usage = "[-eHMuq] [-s src-pane] " CMD_TARGET_PANE_USAGE, + .args = { "deHMs:t:uq", 0, 0, NULL }, + .usage = "[-deHMuq] [-s src-pane] " CMD_TARGET_PANE_USAGE, .source = { 's', CMD_FIND_PANE, 0 }, .target = { 't', CMD_FIND_PANE, 0 }, @@ -91,6 +91,8 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) } if (args_has(args, 'u')) window_copy_pageup(wp, 0); + if (args_has(args, 'd')) + window_copy_pagedown(wp, 0, args_has(args, 'e')); return (CMD_RETURN_NORMAL); } diff --git a/usr.bin/tmux/colour.c b/usr.bin/tmux/colour.c index 4f7a9a08d..455781221 100644 --- a/usr.bin/tmux/colour.c +++ b/usr.bin/tmux/colour.c @@ -1,4 +1,4 @@ -/* $OpenBSD: colour.c,v 1.26 2023/01/03 11:43:24 nicm Exp $ */ +/* $OpenBSD: colour.c,v 1.27 2024/08/26 13:02:15 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -942,13 +942,17 @@ colour_byname(const char *name) { "yellow3", 0xcdcd00 }, { "yellow4", 0x8b8b00 } }; - u_int i; - int c; + u_int i; + int c; + const char *errstr; if (strncmp(name, "grey", 4) == 0 || strncmp(name, "gray", 4) == 0) { - if (!isdigit((u_char)name[4])) - return (0xbebebe|COLOUR_FLAG_RGB); - c = round(2.55 * atoi(name + 4)); + if (name[4] == '\0') + return (-1); + c = strtonum(name + 4, 0, 100, &errstr); + if (errstr != NULL) + return (-1); + c = round(2.55 * c); if (c < 0 || c > 255) return (-1); return (colour_join_rgb(c, c, c)); diff --git a/usr.bin/tmux/format.c b/usr.bin/tmux/format.c index aa17e924f..10283c597 100644 --- a/usr.bin/tmux/format.c +++ b/usr.bin/tmux/format.c @@ -1,4 +1,4 @@ -/* $OpenBSD: format.c,v 1.319 2024/08/21 04:17:09 nicm Exp $ */ +/* $OpenBSD: format.c,v 1.320 2024/08/26 07:14:40 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -1136,8 +1136,7 @@ format_cb_mouse_word(struct format_tree *ft) return (NULL); if (!TAILQ_EMPTY(&wp->modes)) { - if (TAILQ_FIRST(&wp->modes)->mode == &window_copy_mode || - TAILQ_FIRST(&wp->modes)->mode == &window_view_mode) + if (window_pane_mode(wp) != WINDOW_PANE_NO_MODE) return (window_copy_get_word(wp, x, y)); return (NULL); } @@ -1181,8 +1180,7 @@ format_cb_mouse_line(struct format_tree *ft) return (NULL); if (!TAILQ_EMPTY(&wp->modes)) { - if (TAILQ_FIRST(&wp->modes)->mode == &window_copy_mode || - TAILQ_FIRST(&wp->modes)->mode == &window_view_mode) + if (window_pane_mode(wp) != WINDOW_PANE_NO_MODE) return (window_copy_get_line(wp, y)); return (NULL); } diff --git a/usr.bin/tmux/input-keys.c b/usr.bin/tmux/input-keys.c index d8dc2aa21..42b5b235e 100644 --- a/usr.bin/tmux/input-keys.c +++ b/usr.bin/tmux/input-keys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: input-keys.c,v 1.97 2024/08/23 13:25:39 nicm Exp $ */ +/* $OpenBSD: input-keys.c,v 1.98 2024/08/26 07:45:05 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -608,8 +608,9 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key) * key and no modifiers. */ if (!(key & ~KEYC_MASK_KEY)) { - if (key == C0_BS || key == C0_HT || - key == C0_CR || key == C0_ESC || + if (key == C0_HT || + key == C0_CR || + key == C0_ESC || (key >= 0x20 && key <= 0x7f)) { ud.data[0] = key; input_key_write(__func__, bev, &ud.data[0], 1); diff --git a/usr.bin/tmux/screen-redraw.c b/usr.bin/tmux/screen-redraw.c index dd87e0eb5..cffe31234 100644 --- a/usr.bin/tmux/screen-redraw.c +++ b/usr.bin/tmux/screen-redraw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-redraw.c,v 1.96 2022/06/30 09:55:53 nicm Exp $ */ +/* $OpenBSD: screen-redraw.c,v 1.98 2024/08/26 07:34:40 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -109,12 +109,13 @@ screen_redraw_two_panes(struct window *w, int direction) /* Check if cell is on the border of a pane. */ static enum screen_redraw_border_type -screen_redraw_pane_border(struct window_pane *wp, u_int px, u_int py, - int pane_status) +screen_redraw_pane_border(struct screen_redraw_ctx *ctx, struct window_pane *wp, + u_int px, u_int py) { struct options *oo = wp->window->options; int split = 0; - u_int ex = wp->xoff + wp->sx, ey = wp->yoff + wp->sy; + u_int ex = wp->xoff + wp->sx, ey = wp->yoff + wp->sy; + int pane_status = ctx->pane_status; /* Inside pane. */ if (px >= wp->xoff && px < ex && py >= wp->yoff && py < ey) @@ -189,8 +190,9 @@ screen_redraw_pane_border(struct window_pane *wp, u_int px, u_int py, /* Check if a cell is on a border. */ static int -screen_redraw_cell_border(struct client *c, u_int px, u_int py, int pane_status) +screen_redraw_cell_border(struct screen_redraw_ctx *ctx, u_int px, u_int py) { + struct client *c = ctx->c; struct window *w = c->session->curw->window; struct window_pane *wp; @@ -206,7 +208,7 @@ screen_redraw_cell_border(struct client *c, u_int px, u_int py, int pane_status) TAILQ_FOREACH(wp, &w->panes, entry) { if (!window_pane_visible(wp)) continue; - switch (screen_redraw_pane_border(wp, px, py, pane_status)) { + switch (screen_redraw_pane_border(ctx, wp, px, py)) { case SCREEN_REDRAW_INSIDE: return (0); case SCREEN_REDRAW_OUTSIDE: @@ -221,9 +223,10 @@ screen_redraw_cell_border(struct client *c, u_int px, u_int py, int pane_status) /* Work out type of border cell from surrounding cells. */ static int -screen_redraw_type_of_cell(struct client *c, u_int px, u_int py, - int pane_status) +screen_redraw_type_of_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py) { + struct client *c = ctx->c; + int pane_status = ctx->pane_status; struct window *w = c->session->curw->window; u_int sx = w->sx, sy = w->sy; int borders = 0; @@ -236,28 +239,28 @@ screen_redraw_type_of_cell(struct client *c, u_int px, u_int py, * Construct a bitmask of whether the cells to the left (bit 4), right, * top, and bottom (bit 1) of this cell are borders. */ - if (px == 0 || screen_redraw_cell_border(c, px - 1, py, pane_status)) + if (px == 0 || screen_redraw_cell_border(ctx, px - 1, py)) borders |= 8; - if (px <= sx && screen_redraw_cell_border(c, px + 1, py, pane_status)) + if (px <= sx && screen_redraw_cell_border(ctx, px + 1, py)) borders |= 4; if (pane_status == PANE_STATUS_TOP) { if (py != 0 && - screen_redraw_cell_border(c, px, py - 1, pane_status)) + screen_redraw_cell_border(ctx, px, py - 1)) borders |= 2; - if (screen_redraw_cell_border(c, px, py + 1, pane_status)) + if (screen_redraw_cell_border(ctx, px, py + 1)) borders |= 1; } else if (pane_status == PANE_STATUS_BOTTOM) { if (py == 0 || - screen_redraw_cell_border(c, px, py - 1, pane_status)) + screen_redraw_cell_border(ctx, px, py - 1)) borders |= 2; if (py != sy - 1 && - screen_redraw_cell_border(c, px, py + 1, pane_status)) + screen_redraw_cell_border(ctx, px, py + 1)) borders |= 1; } else { if (py == 0 || - screen_redraw_cell_border(c, px, py - 1, pane_status)) + screen_redraw_cell_border(ctx, px, py - 1)) borders |= 2; - if (screen_redraw_cell_border(c, px, py + 1, pane_status)) + if (screen_redraw_cell_border(ctx, px, py + 1)) borders |= 1; } @@ -295,11 +298,13 @@ screen_redraw_type_of_cell(struct client *c, u_int px, u_int py, /* Check if cell inside a pane. */ static int -screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status, +screen_redraw_check_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py, struct window_pane **wpp) { + struct client *c = ctx->c; struct window *w = c->session->curw->window; struct window_pane *wp, *active; + int pane_status = ctx->pane_status; int border; u_int right, line; @@ -308,7 +313,7 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status, if (px > w->sx || py > w->sy) return (CELL_OUTSIDE); if (px == w->sx || py == w->sy) /* window border */ - return (screen_redraw_type_of_cell(c, px, py, pane_status)); + return (screen_redraw_type_of_cell(ctx, px, py)); if (pane_status != PANE_STATUS_OFF) { active = wp = server_client_get_pane(c); @@ -342,12 +347,12 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status, * If definitely inside, return. If not on border, skip. * Otherwise work out the cell. */ - border = screen_redraw_pane_border(wp, px, py, pane_status); + border = screen_redraw_pane_border(ctx, wp, px, py); if (border == SCREEN_REDRAW_INSIDE) return (CELL_INSIDE); if (border == SCREEN_REDRAW_OUTSIDE) goto next2; - return (screen_redraw_type_of_cell(c, px, py, pane_status)); + return (screen_redraw_type_of_cell(ctx, px, py)); next2: wp = TAILQ_NEXT(wp, entry); @@ -360,12 +365,12 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py, int pane_status, /* Check if the border of a particular pane. */ static int -screen_redraw_check_is(u_int px, u_int py, int pane_status, +screen_redraw_check_is(struct screen_redraw_ctx *ctx, u_int px, u_int py, struct window_pane *wp) { enum screen_redraw_border_type border; - border = screen_redraw_pane_border(wp, px, py, pane_status); + border = screen_redraw_pane_border(ctx, wp, px, py); if (border != SCREEN_REDRAW_INSIDE && border != SCREEN_REDRAW_OUTSIDE) return (1); return (0); @@ -409,11 +414,11 @@ screen_redraw_make_pane_status(struct client *c, struct window_pane *wp, for (i = 0; i < width; i++) { px = wp->xoff + 2 + i; - if (rctx->pane_status == PANE_STATUS_TOP) + if (pane_status == PANE_STATUS_TOP) py = wp->yoff - 1; else py = wp->yoff + wp->sy; - cell_type = screen_redraw_type_of_cell(c, px, py, pane_status); + cell_type = screen_redraw_type_of_cell(rctx, px, py); screen_redraw_border_set(w, wp, pane_lines, cell_type, &gc); screen_write_cell(&ctx, &gc); } @@ -496,8 +501,8 @@ screen_redraw_draw_pane_status(struct screen_redraw_ctx *ctx) } /* Update status line and change flags if unchanged. */ -static int -screen_redraw_update(struct client *c, int flags) +static uint64_t +screen_redraw_update(struct client *c, uint64_t flags) { struct window *w = c->session->curw->window; struct window_pane *wp; @@ -567,7 +572,7 @@ void screen_redraw_screen(struct client *c) { struct screen_redraw_ctx ctx; - int flags; + uint64_t flags; if (c->flags & CLIENT_SUSPENDED) return; @@ -638,7 +643,7 @@ screen_redraw_draw_borders_style(struct screen_redraw_ctx *ctx, u_int x, wp->border_gc_set = 1; ft = format_create_defaults(NULL, c, s, s->curw, wp); - if (screen_redraw_check_is(x, y, ctx->pane_status, active)) + if (screen_redraw_check_is(ctx, x, y, active)) style_apply(&wp->border_gc, oo, "pane-active-border-style", ft); else style_apply(&wp->border_gc, oo, "pane-border-style", ft); @@ -663,7 +668,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) struct overlay_ranges r; u_int cell_type, x = ctx->ox + i, y = ctx->oy + j; int arrows = 0, border; - int pane_status = ctx->pane_status, isolates; + int isolates; if (c->overlay_check != NULL) { c->overlay_check(c, c->overlay_data, x, y, 1, &r); @@ -671,7 +676,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) return; } - cell_type = screen_redraw_check_cell(c, x, y, pane_status, &wp); + cell_type = screen_redraw_check_cell(ctx, x, y, &wp); if (cell_type == CELL_INSIDE) return; @@ -692,7 +697,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) memcpy(&gc, tmp, sizeof gc); if (server_is_marked(s, s->curw, marked_pane.wp) && - screen_redraw_check_is(x, y, pane_status, marked_pane.wp)) + screen_redraw_check_is(ctx, x, y, marked_pane.wp)) gc.attr ^= GRID_ATTR_REVERSE; } screen_redraw_border_set(w, wp, ctx->pane_lines, cell_type, &gc); @@ -719,7 +724,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) } if (wp != NULL && arrows) { - border = screen_redraw_pane_border(active, x, y, pane_status); + border = screen_redraw_pane_border(ctx, active, x, y); if (((i == wp->xoff + 1 && (cell_type == CELL_LEFTRIGHT || (cell_type == CELL_TOPJOIN && @@ -732,7 +737,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) border == SCREEN_REDRAW_BORDER_RIGHT) || (cell_type == CELL_RIGHTJOIN && border == SCREEN_REDRAW_BORDER_LEFT)))) && - screen_redraw_check_is(x, y, pane_status, active)) { + screen_redraw_check_is(ctx, x, y, active)) { gc.attr |= GRID_ATTR_CHARSET; utf8_set(&gc.data, BORDER_MARKERS[border]); } @@ -751,7 +756,7 @@ screen_redraw_draw_borders(struct screen_redraw_ctx *ctx) struct session *s = c->session; struct window *w = s->curw->window; struct window_pane *wp; - u_int i, j; + u_int i, j; log_debug("%s: %s @%u", __func__, c->name, w->id); diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 6ed62c49b..3dace5bb8 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.405 2024/04/10 07:29:15 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.406 2024/08/26 07:30:46 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -1870,7 +1870,8 @@ server_client_key_callback(struct cmdq_item *item, void *data) struct timeval tv; struct key_table *table, *first; struct key_binding *bd; - int xtimeout, flags; + int xtimeout; + uint64_t flags; struct cmd_find_state fs; key_code key0, prefix, prefix2; @@ -2569,7 +2570,8 @@ server_client_check_redraw(struct client *c) struct tty *tty = &c->tty; struct window *w = c->session->curw->window; struct window_pane *wp; - int needed, flags, mode = tty->mode, new_flags = 0; + int needed, tty_flags, mode = tty->mode; + uint64_t client_flags = 0; int redraw; u_int bit = 0; struct timeval tv = { .tv_usec = 1000 }; @@ -2603,7 +2605,7 @@ server_client_check_redraw(struct client *c) } } if (needed) - new_flags |= CLIENT_REDRAWPANES; + client_flags |= CLIENT_REDRAWPANES; } if (needed && (left = EVBUFFER_LENGTH(tty->out)) != 0) { log_debug("%s: redraw deferred (%zu left)", c->name, left); @@ -2626,20 +2628,20 @@ server_client_check_redraw(struct client *c) * If more that 64 panes, give up and * just redraw the window. */ - new_flags &= CLIENT_REDRAWPANES; - new_flags |= CLIENT_REDRAWWINDOW; + client_flags &= CLIENT_REDRAWPANES; + client_flags |= CLIENT_REDRAWWINDOW; break; } } if (c->redraw_panes != 0) c->flags |= CLIENT_REDRAWPANES; } - c->flags |= new_flags; + c->flags |= client_flags; return; } else if (needed) log_debug("%s: redraw needed", c->name); - flags = tty->flags & (TTY_BLOCK|TTY_FREEZE|TTY_NOCURSOR); + tty_flags = tty->flags & (TTY_BLOCK|TTY_FREEZE|TTY_NOCURSOR); tty->flags = (tty->flags & ~(TTY_BLOCK|TTY_FREEZE))|TTY_NOCURSOR; if (~c->flags & CLIENT_REDRAWWINDOW) { @@ -2671,9 +2673,10 @@ server_client_check_redraw(struct client *c) screen_redraw_screen(c); } - tty->flags = (tty->flags & ~TTY_NOCURSOR)|(flags & TTY_NOCURSOR); + tty->flags = (tty->flags & ~TTY_NOCURSOR)|(tty_flags & TTY_NOCURSOR); tty_update_mode(tty, mode, NULL); - tty->flags = (tty->flags & ~(TTY_BLOCK|TTY_FREEZE|TTY_NOCURSOR))|flags; + tty->flags = (tty->flags & ~(TTY_BLOCK|TTY_FREEZE|TTY_NOCURSOR))| + tty_flags; c->flags &= ~(CLIENT_ALLREDRAWFLAGS|CLIENT_STATUSFORCE); diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c index c5cfce6e0..d01d15dab 100644 --- a/usr.bin/tmux/server.c +++ b/usr.bin/tmux/server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.206 2024/05/14 10:11:09 nicm Exp $ */ +/* $OpenBSD: server.c,v 1.207 2024/08/26 07:30:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -104,8 +104,8 @@ server_check_marked(void) } /* Create server socket. */ -static int -server_create_socket(int flags, char **cause) +int +server_create_socket(uint64_t flags, char **cause) { struct sockaddr_un sa; size_t size; @@ -170,7 +170,7 @@ server_tidy_event(__unused int fd, __unused short events, __unused void *data) /* Fork new server. */ int -server_start(struct tmuxproc *client, int flags, struct event_base *base, +server_start(struct tmuxproc *client, uint64_t flags, struct event_base *base, int lockfd, char *lockfile) { int fd; diff --git a/usr.bin/tmux/style.c b/usr.bin/tmux/style.c index 8491e0329..049b40ed3 100644 --- a/usr.bin/tmux/style.c +++ b/usr.bin/tmux/style.c @@ -1,4 +1,4 @@ -/* $OpenBSD: style.c,v 1.34 2024/01/22 16:34:46 nicm Exp $ */ +/* $OpenBSD: style.c,v 1.35 2024/08/26 13:02:15 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -58,10 +58,11 @@ int style_parse(struct style *sy, const struct grid_cell *base, const char *in) { struct style saved; - const char delimiters[] = " ,\n", *cp; + const char delimiters[] = " ,\n", *errstr; char tmp[256], *found; int value; size_t end; + u_int n; if (*in == '\0') return (0); @@ -137,34 +138,31 @@ style_parse(struct style *sy, const struct grid_cell *base, const char *in) goto error; if (*found != '%' || found[1] == '\0') goto error; - for (cp = found + 1; *cp != '\0'; cp++) { - if (!isdigit((u_char)*cp)) - goto error; - } + n = strtonum(found + 1, 0, UINT_MAX, &errstr); + if (errstr != NULL) + goto error; sy->range_type = STYLE_RANGE_PANE; - sy->range_argument = atoi(found + 1); + sy->range_argument = n; style_set_range_string(sy, ""); } else if (strcasecmp(tmp + 6, "window") == 0) { if (found == NULL) goto error; - for (cp = found; *cp != '\0'; cp++) { - if (!isdigit((u_char)*cp)) - goto error; - } + n = strtonum(found, 0, UINT_MAX, &errstr); + if (errstr != NULL) + goto error; sy->range_type = STYLE_RANGE_WINDOW; - sy->range_argument = atoi(found); + sy->range_argument = n; style_set_range_string(sy, ""); } else if (strcasecmp(tmp + 6, "session") == 0) { if (found == NULL) goto error; if (*found != '$' || found[1] == '\0') goto error; - for (cp = found + 1; *cp != '\0'; cp++) { - if (!isdigit((u_char)*cp)) - goto error; - } + n = strtonum(found + 1, 0, UINT_MAX, &errstr); + if (errstr != NULL) + goto error; sy->range_type = STYLE_RANGE_SESSION; - sy->range_argument = atoi(found + 1); + sy->range_argument = n; style_set_range_string(sy, ""); } else if (strcasecmp(tmp + 6, "user") == 0) { if (found == NULL) diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 0890ffafb..2a905aae6 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.951 2024/08/22 09:05:51 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.952 2024/08/26 07:09:34 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: August 22 2024 $ +.Dd $Mdocdate: August 26 2024 $ .Dt TMUX 1 .Os .Sh NAME @@ -2108,14 +2108,15 @@ The synopsis for the command is: .Bl -tag -width Ds .It Xo Ic copy-mode -.Op Fl eHMqu +.Op Fl deHMqu .Op Fl s Ar src-pane .Op Fl t Ar target-pane .Xc Enter copy mode. -The .Fl u -option scrolls one page up. +also scrolls one page up after entering and +.Fl d +one page down if already in copy mode. .Fl M begins a mouse drag (only valid if bound to a mouse key binding, see .Sx MOUSE SUPPORT ) . @@ -2138,6 +2139,7 @@ This is intended to allow fast scrolling through a pane's history, for example with: .Bd -literal -offset indent bind PageUp copy-mode -eu +bind PageDown copy-mode -ed .Ed .El .Pp diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 2faaf53fd..f8e7c5275 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.1222 2024/08/23 13:25:39 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.1225 2024/08/26 07:30:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -966,6 +966,11 @@ enum pane_lines { #define PANE_BORDER_ARROWS 2 #define PANE_BORDER_BOTH 3 +/* Mode returned by window_pane_mode function. */ +#define WINDOW_PANE_NO_MODE 0 +#define WINDOW_PANE_COPY_MODE 1 +#define WINDOW_PANE_VIEW_MODE 2 + /* Screen redraw context. */ struct screen_redraw_ctx { struct client *c; @@ -2698,10 +2703,12 @@ void server_clear_marked(void); int server_is_marked(struct session *, struct winlink *, struct window_pane *); int server_check_marked(void); -int server_start(struct tmuxproc *, int, struct event_base *, int, char *); +int server_start(struct tmuxproc *, uint64_t, struct event_base *, int, + char *); void server_update_socket(void); void server_add_accept(int); void printflike(1, 2) server_add_message(const char *, ...); +int server_create_socket(uint64_t, char **); /* server-client.c */ RB_PROTOTYPE(client_windows, client_window, entry, server_client_window_cmp); @@ -3112,6 +3119,7 @@ void window_pane_update_used_data(struct window_pane *, struct window_pane_offset *, size_t); void window_set_fill_character(struct window *); void window_pane_default_cursor(struct window_pane *); +int window_pane_mode(struct window_pane *); /* layout.c */ u_int layout_count_cells(struct layout_cell *); @@ -3218,6 +3226,7 @@ void printflike(3, 4) window_copy_add(struct window_pane *, int, const char *, void printflike(3, 0) window_copy_vadd(struct window_pane *, int, const char *, va_list); void window_copy_pageup(struct window_pane *, int); +void window_copy_pagedown(struct window_pane *, int, int); void window_copy_start_drag(struct client *, struct mouse_event *); char *window_copy_get_word(struct window_pane *, u_int, u_int); char *window_copy_get_line(struct window_pane *, u_int); diff --git a/usr.bin/tmux/tty-keys.c b/usr.bin/tmux/tty-keys.c index f859747e3..a3b5f624b 100644 --- a/usr.bin/tmux/tty-keys.c +++ b/usr.bin/tmux/tty-keys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-keys.c,v 1.177 2024/08/21 04:17:09 nicm Exp $ */ +/* $OpenBSD: tty-keys.c,v 1.178 2024/08/26 07:45:05 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -812,8 +812,9 @@ first_key: * lowercase, so ^A becomes a|CTRL. */ onlykey = key & KEYC_MASK_KEY; - if (onlykey < 0x20 && onlykey != C0_BS && - onlykey != C0_HT && onlykey != C0_CR && + if (onlykey < 0x20 && + onlykey != C0_HT && + onlykey != C0_CR && onlykey != C0_ESC) { onlykey |= 0x40; if (onlykey >= 'A' && onlykey <= 'Z') diff --git a/usr.bin/tmux/tty-term.c b/usr.bin/tmux/tty-term.c index 7e0dd475b..e68088303 100644 --- a/usr.bin/tmux/tty-term.c +++ b/usr.bin/tmux/tty-term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-term.c,v 1.101 2023/10/17 09:55:32 nicm Exp $ */ +/* $OpenBSD: tty-term.c,v 1.102 2024/08/26 13:02:15 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -528,9 +528,10 @@ tty_term_create(struct tty *tty, char *name, char **caps, u_int ncaps, struct options_array_item *a; union options_value *ov; u_int i, j; - const char *s, *value; + const char *s, *value, *errstr; size_t offset, namelen; char *first; + int n; log_debug("adding term %s", name); @@ -564,8 +565,13 @@ tty_term_create(struct tty *tty, char *name, char **caps, u_int ncaps, code->value.string = tty_term_strip(value); break; case TTYCODE_NUMBER: - code->type = TTYCODE_NUMBER; - code->value.number = atoi(value); + n = strtonum(value, 0, INT_MAX, &errstr); + if (errstr != NULL) + log_debug("%s: %s", ent->name, errstr); + else { + code->type = TTYCODE_NUMBER; + code->value.number = n; + } break; case TTYCODE_FLAG: code->type = TTYCODE_FLAG; diff --git a/usr.bin/tmux/window-copy.c b/usr.bin/tmux/window-copy.c index cacf9f1f1..8d0ab7524 100644 --- a/usr.bin/tmux/window-copy.c +++ b/usr.bin/tmux/window-copy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window-copy.c,v 1.350 2024/05/14 09:32:37 nicm Exp $ */ +/* $OpenBSD: window-copy.c,v 1.351 2024/08/26 07:09:34 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -41,7 +41,7 @@ static void window_copy_resize(struct window_mode_entry *, u_int, u_int); static void window_copy_formats(struct window_mode_entry *, struct format_tree *); static void window_copy_pageup1(struct window_mode_entry *, int); -static int window_copy_pagedown(struct window_mode_entry *, int, int); +static int window_copy_pagedown1(struct window_mode_entry *, int, int); static void window_copy_next_paragraph(struct window_mode_entry *); static void window_copy_previous_paragraph(struct window_mode_entry *); static void window_copy_redraw_selection(struct window_mode_entry *, u_int); @@ -646,8 +646,18 @@ window_copy_pageup1(struct window_mode_entry *wme, int half_page) window_copy_redraw_screen(wme); } +void +window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit) +{ + if (window_copy_pagedown1(TAILQ_FIRST(&wp->modes), half_page, + scroll_exit)) { + window_pane_reset_mode(wp); + return; + } +} + static int -window_copy_pagedown(struct window_mode_entry *wme, int half_page, +window_copy_pagedown1(struct window_mode_entry *wme, int half_page, int scroll_exit) { struct window_copy_mode_data *data = wme->data; @@ -1347,7 +1357,7 @@ window_copy_cmd_halfpage_down(struct window_copy_cmd_state *cs) u_int np = wme->prefix; for (; np != 0; np--) { - if (window_copy_pagedown(wme, 1, data->scroll_exit)) + if (window_copy_pagedown1(wme, 1, data->scroll_exit)) return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_NOTHING); @@ -1361,7 +1371,7 @@ window_copy_cmd_halfpage_down_and_cancel(struct window_copy_cmd_state *cs) u_int np = wme->prefix; for (; np != 0; np--) { - if (window_copy_pagedown(wme, 1, 1)) + if (window_copy_pagedown1(wme, 1, 1)) return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_NOTHING); @@ -1789,7 +1799,7 @@ window_copy_cmd_page_down(struct window_copy_cmd_state *cs) u_int np = wme->prefix; for (; np != 0; np--) { - if (window_copy_pagedown(wme, 0, data->scroll_exit)) + if (window_copy_pagedown1(wme, 0, data->scroll_exit)) return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_NOTHING); @@ -1802,7 +1812,7 @@ window_copy_cmd_page_down_and_cancel(struct window_copy_cmd_state *cs) u_int np = wme->prefix; for (; np != 0; np--) { - if (window_copy_pagedown(wme, 0, 1)) + if (window_copy_pagedown1(wme, 0, 1)) return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_NOTHING); diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c index 5aebeedaa..1a085966a 100644 --- a/usr.bin/tmux/window.c +++ b/usr.bin/tmux/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.291 2024/06/24 08:30:50 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.292 2024/08/26 07:14:40 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1662,3 +1662,15 @@ window_pane_default_cursor(struct window_pane *wp) s->default_mode = 0; screen_set_cursor_style(c, &s->default_cstyle, &s->default_mode); } + +int +window_pane_mode(struct window_pane *wp) +{ + if (TAILQ_FIRST(&wp->modes) != NULL) { + if (TAILQ_FIRST(&wp->modes)->mode == &window_copy_mode) + return (WINDOW_PANE_COPY_MODE); + if (TAILQ_FIRST(&wp->modes)->mode == &window_view_mode) + return (WINDOW_PANE_VIEW_MODE); + } + return (WINDOW_PANE_NO_MODE); +}