Module Name:    src
Committed By:   martin
Date:           Tue Mar 12 10:13:05 UTC 2024

Modified Files:
        src/usr.bin/kdump [netbsd-10]: kdump.c

Log Message:
Pull up following revision(s) (requested by kre in ticket #635):

        usr.bin/kdump/kdump.c: revision 1.141
        usr.bin/kdump/kdump.c: revision 1.142
        usr.bin/kdump/kdump.c: revision 1.143
        usr.bin/kdump/kdump.c: revision 1.144

PR/57918: Taylor R Campbell: Don't try to print symbolically ioctls that
have bits set on the high 32 bits of a 64 bit long.

PR bin/57918

Redo the previous correctly, the test should be whether or not only the
bottom 32 bits are set, rather than whether any of bits 32..63 are set.

This makes no difference if u_long (or unsigned long long) is 64 bits,
it is the same test in that case, but if u_long were 128 bits there is
a notable difference (though for the particular issue observed in the PR,
it is likely to work either way).
decode some {g,s}etsockopt*.

kdump: keep the comment with its corresponding code
No binary change.


To generate a diff of this commit:
cvs rdiff -u -r1.140 -r1.140.2.1 src/usr.bin/kdump/kdump.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/kdump/kdump.c
diff -u src/usr.bin/kdump/kdump.c:1.140 src/usr.bin/kdump/kdump.c:1.140.2.1
--- src/usr.bin/kdump/kdump.c:1.140	Sun Jun 20 00:25:29 2021
+++ src/usr.bin/kdump/kdump.c	Tue Mar 12 10:13:05 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: kdump.c,v 1.140 2021/06/20 00:25:29 chs Exp $	*/
+/*	$NetBSD: kdump.c,v 1.140.2.1 2024/03/12 10:13:05 martin Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)kdump.c	8.4 (Berkeley) 4/28/95";
 #else
-__RCSID("$NetBSD: kdump.c,v 1.140 2021/06/20 00:25:29 chs Exp $");
+__RCSID("$NetBSD: kdump.c,v 1.140.2.1 2024/03/12 10:13:05 martin Exp $");
 #endif
 #endif /* not lint */
 
@@ -69,11 +69,16 @@ __RCSID("$NetBSD: kdump.c,v 1.140 2021/0
 #include <vis.h>
 #include <util.h>
 
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+
 #include "ktrace.h"
 #include "setemul.h"
 
 #include <sys/syscall.h>
 
+#define	CASERETURN(a)	case a:	return # a
+
 #define TIMESTAMP_NONE		0x0
 #define TIMESTAMP_ABSOLUTE	0x1
 #define TIMESTAMP_ELAPSED	0x2
@@ -552,23 +557,152 @@ output_long(u_long it, int as_x)
 static const char *
 fcntlname(u_long cmd)
 {
-#define	FCNTLCASE(a)	case a:	return # a
 	switch (cmd) {
-	FCNTLCASE(F_DUPFD);
-	FCNTLCASE(F_GETFD);
-	FCNTLCASE(F_SETFD);
-	FCNTLCASE(F_GETFL);
-	FCNTLCASE(F_SETFL);
-	FCNTLCASE(F_GETOWN);
-	FCNTLCASE(F_SETOWN);
-	FCNTLCASE(F_GETLK);
-	FCNTLCASE(F_SETLK);
-	FCNTLCASE(F_SETLKW);
-	FCNTLCASE(F_CLOSEM);
-	FCNTLCASE(F_MAXFD);
-	FCNTLCASE(F_DUPFD_CLOEXEC);
-	FCNTLCASE(F_GETNOSIGPIPE);
-	FCNTLCASE(F_SETNOSIGPIPE);
+	CASERETURN(F_DUPFD);
+	CASERETURN(F_GETFD);
+	CASERETURN(F_SETFD);
+	CASERETURN(F_GETFL);
+	CASERETURN(F_SETFL);
+	CASERETURN(F_GETOWN);
+	CASERETURN(F_SETOWN);
+	CASERETURN(F_GETLK);
+	CASERETURN(F_SETLK);
+	CASERETURN(F_SETLKW);
+	CASERETURN(F_CLOSEM);
+	CASERETURN(F_MAXFD);
+	CASERETURN(F_DUPFD_CLOEXEC);
+	CASERETURN(F_GETNOSIGPIPE);
+	CASERETURN(F_SETNOSIGPIPE);
+	default:
+		return NULL;
+	}
+}
+
+static const char *
+sockproto(register_t proto)
+{
+	switch (proto) {
+	CASERETURN(IPPROTO_IP);
+	CASERETURN(IPPROTO_ICMP);
+	CASERETURN(IPPROTO_IGMP);
+	CASERETURN(IPPROTO_GGP);
+//	CASERETURN(IPPROTO_IPV4);
+	CASERETURN(IPPROTO_IPIP);
+	CASERETURN(IPPROTO_TCP);
+	CASERETURN(IPPROTO_EGP);
+	CASERETURN(IPPROTO_PUP);
+	CASERETURN(IPPROTO_UDP);
+	CASERETURN(IPPROTO_IDP);
+	CASERETURN(IPPROTO_TP);
+	CASERETURN(IPPROTO_DCCP);
+	CASERETURN(IPPROTO_IPV6);
+	CASERETURN(IPPROTO_ROUTING);
+	CASERETURN(IPPROTO_FRAGMENT);
+	CASERETURN(IPPROTO_RSVP);
+	CASERETURN(IPPROTO_GRE);
+	CASERETURN(IPPROTO_ESP);
+	CASERETURN(IPPROTO_AH);
+	CASERETURN(IPPROTO_MOBILE);
+//	CASERETURN(IPPROTO_IPV6_ICMP);
+	CASERETURN(IPPROTO_ICMPV6);
+	CASERETURN(IPPROTO_NONE);
+	CASERETURN(IPPROTO_DSTOPTS);
+	CASERETURN(IPPROTO_EON);
+	CASERETURN(IPPROTO_ETHERIP);
+	CASERETURN(IPPROTO_ENCAP);
+	CASERETURN(IPPROTO_PIM);
+	CASERETURN(IPPROTO_IPCOMP);
+	CASERETURN(IPPROTO_VRRP);
+//	CASERETURN(IPPROTO_CARP);
+	CASERETURN(IPPROTO_L2TP);
+	CASERETURN(IPPROTO_SCTP);
+	CASERETURN(IPPROTO_PFSYNC);
+	CASERETURN(IPPROTO_RAW);
+	CASERETURN(IPPROTO_MAX);
+	CASERETURN(IPPROTO_DONE);
+	CASERETURN(SOL_SOCKET);
+	default:
+		return NULL;
+	}
+}
+
+static const char *
+sockoptname(register_t optname)
+{
+	switch (optname) {
+	CASERETURN(SO_ACCEPTCONN);
+	CASERETURN(SO_ACCEPTFILTER);
+	CASERETURN(SO_BROADCAST);
+	CASERETURN(SO_DEBUG);
+	CASERETURN(SO_DONTROUTE);
+	CASERETURN(SO_ERROR);
+	CASERETURN(SO_KEEPALIVE);
+	CASERETURN(SO_LINGER);
+	CASERETURN(SO_NOHEADER);
+	CASERETURN(SO_NOSIGPIPE);
+	CASERETURN(SO_OOBINLINE);
+	CASERETURN(SO_OVERFLOWED);
+	CASERETURN(SO_RCVBUF);
+	CASERETURN(SO_RCVLOWAT);
+	CASERETURN(SO_RCVTIMEO);
+	CASERETURN(SO_RERROR);
+	CASERETURN(SO_REUSEADDR);
+	CASERETURN(SO_REUSEPORT);
+	CASERETURN(SO_SNDBUF);
+	CASERETURN(SO_SNDLOWAT);
+	CASERETURN(SO_SNDTIMEO);
+	CASERETURN(SO_TIMESTAMP);
+	CASERETURN(SO_TYPE);
+	CASERETURN(SO_USELOOPBACK);
+	default:
+		return NULL;
+	}
+}
+
+static const char *
+tcpoptname(register_t optname)
+{
+	switch (optname) {
+	CASERETURN(TCP_NODELAY);
+	CASERETURN(TCP_MAXSEG);
+	CASERETURN(TCP_MD5SIG);
+	CASERETURN(TCP_KEEPIDLE);
+	CASERETURN(TCP_KEEPINTVL);
+	CASERETURN(TCP_KEEPCNT);
+	CASERETURN(TCP_KEEPINIT);
+	CASERETURN(TCP_INFO);
+	default:
+		return NULL;
+	}
+}
+
+static const char *
+ipoptname(register_t optname)
+{
+	switch (optname) {
+	CASERETURN(IP_OPTIONS);
+	CASERETURN(IP_HDRINCL);
+	CASERETURN(IP_TOS);
+	CASERETURN(IP_TTL);
+	CASERETURN(IP_RECVOPTS);
+	CASERETURN(IP_RECVRETOPTS);
+	CASERETURN(IP_RECVDSTADDR);
+	CASERETURN(IP_RETOPTS);
+	CASERETURN(IP_MULTICAST_IF);
+	CASERETURN(IP_MULTICAST_TTL);
+	CASERETURN(IP_MULTICAST_LOOP);
+	CASERETURN(IP_ADD_MEMBERSHIP);
+	CASERETURN(IP_DROP_MEMBERSHIP);
+	CASERETURN(IP_PORTALGO);
+	CASERETURN(IP_PORTRANGE);
+	CASERETURN(IP_RECVIF);
+	CASERETURN(IP_ERRORMTU);
+	CASERETURN(IP_IPSEC_POLICY);
+	CASERETURN(IP_RECVTTL);
+	CASERETURN(IP_MINTTL);
+	CASERETURN(IP_PKTINFO);
+	CASERETURN(IP_RECVPKTINFO);
+	CASERETURN(IP_BINDANY);
 	default:
 		return NULL;
 	}
@@ -580,6 +714,11 @@ ioctldecode(u_long cmd)
 	char dirbuf[4], *dir = dirbuf;
 	int c;
 
+	if (~0xffffffffULL & cmd) {
+		output_long(cmd, 1);
+		return;
+	}
+
 	if (cmd & IOC_IN)
 		*dir++ = 'W';
 	if (cmd & IOC_OUT)
@@ -633,25 +772,24 @@ putprot(int pr)
 static const char *
 futex_op_name(u_long op)
 {
-#define	FUTEXCASE(a)	case a:	return # a
 	switch (op & FUTEX_CMD_MASK) {
-	FUTEXCASE(FUTEX_WAIT);
-	FUTEXCASE(FUTEX_WAKE);
-	FUTEXCASE(FUTEX_FD);
-	FUTEXCASE(FUTEX_REQUEUE);
-	FUTEXCASE(FUTEX_CMP_REQUEUE);
-	FUTEXCASE(FUTEX_WAKE_OP);
-	FUTEXCASE(FUTEX_LOCK_PI);
-	FUTEXCASE(FUTEX_UNLOCK_PI);
-	FUTEXCASE(FUTEX_TRYLOCK_PI);
-	FUTEXCASE(FUTEX_WAIT_BITSET);
-	FUTEXCASE(FUTEX_WAKE_BITSET);
-	FUTEXCASE(FUTEX_WAIT_REQUEUE_PI);
-	FUTEXCASE(FUTEX_CMP_REQUEUE_PI);
+	CASERETURN(FUTEX_WAIT);
+	CASERETURN(FUTEX_WAKE);
+	CASERETURN(FUTEX_FD);
+	CASERETURN(FUTEX_REQUEUE);
+	CASERETURN(FUTEX_CMP_REQUEUE);
+	CASERETURN(FUTEX_WAKE_OP);
+	CASERETURN(FUTEX_LOCK_PI);
+	CASERETURN(FUTEX_UNLOCK_PI);
+	CASERETURN(FUTEX_TRYLOCK_PI);
+	CASERETURN(FUTEX_WAIT_BITSET);
+	CASERETURN(FUTEX_WAKE_BITSET);
+	CASERETURN(FUTEX_WAIT_REQUEUE_PI);
+	CASERETURN(FUTEX_CMP_REQUEUE_PI);
 	default:
 		return NULL;
 	}
-#undef FUTEXCASE
+#undef CASERETURN
 }
 
 static void
@@ -754,14 +892,58 @@ ktrsyscall(struct ktr_syscall *ktr)
 			argcount--;
 			c = ',';
 
+		} else if ((strcmp(sys_name, "setsockopt") == 0 ||
+		    strcmp(sys_name, "getsockopt") == 0 ||
+		    strcmp(sys_name, "getsockopt2") == 0) && argcount >= 3) {
+			(void)putchar('(');
+			output_long((long)*ap, !(decimal || small(*ap)));
+			ap++;
+			argcount--;
+			register_t level = *ap;
+			fprintf(stderr, "level=%jx\n", (intmax_t)level);
+			if ((cp = sockproto(level)) != NULL) {
+				(void)printf(",%s", cp);
+			} else {
+				output_long((long)*ap,
+				    !(decimal || small(*ap)));
+			}
+			ap++;
+			argcount--;
+			const char *(*f)(register_t);
+			switch (level) {
+			case SOL_SOCKET:
+				f = sockoptname;
+				break;
+			case IPPROTO_IP:
+				f = ipoptname;
+				break;
+			case IPPROTO_TCP:
+				f = tcpoptname;
+				break;
+			default:
+				f = NULL;
+				break;
+			}
+
+			if (f && (cp = (*f)(*ap)) != NULL)
+				(void)printf(",%s", cp);
+			else {
+				(void)putchar(',');
+				output_long((long)*ap,
+				    !(decimal || small(*ap)));
+			}
+			ap++;
+			argcount--;
+			c = ',';
+
+		} else if ((strcmp(sys_name, "futex") == 0 ||
+			    strcmp(sys_name, "__futex") == 0) &&
+			   argcount > 2) {
 			/*
 			 * Linux name is "futex".
 			 * Native name is "__futex".
 			 * Both have the same op argument.
 			 */
-		} else if ((strcmp(sys_name, "futex") == 0 ||
-			    strcmp(sys_name, "__futex") == 0) &&
-			   argcount > 2) {
 			(void)putchar('(');
 			output_long((long)*ap, 1);
 			(void)putchar(',');

Reply via email to