usr/src/cmd/truss/actions.c
author Casper H.S. Dik <Casper.Dik@Sun.COM>
Wed, 28 Apr 2010 10:01:37 +0200
changeset 12273 63678502e95e
parent 11798 1e7f1f154004
child 12689 9955c9d6e349
permissions -rw-r--r--
PSARC 2009/377 In-kernel pfexec implementation. PSARC 2009/378 Basic File Privileges PSARC 2010/072 RBAC update: user attrs from profiles 4912090 pfzsh(1) should exist 4912093 pfbash(1) should exist 4912096 pftcsh(1) should exist 6440298 Expand the basic privilege set in order to restrict file access 6859862 Move pfexec into the kernel 6919171 cred_t sidesteps kmem_debug; we need to be able to detect bad hold/free when they occur 6923721 The new SYS_SMB privilege is not backward compatible 6937562 autofs doesn't remove its door when the zone shuts down 6937727 Zones stuck on deathrow; netstack_zone keeps a credential reference to the zone 6940159 Implement PSARC 2010/072
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
     5
 * Common Development and Distribution License (the "License").
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
12273
63678502e95e PSARC 2009/377 In-kernel pfexec implementation.
Casper H.S. Dik <Casper.Dik@Sun.COM>
parents: 11798
diff changeset
    23
 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <memory.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/stack.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/isa_defs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <libproc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <priv.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include "ramdata.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include "systable.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include "print.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include "proto.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * Actions to take when process stops.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * Function prototypes for static routines in this module.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
