Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Sep 2013 18:08:25 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r255493 - in head/usr.bin: kdump truss
Message-ID:  <201309121808.r8CI8P7m006557@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Thu Sep 12 18:08:25 2013
New Revision: 255493
URL: http://svnweb.freebsd.org/changeset/base/255493

Log:
  - Decode the idtype argument passed to wait6() in kdump and truss.
  - Don't treat an options argument of 0 to wait4() as an error in
    kdump.
  - Decode the wait options passed to wait4() and wait6() in truss
    and decode the returned rusage and exit status.
  
  Approved by:	re (kib)
  MFC after:	1 week

Modified:
  head/usr.bin/kdump/kdump.c
  head/usr.bin/kdump/mksubr
  head/usr.bin/truss/syscall.h
  head/usr.bin/truss/syscalls.c

Modified: head/usr.bin/kdump/kdump.c
==============================================================================
--- head/usr.bin/kdump/kdump.c	Thu Sep 12 18:03:51 2013	(r255492)
+++ head/usr.bin/kdump/kdump.c	Thu Sep 12 18:08:25 2013	(r255493)
@@ -59,6 +59,7 @@ extern int errno;
 #include <sys/sysent.h>
 #include <sys/un.h>
 #include <sys/queue.h>
+#include <sys/wait.h>
 #ifdef IPX
 #include <sys/types.h>
 #include <netipx/ipx.h>
@@ -666,8 +667,30 @@ ktrsyscall(struct ktr_syscall *ktr, u_in
 			case SYS_wait4:
 				print_number(ip, narg, c);
 				print_number(ip, narg, c);
+				/*
+				 * A flags value of zero is valid for
+				 * wait4() but not for wait6(), so
+				 * handle zero special here.
+				 */
+				if (*ip == 0) {
+					print_number(ip, narg, c);
+				} else {
+					putchar(',');
+					wait6optname(*ip);
+					ip++;
+					narg--;
+				}
+				break;
+			case SYS_wait6:
+				putchar('(');
+				idtypename(*ip, decimal);
+				c = ',';
+				ip++;
+				narg--;
+				print_number(ip, narg, c);
+				print_number(ip, narg, c);
 				putchar(',');
-				wait4optname(*ip);
+				wait6optname(*ip);
 				ip++;
 				narg--;
 				break;

Modified: head/usr.bin/kdump/mksubr
==============================================================================
--- head/usr.bin/kdump/mksubr	Thu Sep 12 18:03:51 2013	(r255492)
+++ head/usr.bin/kdump/mksubr	Thu Sep 12 18:08:25 2013	(r255493)
@@ -327,6 +327,68 @@ flagsandmodename(int flags, int mode, in
 	}
 }
 
+/* MANUAL */
+void
+idtypename(idtype_t idtype, int decimal)
+{
+	switch(idtype) {
+	case P_PID:
+		printf("P_PID");
+		break;
+	case P_PPID:
+		printf("P_PPID");
+		break;
+	case P_PGID:
+		printf("P_PGID");
+		break;
+	case P_SID:
+		printf("P_SID");
+		break;
+	case P_CID:
+		printf("P_CID");
+		break;
+	case P_UID:
+		printf("P_UID");
+		break;
+	case P_GID:
+		printf("P_GID");
+		break;
+	case P_ALL:
+		printf("P_ALL");
+		break;
+	case P_LWPID:
+		printf("P_LWPID");
+		break;
+	case P_TASKID:
+		printf("P_TASKID");
+		break;
+	case P_PROJID:
+		printf("P_PROJID");
+		break;
+	case P_POOLID:
+		printf("P_POOLID");
+		break;
+	case P_JAILID:
+		printf("P_JAILID");
+		break;
+	case P_CTID:
+		printf("P_CTID");
+		break;
+	case P_CPUID:
+		printf("P_CPUID");
+		break;
+	case P_PSETID:
+		printf("P_PSETID");
+		break;
+	default:
+		if (decimal) {
+			printf("%d", idtype);
+		} else {
+			printf("%#x", idtype);
+		}
+	}
+}
+
 /*
  * MANUAL
  *
@@ -426,7 +488,7 @@ auto_switch_type "sockoptname"         "
 auto_switch_type "socktypename"        "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*"          "sys/socket.h"
 auto_or_type     "thrcreateflagsname"  "THR_[A-Z]+[[:space:]]+0x[0-9]+"               "sys/thr.h"
 auto_switch_type "vmresultname"        "KERN_[A-Z]+[[:space:]]+[0-9]+"                "vm/vm_param.h"
-auto_or_type     "wait4optname"        "W[A-Z]+[[:space:]]+[0-9]+"                    "sys/wait.h"
+auto_or_type     "wait6optname"        "W[A-Z]+[[:space:]]+[0-9]+"                    "sys/wait.h"
 auto_switch_type "whencename"          "SEEK_[A-Z]+[[:space:]]+[0-9]+"                "sys/unistd.h"
 
 cat <<_EOF_

Modified: head/usr.bin/truss/syscall.h
==============================================================================
--- head/usr.bin/truss/syscall.h	Thu Sep 12 18:03:51 2013	(r255492)
+++ head/usr.bin/truss/syscall.h	Thu Sep 12 18:08:25 2013	(r255493)
@@ -40,7 +40,7 @@ enum Argtype { None = 1, Hex, Octal, Int
 	Fd_set, Sigaction, Fcntl, Mprot, Mmapflags, Whence, Readlinkres,
 	Umtx, Sigset, Sigprocmask, Kevent, Sockdomain, Socktype, Open,
 	Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
-	Pathconf, Rforkflags };
+	Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype };
 
 #define	ARG_MASK	0xff
 #define	OUT	0x100

Modified: head/usr.bin/truss/syscalls.c
==============================================================================
--- head/usr.bin/truss/syscalls.c	Thu Sep 12 18:03:51 2013	(r255492)
+++ head/usr.bin/truss/syscalls.c	Thu Sep 12 18:08:25 2013	(r255493)
@@ -39,12 +39,13 @@ static const char rcsid[] =
  * arguments.
  */
 
