xref: /onnv-gate/usr/src/cmd/truss/stat.c (revision 11798:1e7f1f154004)
1*11798SRoger.Faulkner@Sun.COM /*
2*11798SRoger.Faulkner@Sun.COM  * CDDL HEADER START
3*11798SRoger.Faulkner@Sun.COM  *
4*11798SRoger.Faulkner@Sun.COM  * The contents of this file are subject to the terms of the
5*11798SRoger.Faulkner@Sun.COM  * Common Development and Distribution License (the "License").
6*11798SRoger.Faulkner@Sun.COM  * You may not use this file except in compliance with the License.
7*11798SRoger.Faulkner@Sun.COM  *
8*11798SRoger.Faulkner@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11798SRoger.Faulkner@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*11798SRoger.Faulkner@Sun.COM  * See the License for the specific language governing permissions
11*11798SRoger.Faulkner@Sun.COM  * and limitations under the License.
12*11798SRoger.Faulkner@Sun.COM  *
13*11798SRoger.Faulkner@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*11798SRoger.Faulkner@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11798SRoger.Faulkner@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*11798SRoger.Faulkner@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*11798SRoger.Faulkner@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*11798SRoger.Faulkner@Sun.COM  *
19*11798SRoger.Faulkner@Sun.COM  * CDDL HEADER END
20*11798SRoger.Faulkner@Sun.COM  */
21*11798SRoger.Faulkner@Sun.COM 
22*11798SRoger.Faulkner@Sun.COM /*
23*11798SRoger.Faulkner@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24*11798SRoger.Faulkner@Sun.COM  * Use is subject to license terms.
25*11798SRoger.Faulkner@Sun.COM  */
26*11798SRoger.Faulkner@Sun.COM 
27*11798SRoger.Faulkner@Sun.COM /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28*11798SRoger.Faulkner@Sun.COM /*	  All Rights Reserved  	*/
29*11798SRoger.Faulkner@Sun.COM 
30*11798SRoger.Faulkner@Sun.COM #define	_SYSCALL32
31*11798SRoger.Faulkner@Sun.COM 
32*11798SRoger.Faulkner@Sun.COM #include <stdio.h>
33*11798SRoger.Faulkner@Sun.COM #include <stdlib.h>
34*11798SRoger.Faulkner@Sun.COM #include <unistd.h>
35*11798SRoger.Faulkner@Sun.COM #include <sys/types.h>
36*11798SRoger.Faulkner@Sun.COM #include <sys/stat.h>
37*11798SRoger.Faulkner@Sun.COM #include <sys/signal.h>
38*11798SRoger.Faulkner@Sun.COM #include <sys/fault.h>
39*11798SRoger.Faulkner@Sun.COM #include <sys/syscall.h>
40*11798SRoger.Faulkner@Sun.COM #include <libproc.h>
41*11798SRoger.Faulkner@Sun.COM #include "ramdata.h"
42*11798SRoger.Faulkner@Sun.COM #include "proto.h"
43*11798SRoger.Faulkner@Sun.COM 
44*11798SRoger.Faulkner@Sun.COM void	show_stat32(private_t *, long);
45*11798SRoger.Faulkner@Sun.COM #ifdef _LP64
46*11798SRoger.Faulkner@Sun.COM void	show_stat64(private_t *, long);
47*11798SRoger.Faulkner@Sun.COM #endif
48*11798SRoger.Faulkner@Sun.COM 
49*11798SRoger.Faulkner@Sun.COM void
show_stat(private_t * pri,long offset)50*11798SRoger.Faulkner@Sun.COM show_stat(private_t *pri, long offset)
51*11798SRoger.Faulkner@Sun.COM {
52*11798SRoger.Faulkner@Sun.COM #ifdef _LP64
53*11798SRoger.Faulkner@Sun.COM 	if (data_model == PR_MODEL_LP64)
54*11798SRoger.Faulkner@Sun.COM 		show_stat64(pri, offset);
55*11798SRoger.Faulkner@Sun.COM 	else
56*11798SRoger.Faulkner@Sun.COM 		show_stat32(pri, offset);
57*11798SRoger.Faulkner@Sun.COM #else
58*11798SRoger.Faulkner@Sun.COM 	show_stat32(pri, offset);
59*11798SRoger.Faulkner@Sun.COM #endif
60*11798SRoger.Faulkner@Sun.COM }
61*11798SRoger.Faulkner@Sun.COM 
62*11798SRoger.Faulkner@Sun.COM void
show_stat32(private_t * pri,long offset)63*11798SRoger.Faulkner@Sun.COM show_stat32(private_t *pri, long offset)
64*11798SRoger.Faulkner@Sun.COM {
65*11798SRoger.Faulkner@Sun.COM 	struct stat32 statb;
66*11798SRoger.Faulkner@Sun.COM 	timestruc_t ts;
67*11798SRoger.Faulkner@Sun.COM 
68*11798SRoger.Faulkner@Sun.COM 	if (offset != NULL &&
69*11798SRoger.Faulkner@Sun.COM 	    Pread(Proc, &statb, sizeof (statb), offset) == sizeof (statb)) {
70*11798SRoger.Faulkner@Sun.COM 		(void) printf(
71*11798SRoger.Faulkner@Sun.COM 		    "%s    d=0x%.8X i=%-5u m=0%.6o l=%-2u u=%-5u g=%-5u",
72*11798SRoger.Faulkner@Sun.COM 		    pri->pname,
73*11798SRoger.Faulkner@Sun.COM 		    statb.st_dev,
74*11798SRoger.Faulkner@Sun.COM 		    statb.st_ino,
75*11798SRoger.Faulkner@Sun.COM 		    statb.st_mode,
76*11798SRoger.Faulkner@Sun.COM 		    statb.st_nlink,
77*11798SRoger.Faulkner@Sun.COM 		    statb.st_uid,
78*11798SRoger.Faulkner@Sun.COM 		    statb.st_gid);
79*11798SRoger.Faulkner@Sun.COM 
80*11798SRoger.Faulkner@Sun.COM 		switch (statb.st_mode & S_IFMT) {
81*11798SRoger.Faulkner@Sun.COM 		case S_IFCHR:
82*11798SRoger.Faulkner@Sun.COM 		case S_IFBLK:
83*11798SRoger.Faulkner@Sun.COM 			(void) printf(" rdev=0x%.8X\n", statb.st_rdev);
84*11798SRoger.Faulkner@Sun.COM 			break;
85*11798SRoger.Faulkner@Sun.COM 		default:
86*11798SRoger.Faulkner@Sun.COM 			(void) printf(" sz=%u\n", statb.st_size);
87*11798SRoger.Faulkner@Sun.COM 			break;
88*11798SRoger.Faulkner@Sun.COM 		}
89*11798SRoger.Faulkner@Sun.COM 
90*11798SRoger.Faulkner@Sun.COM 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_atim);
91*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "at = ", &ts);
92*11798SRoger.Faulkner@Sun.COM 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_mtim);
93*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "mt = ", &ts);
94*11798SRoger.Faulkner@Sun.COM 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_ctim);
95*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "ct = ", &ts);
96*11798SRoger.Faulkner@Sun.COM 
97*11798SRoger.Faulkner@Sun.COM 		(void) printf(
98*11798SRoger.Faulkner@Sun.COM 		    "%s    bsz=%-5d blks=%-5d fs=%.*s\n",
99*11798SRoger.Faulkner@Sun.COM 		    pri->pname,
100*11798SRoger.Faulkner@Sun.COM 		    statb.st_blksize,
101*11798SRoger.Faulkner@Sun.COM 		    statb.st_blocks,
102*11798SRoger.Faulkner@Sun.COM 		    _ST_FSTYPSZ,
103*11798SRoger.Faulkner@Sun.COM 		    statb.st_fstype);
104*11798SRoger.Faulkner@Sun.COM 	}
105*11798SRoger.Faulkner@Sun.COM }
106*11798SRoger.Faulkner@Sun.COM 
107*11798SRoger.Faulkner@Sun.COM void
show_stat64_32(private_t * pri,long offset)108*11798SRoger.Faulkner@Sun.COM show_stat64_32(private_t *pri, long offset)
109*11798SRoger.Faulkner@Sun.COM {
110*11798SRoger.Faulkner@Sun.COM 	struct stat64_32 statb;
111*11798SRoger.Faulkner@Sun.COM 	timestruc_t ts;
112*11798SRoger.Faulkner@Sun.COM 
113*11798SRoger.Faulkner@Sun.COM 	if (offset != NULL &&
114*11798SRoger.Faulkner@Sun.COM 	    Pread(Proc, &statb, sizeof (statb), offset) == sizeof (statb)) {
115*11798SRoger.Faulkner@Sun.COM 		(void) printf(
116*11798SRoger.Faulkner@Sun.COM 		    "%s    d=0x%.8X i=%-5llu m=0%.6o l=%-2u u=%-5u g=%-5u",
117*11798SRoger.Faulkner@Sun.COM 		    pri->pname,
118*11798SRoger.Faulkner@Sun.COM 		    statb.st_dev,
119*11798SRoger.Faulkner@Sun.COM 		    (u_longlong_t)statb.st_ino,
120*11798SRoger.Faulkner@Sun.COM 		    statb.st_mode,
121*11798SRoger.Faulkner@Sun.COM 		    statb.st_nlink,
122*11798SRoger.Faulkner@Sun.COM 		    statb.st_uid,
123*11798SRoger.Faulkner@Sun.COM 		    statb.st_gid);
124*11798SRoger.Faulkner@Sun.COM 
125*11798SRoger.Faulkner@Sun.COM 		switch (statb.st_mode & S_IFMT) {
126*11798SRoger.Faulkner@Sun.COM 		case S_IFCHR:
127*11798SRoger.Faulkner@Sun.COM 		case S_IFBLK:
128*11798SRoger.Faulkner@Sun.COM 			(void) printf(" rdev=0x%.8X\n", statb.st_rdev);
129*11798SRoger.Faulkner@Sun.COM 			break;
130*11798SRoger.Faulkner@Sun.COM 		default:
131*11798SRoger.Faulkner@Sun.COM 			(void) printf(" sz=%llu\n", (long long)statb.st_size);
132*11798SRoger.Faulkner@Sun.COM 			break;
133*11798SRoger.Faulkner@Sun.COM 		}
134*11798SRoger.Faulkner@Sun.COM 
135*11798SRoger.Faulkner@Sun.COM 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_atim);
136*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "at = ", &ts);
137*11798SRoger.Faulkner@Sun.COM 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_mtim);
138*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "mt = ", &ts);
139*11798SRoger.Faulkner@Sun.COM 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_ctim);
140*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "ct = ", &ts);
141*11798SRoger.Faulkner@Sun.COM 
142*11798SRoger.Faulkner@Sun.COM 		(void) printf("%s    bsz=%-5d blks=%-5lld fs=%.*s\n",
143*11798SRoger.Faulkner@Sun.COM 		    pri->pname,
144*11798SRoger.Faulkner@Sun.COM 		    statb.st_blksize,
145*11798SRoger.Faulkner@Sun.COM 		    (longlong_t)statb.st_blocks,
146*11798SRoger.Faulkner@Sun.COM 		    _ST_FSTYPSZ,
147*11798SRoger.Faulkner@Sun.COM 		    statb.st_fstype);
148*11798SRoger.Faulkner@Sun.COM 	}
149*11798SRoger.Faulkner@Sun.COM }
150*11798SRoger.Faulkner@Sun.COM 
151*11798SRoger.Faulkner@Sun.COM #ifdef _LP64
152*11798SRoger.Faulkner@Sun.COM void
show_stat64(private_t * pri,long offset)153*11798SRoger.Faulkner@Sun.COM show_stat64(private_t *pri, long offset)
154*11798SRoger.Faulkner@Sun.COM {
155*11798SRoger.Faulkner@Sun.COM 	struct stat64 statb;
156*11798SRoger.Faulkner@Sun.COM 
157*11798SRoger.Faulkner@Sun.COM 	if (offset != NULL &&
158*11798SRoger.Faulkner@Sun.COM 	    Pread(Proc, &statb, sizeof (statb), offset) == sizeof (statb)) {
159*11798SRoger.Faulkner@Sun.COM 		(void) printf(
160*11798SRoger.Faulkner@Sun.COM 		    "%s    d=0x%.16lX i=%-5lu m=0%.6o l=%-2u u=%-5u g=%-5u",
161*11798SRoger.Faulkner@Sun.COM 		    pri->pname,
162*11798SRoger.Faulkner@Sun.COM 		    statb.st_dev,
163*11798SRoger.Faulkner@Sun.COM 		    statb.st_ino,
164*11798SRoger.Faulkner@Sun.COM 		    statb.st_mode,
165*11798SRoger.Faulkner@Sun.COM 		    statb.st_nlink,
166*11798SRoger.Faulkner@Sun.COM 		    statb.st_uid,
167*11798SRoger.Faulkner@Sun.COM 		    statb.st_gid);
168*11798SRoger.Faulkner@Sun.COM 
169*11798SRoger.Faulkner@Sun.COM 		switch (statb.st_mode & S_IFMT) {
170*11798SRoger.Faulkner@Sun.COM 		case S_IFCHR:
171*11798SRoger.Faulkner@Sun.COM 		case S_IFBLK:
172*11798SRoger.Faulkner@Sun.COM 			(void) printf(" rdev=0x%.16lX\n", statb.st_rdev);
173*11798SRoger.Faulkner@Sun.COM 			break;
174*11798SRoger.Faulkner@Sun.COM 		default:
175*11798SRoger.Faulkner@Sun.COM 			(void) printf(" sz=%lu\n", statb.st_size);
176*11798SRoger.Faulkner@Sun.COM 			break;
177*11798SRoger.Faulkner@Sun.COM 		}
178*11798SRoger.Faulkner@Sun.COM 
179*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "at = ", (timestruc_t *)&statb.st_atim);
180*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "mt = ", (timestruc_t *)&statb.st_mtim);
181*11798SRoger.Faulkner@Sun.COM 		prtimestruc(pri, "ct = ", (timestruc_t *)&statb.st_ctim);
182*11798SRoger.Faulkner@Sun.COM 
183*11798SRoger.Faulkner@Sun.COM 		(void) printf(
184*11798SRoger.Faulkner@Sun.COM 		    "%s    bsz=%-5d blks=%-5ld fs=%.*s\n",
185*11798SRoger.Faulkner@Sun.COM 		    pri->pname,
186*11798SRoger.Faulkner@Sun.COM 		    statb.st_blksize,
187*11798SRoger.Faulkner@Sun.COM 		    statb.st_blocks,
188*11798SRoger.Faulkner@Sun.COM 		    _ST_FSTYPSZ,
189*11798SRoger.Faulkner@Sun.COM 		    statb.st_fstype);
190*11798SRoger.Faulkner@Sun.COM 	}
191*11798SRoger.Faulkner@Sun.COM }
192*11798SRoger.Faulkner@Sun.COM #endif	/* _LP64 */
193