int	stopsig(private_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
void	showpaths(private_t *, const struct systable *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
void	showargs(private_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
void	dumpargs(private_t *, long, const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * Report an lwp to be sleeping (if true).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
report_sleeping(private_t *pri, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	int sys = Lsp->pr_syscall;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	if (!prismember(&trace, sys) || !dotrace ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	    !(Lsp->pr_flags & (PR_ASLEEP|PR_VFORKP))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
		/* Make sure we catch sysexit even if we're not tracing it. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
		(void) Psysexit(Proc, sys, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	pri->Errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	pri->ErrPriv = PRIV_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	pri->Rval1 = pri->Rval2 = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	(void) sysentry(pri, dotrace);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	make_pname(pri, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	pri->length += printf("%s", pri->sys_string);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	pri->sys_leng = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	*pri->sys_string = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	pri->length >>= 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	if (Lsp->pr_flags & PR_VFORKP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		pri->length += 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	if (pri->length >= 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		(void) fputc(' ', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	for (; pri->length < 4; pri->length++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		(void) fputc('\t', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	if (Lsp->pr_flags & PR_VFORKP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		(void) fputs("(waiting for child to exit()/exec()...)\n",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
    96
		    stdout);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		(void) fputs("(sleeping...)\n", stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	if (prismember(&verbose, sys)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		int raw = prismember(&rawout, sys);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		pri->Errno = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		expound(pri, 0, raw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		pri->Errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	Flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 * requested() gets called for these reasons:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 *	flag == JOBSIG:		report nothing; change state to JOBSTOP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 *	flag == JOBSTOP:	report "Continued ..."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 *	default:		report sleeping system call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
 * It returns a new flag:  JOBSTOP or SLEEPING or 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
requested(private_t *pri, int flag, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	int sig = Lsp->pr_cursig;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	int newflag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	switch (flag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	case JOBSIG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
		return (JOBSTOP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	case JOBSTOP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		if (dotrace && !cflag && prismember(&signals, sig)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
			pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
			putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
			timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
			(void) printf("    Continued with signal #%d, %s",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   134
			    sig, signame(pri, sig));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
			if (Lsp->pr_action.sa_handler == SIG_DFL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
				(void) printf(" [default]");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			else if (Lsp->pr_action.sa_handler == SIG_IGN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
				(void) printf(" [ignored]");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
				(void) printf(" [caught]");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
			(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
			Flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		newflag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		newflag = SLEEPING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		if (!cflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
			report_sleeping(pri, dotrace);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	return (newflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
jobcontrol(private_t *pri, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	int sig = stopsig(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	if (sig == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	if (dotrace && !cflag &&		/* not just counting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	    prismember(&signals, sig)) {	/* tracing this signal */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		int sys;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		(void) printf("    Stopped by signal #%d, %s",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   174
		    sig, signame(pri, sig));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		if ((Lsp->pr_flags & PR_ASLEEP) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		    (sys = Lsp->pr_syscall) > 0 && sys <= PRMAXSYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
			(void) printf(", in %s()",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   178
			    sysname(pri, sys, getsubcode(pri)));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		Flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	return (JOBSTOP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 * Return the signal the process stopped on iff process is already stopped on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * PR_JOBCONTROL or is stopped on PR_SIGNALLED or PR_REQUESTED with a current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * signal that will cause a JOBCONTROL stop when the process is set running.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
stopsig(private_t *pri)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	int sig = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	if (Lsp->pr_flags & PR_STOPPED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
		switch (Lsp->pr_why) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		case PR_JOBCONTROL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
			sig = Lsp->pr_what;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
			if (sig < 0 || sig > PRMAXSIG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
				sig = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
		case PR_SIGNALLED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
		case PR_REQUESTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
			if (Lsp->pr_action.sa_handler == SIG_DFL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
				switch (Lsp->pr_cursig) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
				case SIGSTOP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
					sig = SIGSTOP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
				case SIGTSTP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
				case SIGTTIN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
				case SIGTTOU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
					if (!(Lsp->pr_flags & PR_ORPHAN))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
						sig = Lsp->pr_cursig;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	return (sig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
signalled(private_t *pri, int flag, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	int sig = Lsp->pr_what;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	if (sig <= 0 || sig > PRMAXSIG)	/* check bounds */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	if (dotrace && cflag) {			/* just counting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		(void) mutex_lock(&count_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		Cp->sigcount[sig]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		(void) mutex_unlock(&count_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	if (sig == SIGCONT && (flag == JOBSIG || flag == JOBSTOP))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		flag = requested(pri, JOBSTOP, dotrace);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	else if ((flag = jobcontrol(pri, dotrace)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	    !cflag && dotrace &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	    prismember(&signals, sig)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		int sys;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		(void) printf("    Received signal #%d, %s",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   252
		    sig, signame(pri, sig));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		if ((Lsp->pr_flags & PR_ASLEEP) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		    (sys = Lsp->pr_syscall) > 0 && sys <= PRMAXSYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			(void) printf(", in %s()",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   256
			    sysname(pri, sys, getsubcode(pri)));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		if (Lsp->pr_action.sa_handler == SIG_DFL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			(void) printf(" [default]");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		else if (Lsp->pr_action.sa_handler == SIG_IGN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
			(void) printf(" [ignored]");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			(void) printf(" [caught]");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		if (Lsp->pr_info.si_code != 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		    Lsp->pr_info.si_pid != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
			print_siginfo(pri, &Lsp->pr_info);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		Flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	if (flag == JOBSTOP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		flag = JOBSIG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	return (flag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
faulted(private_t *pri, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	int flt = Lsp->pr_what;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	if ((uint_t)flt > PRMAXFAULT || !prismember(&faults, flt) || !dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	(void) mutex_lock(&count_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	Cp->fltcount[flt]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	(void) mutex_unlock(&count_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	if (cflag)		/* just counting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	(void) printf("    Incurred fault #%d, %s  %%pc = 0x%.8lX",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   296
	    flt, proc_fltname(flt, pri->flt_name, sizeof (pri->flt_name)),
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   297
	    (long)Lsp->pr_reg[R_PC]);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	if (flt == FLTPAGE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		(void) printf("  addr = 0x%.8lX",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   301
		    (long)Lsp->pr_info.si_addr);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	if (Lsp->pr_info.si_signo != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		print_siginfo(pri, &Lsp->pr_info);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	Flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
 * Set up pri->sys_nargs and pri->sys_args[] (syscall args).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
setupsysargs(private_t *pri, int what)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	int nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
#if sparc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	/* determine whether syscall is indirect */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	pri->sys_indirect = (Lsp->pr_reg[R_G1] == SYS_syscall)? 1 : 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	pri->sys_indirect = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	(void) memset(pri->sys_args, 0, sizeof (pri->sys_args));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	if (what != Lsp->pr_syscall) {	/* assertion */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		(void) printf("%s\t*** Inconsistent syscall: %d vs %d ***\n",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   329
		    pri->pname, what, Lsp->pr_syscall);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	nargs = Lsp->pr_nsysarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	for (i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	    i < nargs && i < sizeof (pri->sys_args) / sizeof (pri->sys_args[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	    i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		pri->sys_args[i] = Lsp->pr_sysarg[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	pri->sys_nargs = nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
#define	ISREAD(code) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	((code) == SYS_read || (code) == SYS_pread || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	(code) == SYS_pread64 || (code) == SYS_readv || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	(code) == SYS_recv || (code) == SYS_recvfrom)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
#define	ISWRITE(code) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	((code) == SYS_write || (code) == SYS_pwrite || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	(code) == SYS_pwrite64 || (code) == SYS_writev || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	(code) == SYS_send || (code) == SYS_sendto)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
 * Return TRUE iff syscall is being traced.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
sysentry(private_t *pri, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	pid_t pid = Pstatus(Proc)->pr_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	long arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	int nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	int x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	char *s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	const struct systable *stp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	int what = Lsp->pr_what;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	int subcode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	int istraced;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	int raw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	/* for reporting sleeping system calls */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	if (what == 0 && (Lsp->pr_flags & (PR_ASLEEP|PR_VFORKP)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		what = Lsp->pr_syscall;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	/* protect ourself from operating system error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	if (what <= 0 || what > PRMAXSYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		what = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	 * Set up the system call arguments (pri->sys_nargs & pri->sys_args[]).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	setupsysargs(pri, what);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	nargs = pri->sys_nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	/* get systable entry for this syscall */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	subcode = getsubcode(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	stp = subsys(what, subcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	if (nargs > stp->nargs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		nargs = stp->nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	pri->sys_nargs = nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   390
	/*
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   391
	 * Fetch and remember first argument if it's a string,
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   392
	 * or second argument if SYS_openat or SYS_openat64.
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   393
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	pri->sys_valid = FALSE;
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   395
	if ((nargs > 0 && stp->arg[0] == STG) ||
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   396
	    (nargs > 1 && (what == SYS_openat || what == SYS_openat64))) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		long offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		uint32_t offset32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		 * Special case for exit from exec().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		 * The address in pri->sys_args[0] refers to the old process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		 * image.  We must fetch the string from the new image.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		 */
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   405
		if (Lsp->pr_why == PR_SYSEXIT && what == SYS_execve) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
			psinfo_t psinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
			long argv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
			auxv_t auxv[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			int naux;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
			offset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			naux = proc_get_auxv(pid, auxv, 32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			for (i = 0; i < naux; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
				if (auxv[i].a_type == AT_SUN_EXECNAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
					offset = (long)auxv[i].a_un.a_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
			if (offset == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
			    proc_get_psinfo(pid, &psinfo) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
				argv = (long)psinfo.pr_argv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
				if (data_model == PR_MODEL_LP64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
					(void) Pread(Proc, &offset,
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   424
					    sizeof (offset), argv);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
				else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
					offset32 = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
					(void) Pread(Proc, &offset32,
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   428
					    sizeof (offset32), argv);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
					offset = offset32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
			}
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   432
		} else if (stp->arg[0] == STG) {
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   433
			offset = pri->sys_args[0];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		} else {
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   435
			offset = pri->sys_args[1];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		if ((s = fetchstring(pri, offset, PATH_MAX)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
			pri->sys_valid = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
			len = strlen(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
			/* reallocate if necessary */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
			while (len >= pri->sys_psize) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
				free(pri->sys_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
				pri->sys_path = my_malloc(pri->sys_psize *= 2,
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   444
				    "pathname buffer");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
			(void) strcpy(pri->sys_path, s); /* remember pathname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	istraced = dotrace && prismember(&trace, what);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	raw = prismember(&rawout, what);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	/* force tracing of read/write buffer dump syscalls */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	if (!istraced && nargs > 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		int fdp1 = (int)pri->sys_args[0] + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		if (ISREAD(what)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
			if (prismember(&readfd, fdp1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
				istraced = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		} else if (ISWRITE(what)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
			if (prismember(&writefd, fdp1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
				istraced = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	pri->sys_leng = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	if (cflag || !istraced)		/* just counting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		*pri->sys_string = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		int argprinted = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
		const char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   473
		name = sysname(pri, what, raw? -1 : subcode);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		grow(pri, strlen(name) + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		pri->sys_leng = snprintf(pri->sys_string, pri->sys_ssize,
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   476
		    "%s(", name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		for (i = 0; i < nargs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
			arg = pri->sys_args[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			x = stp->arg[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   481
			if (!raw && pri->sys_valid &&
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   482
			    ((i == 0 && x == STG) ||
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   483
			    (i == 1 && (what == SYS_openat ||
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   484
			    what == SYS_openat64)))) {	/* already fetched */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
				escape_string(pri, pri->sys_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
				argprinted = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
			} else if (x != HID || raw) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
				if (argprinted)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
					outstring(pri, ", ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
				if (x == LLO)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
					(*Print[x])(pri, raw, arg,
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   492
					    pri->sys_args[++i]);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
					(*Print[x])(pri, raw, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
				 * if nothing printed, then don't print ", "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
				if (x == NOV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
					argprinted = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
					argprinted = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
		outstring(pri, ")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	return (istraced);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
#undef	ISREAD
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
#undef	ISWRITE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
 * sysexit() returns non-zero if anything was printed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
sysexit(private_t *pri, int dotrace)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	int what = Lsp->pr_what;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	struct syscount *scp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	const struct systable *stp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	int subcode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	int istraced;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	int raw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	/* protect ourself from operating system error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	if (what <= 0 || what > PRMAXSYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	 * If we aren't supposed to be tracing this one, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	 * delete it from the traced signal set.  We got here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	 * because the process was sleeping in an untraced syscall.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	if (!prismember(&traceeven, what)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
		(void) Psysexit(Proc, what, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	/* pick up registers & set pri->Errno before anything else */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	pri->Errno = Lsp->pr_errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	pri->ErrPriv = Lsp->pr_errpriv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	pri->Rval1 = Lsp->pr_rval1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	pri->Rval2 = Lsp->pr_rval2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	switch (what) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	case SYS_exit:		/* these are traced on entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	case SYS_lwp_exit:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	case SYS_context:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		istraced = dotrace && prismember(&trace, what);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		break;
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   552
	case SYS_execve:	/* this is normally traced on entry */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
		istraced = dotrace && prismember(&trace, what);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		if (pri->exec_string && *pri->exec_string) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
			if (!cflag && istraced) { /* print exec() string now */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
				if (pri->exec_pname[0] != '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
					(void) fputs(pri->exec_pname, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
				timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
				(void) fputs(pri->exec_string, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
			pri->exec_pname[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
			pri->exec_string[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		/* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
		/* we called sysentry() in main() for these */
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   568
		if (what == SYS_openat || what == SYS_openat64 ||
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   569
		    what == SYS_open || what == SYS_open64)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
			istraced = dotrace && prismember(&trace, what);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			istraced = sysentry(pri, dotrace) && dotrace;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		if (!cflag && istraced) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
			putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			timestamp(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			pri->length += printf("%s", pri->sys_string);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
		pri->sys_leng = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
		*pri->sys_string = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	/* get systable entry for this syscall */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	subcode = getsubcode(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	stp = subsys(what, subcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	if (cflag && istraced) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		(void) mutex_lock(&count_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		scp = Cp->syscount[what];
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   591
		if (what == SYS_forksys && subcode >= 3)
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   592
			scp += subcode - 3;
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   593
		else if (subcode != -1 &&
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   594
		    (what != SYS_openat && what != SYS_openat64 &&
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   595
		    what != SYS_open && what != SYS_open64 &&
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		    what != SYS_lwp_create))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			scp += subcode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		scp->count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		accumulate(&scp->stime, &Lsp->pr_stime, &pri->syslast);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		accumulate(&Cp->usrtotal, &Lsp->pr_utime, &pri->usrlast);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		pri->syslast = Lsp->pr_stime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
		pri->usrlast = Lsp->pr_utime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
		(void) mutex_unlock(&count_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   606
	raw = prismember(&rawout, what);
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   607
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	if (!cflag && istraced) {
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   609
		if ((what == SYS_vfork || what == SYS_forksys) &&
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
		    pri->Errno == 0 && pri->Rval2 != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
			pri->length &= ~07;
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   612
			if (strlen(sysname(pri, what, raw? -1 : subcode)) < 6) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
				(void) fputc('\t', stdout);
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   614
				pri->length += 8;
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 328
diff changeset
   615
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
			pri->length +=
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   617
			    7 + printf("\t(returning as child ...)");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
		if (what == SYS_lwp_create &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
		    pri->Errno == 0 && pri->Rval1 == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
			pri->length &= ~07;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
			pri->length +=
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   623
			    7 + printf("\t(returning as new lwp ...)");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
		}
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   625
		if (pri->Errno != 0 || what != SYS_execve) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
			/* prepare to print the return code */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
			pri->length >>= 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
			if (pri->length >= 6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
				(void) fputc(' ', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
			for (; pri->length < 6; pri->length++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
				(void) fputc('\t', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	if (pri->Errno != 0) {		/* error in syscall */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
		if (istraced) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			if (cflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
				scp->error++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
				const char *ename = errname(pri->Errno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
				const char *privname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
				(void) printf("Err#%d", pri->Errno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
				if (ename != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
					(void) fputc(' ', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
					(void) fputs(ename, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
				switch (pri->ErrPriv) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
				case PRIV_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
					privname = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
				case PRIV_ALL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
					privname = "ALL";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
				case PRIV_MULTIPLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
					privname = "MULTIPLE";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
				case PRIV_ALLZONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
					privname = "ZONE";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
				default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
					privname = priv_getbynum(pri->ErrPriv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
				if (privname != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
					(void) printf(" [%s]", privname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
				(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		/* show arguments on successful exec */
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   674
		if (what == SYS_execve) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
			if (!cflag && istraced)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
				showargs(pri, raw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		} else if (!cflag && istraced) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
			const char *fmt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
			long rv1 = pri->Rval1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
			long rv2 = pri->Rval2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
			 * 32-bit system calls return 32-bit values. We
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
			 * later mask out the upper bits if we want to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
			 * print these as unsigned values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
			if (data_model == PR_MODEL_ILP32) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
				rv1 = (int)rv1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
				rv2 = (int)rv2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
			switch (what) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
			case SYS_llseek:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
				rv1 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
				rv2 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
#ifdef _LONG_LONG_LTOH	/* first long of a longlong is the low order */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
				if (rv2 != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
					long temp = rv1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
					fmt = "= 0x%lX%.8lX";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
					rv1 = rv2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
					rv2 = temp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
#else	/* the other way around */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
				if (rv1 != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
					fmt = "= 0x%lX%.8lX";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
				rv1 = rv2;	/* ugly */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
				/* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
			case SYS_lseek:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
			case SYS_ulimit:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
				if (rv1 & 0xff000000) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
					if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
						rv1 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
					fmt = "= 0x%.8lX";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
			case SYS_sigtimedwait:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
				if (raw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
					/* EMPTY */;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
				else if ((fmt = rawsigname(pri, rv1)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
					rv1 = (long)fmt;	/* filthy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
					fmt = "= %s";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
			case SYS_port:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
				if (data_model == PR_MODEL_LP64) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
					rv2 = rv1 & 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
					rv1 = rv1 >> 32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
			if (fmt == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
				switch (stp->rval[0]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
				case HEX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
					if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
						rv1 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
					fmt = "= 0x%.8lX";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
				case HHX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
					if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
						rv1 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
					fmt = "= 0x%.4lX";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
				case OCT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
					if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
						rv1 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
					fmt = "= %#lo";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
					break;
4321
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   765
				case UNS:
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   766
#ifdef _LP64
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   767
					if (data_model == PR_MODEL_ILP32)
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   768
						rv1 &= 0xffffffff;
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   769
#endif
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   770
					fmt = "= %lu";
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   771
					break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
				default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
					fmt = "= %ld";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
			(void) printf(fmt, rv1, rv2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
			switch (stp->rval[1]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
			case NOV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
				fmt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
			case HEX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
				if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
					rv2 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
				fmt = " [0x%.8lX]";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
			case HHX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
				if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
					rv2 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
				fmt = " [0x%.4lX]";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
			case OCT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
				if (data_model == PR_MODEL_ILP32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
					rv2 &= 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
				fmt = " [%#lo]";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
				break;
4321
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   805
			case UNS:
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   806
#ifdef _LP64
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   807
				if (data_model == PR_MODEL_ILP32)
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   808
					rv2 &= 0xffffffff;
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   809
#endif
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   810
				fmt = " [%lu]";
a8930ec16e52 PSARC 2007/064 Unified POSIX and Windows Credentials for Solaris
casper
parents: 3235
diff changeset
   811
				break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
				fmt = " [%ld]";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
			if (fmt != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
				(void) printf(fmt, rv2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
			(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   822
		if (what == SYS_vfork || what == SYS_forksys) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
			if (pri->Rval2 == 0)		/* child was created */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
				pri->child = pri->Rval1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
			else if (cflag && istraced)	/* this is the child */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
				scp->count--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
		if (what == SYS_lwp_create && pri->Rval1 == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
		    cflag && istraced)		/* this is the created lwp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
			scp->count--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
#define	ISREAD(code) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	((code) == SYS_read || (code) == SYS_pread || (code) == SYS_pread64 || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	(code) == SYS_recv || (code) == SYS_recvfrom)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
#define	ISWRITE(code) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	((code) == SYS_write || (code) == SYS_pwrite || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	(code) == SYS_pwrite64 || (code) == SYS_send || (code) == SYS_sendto)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	if (!cflag && istraced) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
		int fdp1 = (int)pri->sys_args[0] + 1; /* filedescriptor + 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
		if (raw) {
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   844
			if (what != SYS_execve)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
				showpaths(pri, stp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
			if (ISREAD(what) || ISWRITE(what)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
				if (pri->iob_buf[0] != '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
					(void) printf("%s     0x%.8lX: %s\n",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   849
					    pri->pname, pri->sys_args[1],
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   850
					    pri->iob_buf);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
		 * Show buffer contents for read()/pread() or write()/pwrite().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
		 * IOBSIZE bytes have already been shown;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		 * don't show them again unless there's more.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		if ((ISREAD(what) && pri->Errno == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
		    prismember(&readfd, fdp1)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
		    (ISWRITE(what) && prismember(&writefd, fdp1))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
			long nb = ISWRITE(what) ? pri->sys_args[2] : pri->Rval1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
			if (nb > IOBSIZE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
				/* enter region of lengthy output */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
				if (nb > MYBUFSIZ / 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
					Eserialize();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
				showbuffer(pri, pri->sys_args[1], nb);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
				/* exit region of lengthy output */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
				if (nb > MYBUFSIZ / 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
					Xserialize();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
#undef	ISREAD
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
#undef	ISWRITE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		 * Do verbose interpretation if requested.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
		 * If buffer contents for read or write have been requested and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
		 * this is a readv() or writev(), force verbose interpretation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		if (prismember(&verbose, what) ||
328
01eb04557a9e 6262586 truss should print data written/read for sendmsg/recvmsg
ja97890
parents: 0
diff changeset
   884
		    ((what == SYS_readv || what == SYS_recvmsg) &&
01eb04557a9e 6262586 truss should print data written/read for sendmsg/recvmsg
ja97890
parents: 0
diff changeset
   885
		    pri->Errno == 0 && prismember(&readfd, fdp1)) ||
01eb04557a9e 6262586 truss should print data written/read for sendmsg/recvmsg
ja97890
parents: 0
diff changeset
   886
		    ((what == SYS_writev || what == SYS_sendfilev ||
01eb04557a9e 6262586 truss should print data written/read for sendmsg/recvmsg
ja97890
parents: 0
diff changeset
   887
		    what == SYS_sendmsg) &&
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		    prismember(&writefd, fdp1)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
			expound(pri, pri->Rval1, raw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	return (!cflag && istraced);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
showpaths(private_t *pri, const struct systable *stp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
{
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   898
	int what = pri->lwpstat->pr_what;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
	for (i = 0; i < pri->sys_nargs; i++) {
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   902
		if (stp->arg[i] == ATC && (int)pri->sys_args[i] == AT_FDCWD) {
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   903
			(void) printf("%s     0x%.8X: AT_FDCWD\n",
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   904
			    pri->pname, AT_FDCWD);
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   905
		} else if ((stp->arg[i] == STG) ||
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
		    (stp->arg[i] == RST && !pri->Errno) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		    (stp->arg[i] == RLK && !pri->Errno && pri->Rval1 > 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
			long addr = pri->sys_args[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
			int maxleng =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
			    (stp->arg[i] == RLK)? (int)pri->Rval1 : PATH_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
			char *s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   913
			if (pri->sys_valid &&
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   914
			    ((i == 0 && stp->arg[0] == STG) ||
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   915
			    (i == 1 && (what == SYS_openat ||
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   916
			    what == SYS_openat64))))	/* already fetched */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
				s = pri->sys_path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
				s = fetchstring(pri, addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
				    maxleng > PATH_MAX ? PATH_MAX : maxleng);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
			if (s != (char *)NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
				(void) printf("%s     0x%.8lX: \"%s\"\n",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   924
				    pri->pname, addr, s);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
 * Display arguments to successful exec().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
showargs(private_t *pri, int raw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	const lwpstatus_t *Lsp = pri->lwpstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	int nargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
	long ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	int ptrsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
	int fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	pri->length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	ptrsize = (data_model == PR_MODEL_LP64)? 8 : 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
#if defined(__i386) || defined(__amd64)	/* XX64 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	ap = (long)Lsp->pr_reg[R_SP];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	fail = (Pread(Proc, &nargs, sizeof (nargs), ap) != sizeof (nargs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	ap += ptrsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
#endif /* i386 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
#if sparc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
	if (data_model == PR_MODEL_LP64) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
		int64_t xnargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
		ap = (long)(Lsp->pr_reg[R_SP]) + 16 * sizeof (int64_t)
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   954
		    + STACK_BIAS;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
		fail = (Pread(Proc, &xnargs, sizeof (xnargs), ap) !=
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   956
		    sizeof (xnargs));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		nargs = (int)xnargs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		ap = (long)(Lsp->pr_reg[R_SP]) + 16 * sizeof (int32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
		fail = (Pread(Proc, &nargs, sizeof (nargs), ap) !=
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
   961
		    sizeof (nargs));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
	ap += ptrsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
#endif /* sparc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	if (fail) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
		(void) printf("\n%s\t*** Bad argument list? ***\n", pri->pname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
	(void) printf("  argc = %d\n", nargs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
	if (raw)
11798
1e7f1f154004 PSARC 2009/657 delete obsolete system call traps
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10927
diff changeset
   973
		showpaths(pri, &systable[SYS_execve]);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
12273
63678502e95e PSARC 2009/377 In-kernel pfexec implementation.
Casper H.S. Dik <Casper.Dik@Sun.COM>
parents: 11798
diff changeset
   975
	show_cred(pri, FALSE, FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
	if (aflag || eflag) {		/* dump args or environment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
		/* enter region of (potentially) lengthy output */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
		Eserialize();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
		if (aflag)		/* dump the argument list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
			dumpargs(pri, ap, "argv:");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
		ap += (nargs+1) * ptrsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
		if (eflag)		/* dump the environment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
			dumpargs(pri, ap, "envp:");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
		/* exit region of lengthy output */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
		Xserialize();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
dumpargs(private_t *pri, long ap, const char *str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
	char *string;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
	unsigned int leng = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	int ptrsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	long arg = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
	char *argaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
	char badaddr[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	if (interrupt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
#ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
	if (data_model == PR_MODEL_LP64) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
		argaddr = (char *)&arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
		ptrsize = 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
#if defined(_LITTLE_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
		argaddr = (char *)&arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
		argaddr = (char *)&arg + 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
		ptrsize = 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	argaddr = (char *)&arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	ptrsize = 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
	(void) fputc(' ', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	(void) fputs(str, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	leng += 1 + strlen(str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
	while (!interrupt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
		if (Pread(Proc, argaddr, ptrsize, ap) != ptrsize) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
			(void) printf("\n%s\t*** Bad argument list? ***\n",
10927
ac35db8a7412 PSARC 2009/595 delete ssig system call trap
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 4321
diff changeset
  1030
			    pri->pname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
		ap += ptrsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
		if (arg == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
		string = fetchstring(pri, arg, PATH_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
		if (string == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
			(void) sprintf(badaddr, "BadAddress:0x%.8lX", arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
			string = badaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
		if ((leng += strlen(string)) < 63) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
			(void) fputc(' ', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
			leng++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
			(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
			leng = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
			putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
			(void) fputs("  ", stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
			leng += 2 + strlen(string);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
		(void) fputs(string, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
 * Display contents of read() or write() buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
showbuffer(private_t *pri, long offset, long count)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
	char buffer[320];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	int nbytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	char *buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
	int n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	while (count > 0 && !interrupt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
		nbytes = (count < sizeof (buffer))? count : sizeof (buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
		if ((nbytes = Pread(Proc, buffer, nbytes, offset)) <= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
		count -= nbytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
		offset += nbytes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
		buf = buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
		while (nbytes > 0 && !interrupt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
			char obuf[65];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
			n = (nbytes < 32)? nbytes : 32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
			showbytes(buf, n, obuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
			putpname(pri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
			(void) fputs("  ", stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
			(void) fputs(obuf, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
			(void) fputc('\n', stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
			nbytes -= n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
			buf += n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
showbytes(const char *buf, int n, char *obuf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
	int c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	while (--n >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
		int c1 = '\\';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
		int c2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		switch (c = (*buf++ & 0xff)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
		case '\0':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
			c2 = '0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
		case '\b':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
			c2 = 'b';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
		case '\t':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
			c2 = 't';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
		case '\n':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
			c2 = 'n';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
		case '\v':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
			c2 = 'v';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
		case '\f':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
			c2 = 'f';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
		case '\r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
			c2 = 'r';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
			if (isprint(c)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
				c1 = ' ';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
				c2 = c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
				c1 = c>>4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
				c1 += (c1 < 10)? '0' : 'A'-10;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
				c2 = c&0xf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
				c2 += (c2 < 10)? '0' : 'A'-10;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
		*obuf++ = (char)c1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
		*obuf++ = (char)c2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
	*obuf = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
}