-#include <sys/mman.h>
 #include <sys/types.h>
+#include <sys/mman.h>
 #include <sys/ptrace.h>
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/un.h>
+#include <sys/wait.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/ioccom.h>
@@ -263,6 +264,12 @@ static struct syscall syscalls[] = {
 	  .args = { { Name , 0 } , { Name, 1 } } },
 	{ .name = "posix_openpt", .ret_type = 1, .nargs = 1,
 	  .args = { { Open, 0 } } },
+	{ .name = "wait4", .ret_type = 1, .nargs = 4,
+	  .args = { { Int, 0 }, { ExitStatus | OUT, 1 }, { Waitoptions, 2 },
+		    { Rusage | OUT, 3 } } },
+	{ .name = "wait6", .ret_type = 1, .nargs = 6,
+	  .args = { { Idtype, 0 }, { Int, 1 }, { ExitStatus | OUT, 2 },
+		    { Waitoptions, 3 }, { Rusage | OUT, 4 }, { Ptr, 5 } } },
 	{ .name = 0 },
 };
 
@@ -381,6 +388,17 @@ static struct xlat rfork_flags[] = {
 	X(RFSIGSHARE) X(RFTSIGZMB) X(RFLINUXTHPN) XEND
 };
 
+static struct xlat wait_options[] = {
+	X(WNOHANG) X(WUNTRACED) X(WCONTINUED) X(WNOWAIT) X(WEXITED)
+	X(WTRAPPED) XEND
+};
+
+static struct xlat idtype_arg[] = {
+	X(P_PID) X(P_PPID) X(P_PGID) X(P_SID) X(P_CID) X(P_UID) X(P_GID)
+	X(P_ALL) X(P_LWPID) X(P_TASKID) X(P_PROJID) X(P_POOLID) X(P_JAILID)
+	X(P_CTID) X(P_CPUID) X(P_PSETID) XEND
+};
+
 #undef X
 #undef XEND
 
@@ -537,6 +555,16 @@ get_string(pid_t pid, void *offset, int 
 	}
 }
 
+static char *
+strsig2(int sig)
+{
+	char *tmp;
+
+	tmp = strsig(sig);
+	if (tmp == NULL)
+		asprintf(&tmp, "%d", sig);
+	return (tmp);
+}
 
 /*
  * print_arg
@@ -822,19 +850,14 @@ print_arg(struct syscall_args *sc, unsig
 		free(fds);
 		break;
 	}
-	case Signal: {
-		long sig;
-
-		sig = args[sc->offset];
-		tmp = strsig(sig);
-		if (tmp == NULL)
-			asprintf(&tmp, "%ld", sig);
+	case Signal:
+		tmp = strsig2(args[sc->offset]);
 		break;
-	}
 	case Sigset: {
 		long sig;
 		sigset_t ss;
 		int i, used;
+		char *signame;
 
 		sig = args[sc->offset];
 		if (get_struct(pid, (void *)args[sc->offset], (void *)&ss,
@@ -845,8 +868,11 @@ print_arg(struct syscall_args *sc, unsig
 		tmp = malloc(sys_nsig * 8); /* 7 bytes avg per signal name */
 		used = 0;
 		for (i = 1; i < sys_nsig; i++) {
-			if (sigismember(&ss, i))
-				used += sprintf(tmp + used, "%s|", strsig(i));
+			if (sigismember(&ss, i)) {
+				signame = strsig(i);
+				used += sprintf(tmp + used, "%s|", signame);
+				free(signame);
+			}
 		}
 		if (used)
 			tmp[used-1] = 0;
@@ -1143,6 +1169,35 @@ print_arg(struct syscall_args *sc, unsig
 			asprintf(&tmp, "0x%lx", args[sc->offset]);
 		break;
 	}
+	case ExitStatus: {
+		char *signame;
+		int status;
+		signame = NULL;
+		if (get_struct(pid, (void *)args[sc->offset], &status,
+		    sizeof(status)) != -1) {
+			if (WIFCONTINUED(status))
+				tmp = strdup("{ CONTINUED }");
+			else if (WIFEXITED(status))
+				asprintf(&tmp, "{ EXITED,val=%d }",
+				    WEXITSTATUS(status));
+			else if (WIFSIGNALED(status))
+				asprintf(&tmp, "{ SIGNALED,sig=%s%s }",
+				    signame = strsig2(WTERMSIG(status)),
+				    WCOREDUMP(status) ? ",cored" : "");
+			else
+				asprintf(&tmp, "{ STOPPED,sig=%s }",
+				    signame = strsig2(WTERMSIG(status)));
+		} else
+			asprintf(&tmp, "0x%lx", args[sc->offset]);
+		free(signame);
+		break;
+	}
+	case Waitoptions:
+		tmp = strdup(xlookup_bits(wait_options, args[sc->offset]));
+		break;
+	case Idtype:
+		tmp = strdup(xlookup(idtype_arg, args[sc->offset]));
+		break;
 	default:
 		errx(1, "Invalid argument type %d\n", sc->type & ARG_MASK);
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309121808.r8CI8P7m006557>