xref: /illumos-gate/usr/src/cmd/truss/stat.c (revision 6f9914e7)
18fd04b83SRoger A. Faulkner /*
28fd04b83SRoger A. Faulkner  * CDDL HEADER START
38fd04b83SRoger A. Faulkner  *
48fd04b83SRoger A. Faulkner  * The contents of this file are subject to the terms of the
58fd04b83SRoger A. Faulkner  * Common Development and Distribution License (the "License").
68fd04b83SRoger A. Faulkner  * You may not use this file except in compliance with the License.
78fd04b83SRoger A. Faulkner  *
88fd04b83SRoger A. Faulkner  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
98fd04b83SRoger A. Faulkner  * or http://www.opensolaris.org/os/licensing.
108fd04b83SRoger A. Faulkner  * See the License for the specific language governing permissions
118fd04b83SRoger A. Faulkner  * and limitations under the License.
128fd04b83SRoger A. Faulkner  *
138fd04b83SRoger A. Faulkner  * When distributing Covered Code, include this CDDL HEADER in each
148fd04b83SRoger A. Faulkner  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
158fd04b83SRoger A. Faulkner  * If applicable, add the following below this CDDL HEADER, with the
168fd04b83SRoger A. Faulkner  * fields enclosed by brackets "[]" replaced with your own identifying
178fd04b83SRoger A. Faulkner  * information: Portions Copyright [yyyy] [name of copyright owner]
188fd04b83SRoger A. Faulkner  *
198fd04b83SRoger A. Faulkner  * CDDL HEADER END
208fd04b83SRoger A. Faulkner  */
218fd04b83SRoger A. Faulkner 
228fd04b83SRoger A. Faulkner /*
238fd04b83SRoger A. Faulkner  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
248fd04b83SRoger A. Faulkner  * Use is subject to license terms.
258fd04b83SRoger A. Faulkner  */
268fd04b83SRoger A. Faulkner 
278fd04b83SRoger A. Faulkner /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
288fd04b83SRoger A. Faulkner /*	  All Rights Reserved	*/
298fd04b83SRoger A. Faulkner 
308fd04b83SRoger A. Faulkner #define	_SYSCALL32
318fd04b83SRoger A. Faulkner 
328fd04b83SRoger A. Faulkner #include <stdio.h>
338fd04b83SRoger A. Faulkner #include <stdlib.h>
348fd04b83SRoger A. Faulkner #include <unistd.h>
358fd04b83SRoger A. Faulkner #include <sys/types.h>
368fd04b83SRoger A. Faulkner #include <sys/stat.h>
378fd04b83SRoger A. Faulkner #include <sys/signal.h>
388fd04b83SRoger A. Faulkner #include <sys/fault.h>
398fd04b83SRoger A. Faulkner #include <sys/syscall.h>
408fd04b83SRoger A. Faulkner #include <libproc.h>
418fd04b83SRoger A. Faulkner #include "ramdata.h"
428fd04b83SRoger A. Faulkner #include "proto.h"
438fd04b83SRoger A. Faulkner 
448fd04b83SRoger A. Faulkner void	show_stat32(private_t *, long);
458fd04b83SRoger A. Faulkner void	show_stat64(private_t *, long);
468fd04b83SRoger A. Faulkner 
478fd04b83SRoger A. Faulkner void
show_stat(private_t * pri,long offset)488fd04b83SRoger A. Faulkner show_stat(private_t *pri, long offset)
498fd04b83SRoger A. Faulkner {
508fd04b83SRoger A. Faulkner 	if (data_model == PR_MODEL_LP64)
518fd04b83SRoger A. Faulkner 		show_stat64(pri, offset);
528fd04b83SRoger A. Faulkner 	else
538fd04b83SRoger A. Faulkner 		show_stat32(pri, offset);
548fd04b83SRoger A. Faulkner }
558fd04b83SRoger A. Faulkner 
568fd04b83SRoger A. Faulkner void
show_stat32(private_t * pri,long offset)578fd04b83SRoger A. Faulkner show_stat32(private_t *pri, long offset)
588fd04b83SRoger A. Faulkner {
598fd04b83SRoger A. Faulkner 	struct stat32 statb;
608fd04b83SRoger A. Faulkner 	timestruc_t ts;
618fd04b83SRoger A. Faulkner 
62*27aa4812SToomas Soome 	if (offset != 0 &&
638fd04b83SRoger A. Faulkner 	    Pread(Proc, &statb, sizeof (statb), offset) == sizeof (statb)) {
648fd04b83SRoger A. Faulkner 		(void) printf(
658fd04b83SRoger A. Faulkner 		    "%s    d=0x%.8X i=%-5u m=0%.6o l=%-2u u=%-5u g=%-5u",
668fd04b83SRoger A. Faulkner 		    pri->pname,
678fd04b83SRoger A. Faulkner 		    statb.st_dev,
688fd04b83SRoger A. Faulkner 		    statb.st_ino,
698fd04b83SRoger A. Faulkner 		    statb.st_mode,
708fd04b83SRoger A. Faulkner 		    statb.st_nlink,
718fd04b83SRoger A. Faulkner 		    statb.st_uid,
728fd04b83SRoger A. Faulkner 		    statb.st_gid);
738fd04b83SRoger A. Faulkner 
748fd04b83SRoger A. Faulkner 		switch (statb.st_mode & S_IFMT) {
758fd04b83SRoger A. Faulkner 		case S_IFCHR:
768fd04b83SRoger A. Faulkner 		case S_IFBLK:
778fd04b83SRoger A. Faulkner 			(void) printf(" rdev=0x%.8X\n", statb.st_rdev);
788fd04b83SRoger A. Faulkner 			break;
798fd04b83SRoger A. Faulkner 		default:
808fd04b83SRoger A. Faulkner 			(void) printf(" sz=%u\n", statb.st_size);
818fd04b83SRoger A. Faulkner 			break;
828fd04b83SRoger A. Faulkner 		}
838fd04b83SRoger A. Faulkner 
848fd04b83SRoger A. Faulkner 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_atim);
858fd04b83SRoger A. Faulkner 		prtimestruc(pri, "at = ", &ts);
868fd04b83SRoger A. Faulkner 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_mtim);
878fd04b83SRoger A. Faulkner 		prtimestruc(pri, "mt = ", &ts);
888fd04b83SRoger A. Faulkner 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_ctim);
898fd04b83SRoger A. Faulkner 		prtimestruc(pri, "ct = ", &ts);
908fd04b83SRoger A. Faulkner 
918fd04b83SRoger A. Faulkner 		(void) printf(
928fd04b83SRoger A. Faulkner 		    "%s    bsz=%-5d blks=%-5d fs=%.*s\n",
938fd04b83SRoger A. Faulkner 		    pri->pname,
948fd04b83SRoger A. Faulkner 		    statb.st_blksize,
958fd04b83SRoger A. Faulkner 		    statb.st_blocks,
968fd04b83SRoger A. Faulkner 		    _ST_FSTYPSZ,
978fd04b83SRoger A. Faulkner 		    statb.st_fstype);
988fd04b83SRoger A. Faulkner 	}
998fd04b83SRoger A. Faulkner }
1008fd04b83SRoger A. Faulkner 
1018fd04b83SRoger A. Faulkner void
show_stat64_32(private_t * pri,long offset)1028fd04b83SRoger A. Faulkner show_stat64_32(private_t *pri, long offset)
1038fd04b83SRoger A. Faulkner {
1048fd04b83SRoger A. Faulkner 	struct stat64_32 statb;
1058fd04b83SRoger A. Faulkner 	timestruc_t ts;
1068fd04b83SRoger A. Faulkner 
107*27aa4812SToomas Soome 	if (offset != 0 &&
1088fd04b83SRoger A. Faulkner 	    Pread(Proc, &statb, sizeof (statb), offset) == sizeof (statb)) {
1098fd04b83SRoger A. Faulkner 		(void) printf(
1108fd04b83SRoger A. Faulkner 		    "%s    d=0x%.8X i=%-5llu m=0%.6o l=%-2u u=%-5u g=%-5u",
1118fd04b83SRoger A. Faulkner 		    pri->pname,
1128fd04b83SRoger A. Faulkner 		    statb.st_dev,
1138fd04b83SRoger A. Faulkner 		    (u_longlong_t)statb.st_ino,
1148fd04b83SRoger A. Faulkner 		    statb.st_mode,
1158fd04b83SRoger A. Faulkner 		    statb.st_nlink,
1168fd04b83SRoger A. Faulkner 		    statb.st_uid,
1178fd04b83SRoger A. Faulkner 		    statb.st_gid);
1188fd04b83SRoger A. Faulkner 
1198fd04b83SRoger A. Faulkner 		switch (statb.st_mode & S_IFMT) {
1208fd04b83SRoger A. Faulkner 		case S_IFCHR:
1218fd04b83SRoger A. Faulkner 		case S_IFBLK:
1228fd04b83SRoger A. Faulkner 			(void) printf(" rdev=0x%.8X\n", statb.st_rdev);
1238fd04b83SRoger A. Faulkner 			break;
1248fd04b83SRoger A. Faulkner 		default:
1258fd04b83SRoger A. Faulkner 			(void) printf(" sz=%llu\n", (long long)statb.st_size);
1268fd04b83SRoger A. Faulkner 			break;
1278fd04b83SRoger A. Faulkner 		}
1288fd04b83SRoger A. Faulkner 
1298fd04b83SRoger A. Faulkner 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_atim);
1308fd04b83SRoger A. Faulkner 		prtimestruc(pri, "at = ", &ts);
1318fd04b83SRoger A. Faulkner 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_mtim);
1328fd04b83SRoger A. Faulkner 		prtimestruc(pri, "mt = ", &ts);
1338fd04b83SRoger A. Faulkner 		TIMESPEC32_TO_TIMESPEC(&ts, &statb.st_ctim);
1348fd04b83SRoger A. Faulkner 		prtimestruc(pri, "ct = ", &ts);
1358fd04b83SRoger A. Faulkner 
1368fd04b83SRoger A. Faulkner 		(void) printf("%s    bsz=%-5d blks=%-5lld fs=%.*s\n",
1378fd04b83SRoger A. Faulkner 		    pri->pname,
1388fd04b83SRoger A. Faulkner 		    statb.st_blksize,
1398fd04b83SRoger A. Faulkner 		    (longlong_t)statb.st_blocks,
1408fd04b83SRoger A. Faulkner 		    _ST_FSTYPSZ,
1418fd04b83SRoger A. Faulkner 		    statb.st_fstype);
1428fd04b83SRoger A. Faulkner 	}
1438fd04b83SRoger A. Faulkner }
1448fd04b83SRoger A. Faulkner 
1458fd04b83SRoger A. Faulkner void
show_stat64(private_t * pri,long offset)1468fd04b83SRoger A. Faulkner show_stat64(private_t *pri, long offset)
1478fd04b83SRoger A. Faulkner {
1488fd04b83SRoger A. Faulkner 	struct stat64 statb;
1498fd04b83SRoger A. Faulkner 
150*27aa4812SToomas Soome 	if (offset != 0 &&
1518fd04b83SRoger A. Faulkner 	    Pread(Proc, &statb, sizeof (statb), offset) == sizeof (statb)) {
1528fd04b83SRoger A. Faulkner 		(void) printf(
1538fd04b83SRoger A. Faulkner 		    "%s    d=0x%.16lX i=%-5lu m=0%.6o l=%-2u u=%-5u g=%-5u",
1548fd04b83SRoger A. Faulkner 		    pri->pname,
1558fd04b83SRoger A. Faulkner 		    statb.st_dev,
1568fd04b83SRoger A. Faulkner 		    statb.st_ino,
1578fd04b83SRoger A. Faulkner 		    statb.st_mode,
1588fd04b83SRoger A. Faulkner 		    statb.st_nlink,
1598fd04b83SRoger A. Faulkner 		    statb.st_uid,
1608fd04b83SRoger A. Faulkner 		    statb.st_gid);
1618fd04b83SRoger A. Faulkner 
1628fd04b83SRoger A. Faulkner 		switch (statb.st_mode & S_IFMT) {
1638fd04b83SRoger A. Faulkner 		case S_IFCHR:
1648fd04b83SRoger A. Faulkner 		case S_IFBLK:
1658fd04b83SRoger A. Faulkner 			(void) printf(" rdev=0x%.16lX\n", statb.st_rdev);
1668fd04b83SRoger A. Faulkner 			break;
1678fd04b83SRoger A. Faulkner 		default:
1688fd04b83SRoger A. Faulkner 			(void) printf(" sz=%lu\n", statb.st_size);
1698fd04b83SRoger A. Faulkner 			break;
1708fd04b83SRoger A. Faulkner 		}
1718fd04b83SRoger A. Faulkner 
1728fd04b83SRoger A. Faulkner 		prtimestruc(pri, "at = ", (timestruc_t *)&statb.st_atim);
1738fd04b83SRoger A. Faulkner 		prtimestruc(pri, "mt = ", (timestruc_t *)&statb.st_mtim);
1748fd04b83SRoger A. Faulkner 		prtimestruc(pri, "ct = ", (timestruc_t *)&statb.st_ctim);
1758fd04b83SRoger A. Faulkner 
1768fd04b83SRoger A. Faulkner 		(void) printf(
1778fd04b83SRoger A. Faulkner 		    "%s    bsz=%-5d blks=%-5ld fs=%.*s\n",
1788fd04b83SRoger A. Faulkner 		    pri->pname,
1798fd04b83SRoger A. Faulkner 		    statb.st_blksize,
1808fd04b83SRoger A. Faulkner 		    statb.st_blocks,
1818fd04b83SRoger A. Faulkner 		    _ST_FSTYPSZ,
1828fd04b83SRoger A. Faulkner 		    statb.st_fstype);
1838fd04b83SRoger A. Faulkner 	}
1848fd04b83SRoger A. Faulkner }
185