xref: /onnv-gate/usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c (revision 8670:6da349c3f817)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
22*8670SJose.Borrego@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
235331Samw  * Use is subject to license terms.
245331Samw  */
255331Samw 
265331Samw #include <sys/mdb_modapi.h>
275331Samw #include <smbsrv/smb_vops.h>
285331Samw #include <smbsrv/smb.h>
296139Sjb150015 #include <smbsrv/smb_ktypes.h>
305331Samw 
316432Sas200622 #define	SMB_DCMD_INDENT		2
326432Sas200622 #define	ACE_TYPE_TABLEN		(ACE_ALL_TYPES + 1)
336432Sas200622 #define	ACE_TYPE_ENTRY(_v_)	{_v_, #_v_}
346432Sas200622 #define	SMB_COM_ENTRY(_v_, _x_)	{#_v_, _x_}
356432Sas200622 
366432Sas200622 #define	SMB_MDB_MAX_OPTS	10
376432Sas200622 
386432Sas200622 #define	SMB_OPT_SERVER		0x00000001
396432Sas200622 #define	SMB_OPT_VFS		0x00000002
406432Sas200622 #define	SMB_OPT_SESSION		0x00000004
416432Sas200622 #define	SMB_OPT_REQUEST		0x00000008
426432Sas200622 #define	SMB_OPT_USER		0x00000010
436432Sas200622 #define	SMB_OPT_TREE		0x00000020
446432Sas200622 #define	SMB_OPT_OFILE		0x00000040
456432Sas200622 #define	SMB_OPT_ODIR		0x00000080
466432Sas200622 #define	SMB_OPT_WALK		0x00000100
476432Sas200622 #define	SMB_OPT_VERBOSE		0x00000200
486432Sas200622 #define	SMB_OPT_ALL_OBJ		0x000000FF
495331Samw 
506432Sas200622 /*
516432Sas200622  * Structure associating an ACE type to a string.
526432Sas200622  */
536432Sas200622 typedef struct {
546432Sas200622 	uint8_t		ace_type_value;
556432Sas200622 	const char	*ace_type_sting;
566432Sas200622 } ace_type_entry_t;
576432Sas200622 
586432Sas200622 /*
596432Sas200622  * Structure containing strings describing an SMB command.
606432Sas200622  */
616432Sas200622 typedef struct {
626432Sas200622 	const char	*smb_com;
636432Sas200622 	const char	*smb_andx;
646432Sas200622 } smb_com_entry_t;
656432Sas200622 
666432Sas200622 /*
676432Sas200622  * Structure describing an object to be expanded (displayed).
686432Sas200622  */
696432Sas200622 typedef struct {
706432Sas200622 	uint_t		ex_mask;
716432Sas200622 	size_t		ex_offset;
726432Sas200622 	const char	*ex_dcmd;
736432Sas200622 	const char	*ex_name;
746432Sas200622 } smb_exp_t;
755331Samw 
765331Samw /*
776432Sas200622  * List of supported options. Ther order has the match the bits SMB_OPT_xxx.
785331Samw  */
796432Sas200622 static const char *smb_opts[SMB_MDB_MAX_OPTS] =
806139Sjb150015 {
816432Sas200622 	"-s", "-m", "-e", "-r", "-u", "-t", "-f", "-d", "-w", "-v"
826432Sas200622 };
836139Sjb150015 
846432Sas200622 static smb_com_entry_t	smb_com[256] =
856139Sjb150015 {
866432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE_DIRECTORY, "No"),
876432Sas200622 	SMB_COM_ENTRY(SMB_COM_DELETE_DIRECTORY, "No"),
886432Sas200622 	SMB_COM_ENTRY(SMB_COM_OPEN, "No"),
896432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE, "No"),
906432Sas200622 	SMB_COM_ENTRY(SMB_COM_CLOSE, "No"),
916432Sas200622 	SMB_COM_ENTRY(SMB_COM_FLUSH, "No"),
926432Sas200622 	SMB_COM_ENTRY(SMB_COM_DELETE, "No"),
936432Sas200622 	SMB_COM_ENTRY(SMB_COM_RENAME, "No"),
946432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_INFORMATION, "No"),
956432Sas200622 	SMB_COM_ENTRY(SMB_COM_SET_INFORMATION, "No"),
966432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ, "No"),
976432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE, "No"),
986432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOCK_BYTE_RANGE, "No"),
996432Sas200622 	SMB_COM_ENTRY(SMB_COM_UNLOCK_BYTE_RANGE, "No"),
1006432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE_TEMPORARY, "No"),
1016432Sas200622 	SMB_COM_ENTRY(SMB_COM_CREATE_NEW, "No"),
1026432Sas200622 	SMB_COM_ENTRY(SMB_COM_CHECK_DIRECTORY, "No"),
1036432Sas200622 	SMB_COM_ENTRY(SMB_COM_PROCESS_EXIT, "No"),
1046432Sas200622 	SMB_COM_ENTRY(SMB_COM_SEEK, "No"),
1056432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOCK_AND_READ, "No"),
1066432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_AND_UNLOCK, "No"),
1076432Sas200622 	SMB_COM_ENTRY(0x15, "?"),
1086432Sas200622 	SMB_COM_ENTRY(0x16, "?"),
1096432Sas200622 	SMB_COM_ENTRY(0x17, "?"),
1106432Sas200622 	SMB_COM_ENTRY(0x18, "?"),
1116432Sas200622 	SMB_COM_ENTRY(0x19, "?"),
1126432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_RAW, "No"),
1136432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_MPX, "No"),
1146432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_MPX_SECONDARY, "No"),
1156432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_RAW, "No"),
1166432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_MPX, "No"),
1176432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_MPX_SECONDARY, "No"),
1186432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_COMPLETE, "No"),
1196432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_SERVER, "No"),
1206432Sas200622 	SMB_COM_ENTRY(SMB_COM_SET_INFORMATION2, "No"),
1216432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_INFORMATION2, "No"),
1226432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOCKING_ANDX, "No"),
1236432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION, "No"),
1246432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION_SECONDARY, "No"),
1256432Sas200622 	SMB_COM_ENTRY(SMB_COM_IOCTL, "No"),
1266432Sas200622 	SMB_COM_ENTRY(SMB_COM_IOCTL_SECONDARY, "No"),
1276432Sas200622 	SMB_COM_ENTRY(SMB_COM_COPY, "No"),
1286432Sas200622 	SMB_COM_ENTRY(SMB_COM_MOVE, "No"),
1296432Sas200622 	SMB_COM_ENTRY(SMB_COM_ECHO, "No"),
1306432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_AND_CLOSE, "No"),
1316432Sas200622 	SMB_COM_ENTRY(SMB_COM_OPEN_ANDX, "No"),
1326432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_ANDX, "No"),
1336432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_ANDX, "No"),
1346432Sas200622 	SMB_COM_ENTRY(SMB_COM_NEW_FILE_SIZE, "No"),
1356432Sas200622 	SMB_COM_ENTRY(SMB_COM_CLOSE_AND_TREE_DISC, "No"),
1366432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION2, "No"),
1376432Sas200622 	SMB_COM_ENTRY(SMB_COM_TRANSACTION2_SECONDARY, "No"),
1386432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_CLOSE2, "No"),
1396432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_NOTIFY_CLOSE, "No"),
1406432Sas200622 	SMB_COM_ENTRY(0x36, "?"),
1416432Sas200622 	SMB_COM_ENTRY(0x37, "?"),
1426432Sas200622 	SMB_COM_ENTRY(0x38, "?"),
1436432Sas200622 	SMB_COM_ENTRY(0x39, "?"),
1446432Sas200622 	SMB_COM_ENTRY(0x3A, "?"),
1456432Sas200622 	SMB_COM_ENTRY(0x3B, "?"),
1466432Sas200622 	SMB_COM_ENTRY(0x3C, "?"),
1476432Sas200622 	SMB_COM_ENTRY(0x3D, "?"),
1486432Sas200622 	SMB_COM_ENTRY(0x3E, "?"),
1496432Sas200622 	SMB_COM_ENTRY(0x3F, "?"),
1506432Sas200622 	SMB_COM_ENTRY(0x40, "?"),
1516432Sas200622 	SMB_COM_ENTRY(0x41, "?"),
1526432Sas200622 	SMB_COM_ENTRY(0x42, "?"),
1536432Sas200622 	SMB_COM_ENTRY(0x43, "?"),
1546432Sas200622 	SMB_COM_ENTRY(0x44, "?"),
1556432Sas200622 	SMB_COM_ENTRY(0x45, "?"),
1566432Sas200622 	SMB_COM_ENTRY(0x46, "?"),
1576432Sas200622 	SMB_COM_ENTRY(0x47, "?"),
1586432Sas200622 	SMB_COM_ENTRY(0x48, "?"),
1596432Sas200622 	SMB_COM_ENTRY(0x49, "?"),
1606432Sas200622 	SMB_COM_ENTRY(0x4A, "?"),
1616432Sas200622 	SMB_COM_ENTRY(0x4B, "?"),
1626432Sas200622 	SMB_COM_ENTRY(0x4C, "?"),
1636432Sas200622 	SMB_COM_ENTRY(0x4D, "?"),
1646432Sas200622 	SMB_COM_ENTRY(0x4E, "?"),
1656432Sas200622 	SMB_COM_ENTRY(0x4F, "?"),
1666432Sas200622 	SMB_COM_ENTRY(0x50, "?"),
1676432Sas200622 	SMB_COM_ENTRY(0x51, "?"),
1686432Sas200622 	SMB_COM_ENTRY(0x52, "?"),
1696432Sas200622 	SMB_COM_ENTRY(0x53, "?"),
1706432Sas200622 	SMB_COM_ENTRY(0x54, "?"),
1716432Sas200622 	SMB_COM_ENTRY(0x55, "?"),
1726432Sas200622 	SMB_COM_ENTRY(0x56, "?"),
1736432Sas200622 	SMB_COM_ENTRY(0x57, "?"),
1746432Sas200622 	SMB_COM_ENTRY(0x58, "?"),
1756432Sas200622 	SMB_COM_ENTRY(0x59, "?"),
1766432Sas200622 	SMB_COM_ENTRY(0x5A, "?"),
1776432Sas200622 	SMB_COM_ENTRY(0x5B, "?"),
1786432Sas200622 	SMB_COM_ENTRY(0x5C, "?"),
1796432Sas200622 	SMB_COM_ENTRY(0x5D, "?"),
1806432Sas200622 	SMB_COM_ENTRY(0x5E, "?"),
1816432Sas200622 	SMB_COM_ENTRY(0x5F, "?"),
1826432Sas200622 	SMB_COM_ENTRY(0x60, "?"),
1836432Sas200622 	SMB_COM_ENTRY(0x61, "?"),
1846432Sas200622 	SMB_COM_ENTRY(0x62, "?"),
1856432Sas200622 	SMB_COM_ENTRY(0x63, "?"),
1866432Sas200622 	SMB_COM_ENTRY(0x64, "?"),
1876432Sas200622 	SMB_COM_ENTRY(0x65, "?"),
1886432Sas200622 	SMB_COM_ENTRY(0x66, "?"),
1896432Sas200622 	SMB_COM_ENTRY(0x67, "?"),
1906432Sas200622 	SMB_COM_ENTRY(0x68, "?"),
1916432Sas200622 	SMB_COM_ENTRY(0x69, "?"),
1926432Sas200622 	SMB_COM_ENTRY(0x6A, "?"),
1936432Sas200622 	SMB_COM_ENTRY(0x6B, "?"),
1946432Sas200622 	SMB_COM_ENTRY(0x6C, "?"),
1956432Sas200622 	SMB_COM_ENTRY(0x6D, "?"),
1966432Sas200622 	SMB_COM_ENTRY(0x6E, "?"),
1976432Sas200622 	SMB_COM_ENTRY(0x6F, "?"),
1986432Sas200622 	SMB_COM_ENTRY(SMB_COM_TREE_CONNECT, "No"),
1996432Sas200622 	SMB_COM_ENTRY(SMB_COM_TREE_DISCONNECT, "No"),
2006432Sas200622 	SMB_COM_ENTRY(SMB_COM_NEGOTIATE, "No"),
2016432Sas200622 	SMB_COM_ENTRY(SMB_COM_SESSION_SETUP_ANDX, "No"),
2026432Sas200622 	SMB_COM_ENTRY(SMB_COM_LOGOFF_ANDX, "No"),
2036432Sas200622 	SMB_COM_ENTRY(SMB_COM_TREE_CONNECT_ANDX, "No"),
2046432Sas200622 	SMB_COM_ENTRY(0x76, "?"),
2056432Sas200622 	SMB_COM_ENTRY(0x77, "?"),
2066432Sas200622 	SMB_COM_ENTRY(0x78, "?"),
2076432Sas200622 	SMB_COM_ENTRY(0x79, "?"),
2086432Sas200622 	SMB_COM_ENTRY(0x7A, "?"),
2096432Sas200622 	SMB_COM_ENTRY(0x7B, "?"),
2106432Sas200622 	SMB_COM_ENTRY(0x7C, "?"),
2116432Sas200622 	SMB_COM_ENTRY(0x7D, "?"),
2126432Sas200622 	SMB_COM_ENTRY(0x7E, "?"),
2136432Sas200622 	SMB_COM_ENTRY(0x7F, "?"),
2146432Sas200622 	SMB_COM_ENTRY(SMB_COM_QUERY_INFORMATION_DISK, "No"),
2156432Sas200622 	SMB_COM_ENTRY(SMB_COM_SEARCH, "No"),
2166432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND, "No"),
2176432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_UNIQUE, "No"),
2186432Sas200622 	SMB_COM_ENTRY(SMB_COM_FIND_CLOSE, "No"),
2196432Sas200622 	SMB_COM_ENTRY(0x85, "?"),
2206432Sas200622 	SMB_COM_ENTRY(0x86, "?"),
2216432Sas200622 	SMB_COM_ENTRY(0x87, "?"),
2226432Sas200622 	SMB_COM_ENTRY(0x88, "?"),
2236432Sas200622 	SMB_COM_ENTRY(0x89, "?"),
2246432Sas200622 	SMB_COM_ENTRY(0x8A, "?"),
2256432Sas200622 	SMB_COM_ENTRY(0x8B, "?"),
2266432Sas200622 	SMB_COM_ENTRY(0x8C, "?"),
2276432Sas200622 	SMB_COM_ENTRY(0x8D, "?"),
2286432Sas200622 	SMB_COM_ENTRY(0x8E, "?"),
2296432Sas200622 	SMB_COM_ENTRY(0x8F, "?"),
2306432Sas200622 	SMB_COM_ENTRY(0x90, "?"),
2316432Sas200622 	SMB_COM_ENTRY(0x91, "?"),
2326432Sas200622 	SMB_COM_ENTRY(0x92, "?"),
2336432Sas200622 	SMB_COM_ENTRY(0x93, "?"),
2346432Sas200622 	SMB_COM_ENTRY(0x94, "?"),
2356432Sas200622 	SMB_COM_ENTRY(0x95, "?"),
2366432Sas200622 	SMB_COM_ENTRY(0x96, "?"),
2376432Sas200622 	SMB_COM_ENTRY(0x97, "?"),
2386432Sas200622 	SMB_COM_ENTRY(0x98, "?"),
2396432Sas200622 	SMB_COM_ENTRY(0x99, "?"),
2406432Sas200622 	SMB_COM_ENTRY(0x9A, "?"),
2416432Sas200622 	SMB_COM_ENTRY(0x9B, "?"),
2426432Sas200622 	SMB_COM_ENTRY(0x9C, "?"),
2436432Sas200622 	SMB_COM_ENTRY(0x9D, "?"),
2446432Sas200622 	SMB_COM_ENTRY(0x9E, "?"),
2456432Sas200622 	SMB_COM_ENTRY(0x9F, "?"),
2466432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_TRANSACT, "No"),
2476432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_TRANSACT_SECONDARY, "No"),
2486432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_CREATE_ANDX, "No"),
2496432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_CANCEL, "No"),
2506432Sas200622 	SMB_COM_ENTRY(SMB_COM_NT_RENAME, "No"),
2516432Sas200622 	SMB_COM_ENTRY(0xA6, "?"),
2526432Sas200622 	SMB_COM_ENTRY(0xA7, "?"),
2536432Sas200622 	SMB_COM_ENTRY(0xA8, "?"),
2546432Sas200622 	SMB_COM_ENTRY(0xA9, "?"),
2556432Sas200622 	SMB_COM_ENTRY(0xAA, "?"),
2566432Sas200622 	SMB_COM_ENTRY(0xAB, "?"),
2576432Sas200622 	SMB_COM_ENTRY(0xAC, "?"),
2586432Sas200622 	SMB_COM_ENTRY(0xAD, "?"),
2596432Sas200622 	SMB_COM_ENTRY(0xAE, "?"),
2606432Sas200622 	SMB_COM_ENTRY(0xAF, "?"),
2616432Sas200622 	SMB_COM_ENTRY(0xB0, "?"),
2626432Sas200622 	SMB_COM_ENTRY(0xB1, "?"),
2636432Sas200622 	SMB_COM_ENTRY(0xB2, "?"),
2646432Sas200622 	SMB_COM_ENTRY(0xB3, "?"),
2656432Sas200622 	SMB_COM_ENTRY(0xB4, "?"),
2666432Sas200622 	SMB_COM_ENTRY(0xB5, "?"),
2676432Sas200622 	SMB_COM_ENTRY(0xB6, "?"),
2686432Sas200622 	SMB_COM_ENTRY(0xB7, "?"),
2696432Sas200622 	SMB_COM_ENTRY(0xB8, "?"),
2706432Sas200622 	SMB_COM_ENTRY(0xB9, "?"),
2716432Sas200622 	SMB_COM_ENTRY(0xBA, "?"),
2726432Sas200622 	SMB_COM_ENTRY(0xBB, "?"),
2736432Sas200622 	SMB_COM_ENTRY(0xBC, "?"),
2746432Sas200622 	SMB_COM_ENTRY(0xBD, "?"),
2756432Sas200622 	SMB_COM_ENTRY(0xBE, "?"),
2766432Sas200622 	SMB_COM_ENTRY(0xBF, "?"),
2776432Sas200622 	SMB_COM_ENTRY(SMB_COM_OPEN_PRINT_FILE, "No"),
2786432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_PRINT_FILE, "No"),
2796432Sas200622 	SMB_COM_ENTRY(SMB_COM_CLOSE_PRINT_FILE, "No"),
2806432Sas200622 	SMB_COM_ENTRY(SMB_COM_GET_PRINT_QUEUE, "No"),
2816432Sas200622 	SMB_COM_ENTRY(0xC4, "?"),
2826432Sas200622 	SMB_COM_ENTRY(0xC5, "?"),
2836432Sas200622 	SMB_COM_ENTRY(0xC6, "?"),
2846432Sas200622 	SMB_COM_ENTRY(0xC7, "?"),
2856432Sas200622 	SMB_COM_ENTRY(0xC8, "?"),
2866432Sas200622 	SMB_COM_ENTRY(0xC9, "?"),
2876432Sas200622 	SMB_COM_ENTRY(0xCA, "?"),
2886432Sas200622 	SMB_COM_ENTRY(0xCB, "?"),
2896432Sas200622 	SMB_COM_ENTRY(0xCC, "?"),
2906432Sas200622 	SMB_COM_ENTRY(0xCD, "?"),
2916432Sas200622 	SMB_COM_ENTRY(0xCE, "?"),
2926432Sas200622 	SMB_COM_ENTRY(0xCF, "?"),
2936432Sas200622 	SMB_COM_ENTRY(0xD0, "?"),
2946432Sas200622 	SMB_COM_ENTRY(0xD1, "?"),
2956432Sas200622 	SMB_COM_ENTRY(0xD2, "?"),
2966432Sas200622 	SMB_COM_ENTRY(0xD3, "?"),
2976432Sas200622 	SMB_COM_ENTRY(0xD4, "?"),
2986432Sas200622 	SMB_COM_ENTRY(0xD5, "?"),
2996432Sas200622 	SMB_COM_ENTRY(0xD6, "?"),
3006432Sas200622 	SMB_COM_ENTRY(0xD7, "?"),
3016432Sas200622 	SMB_COM_ENTRY(SMB_COM_READ_BULK, "No"),
3026432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_BULK, "No"),
3036432Sas200622 	SMB_COM_ENTRY(SMB_COM_WRITE_BULK_DATA, "No"),
3046432Sas200622 	SMB_COM_ENTRY(0xDB, "?"),
3056432Sas200622 	SMB_COM_ENTRY(0xDC, "?"),
3066432Sas200622 	SMB_COM_ENTRY(0xDE, "?"),
3076432Sas200622 	SMB_COM_ENTRY(0xDF, "?"),
3086432Sas200622 	SMB_COM_ENTRY(0xE0, "?"),
3096432Sas200622 	SMB_COM_ENTRY(0xE1, "?"),
3106432Sas200622 	SMB_COM_ENTRY(0xE2, "?"),
3116432Sas200622 	SMB_COM_ENTRY(0xE3, "?"),
3126432Sas200622 	SMB_COM_ENTRY(0xE4, "?"),
3136432Sas200622 	SMB_COM_ENTRY(0xE5, "?"),
3146432Sas200622 	SMB_COM_ENTRY(0xE6, "?"),
3156432Sas200622 	SMB_COM_ENTRY(0xE7, "?"),
3166432Sas200622 	SMB_COM_ENTRY(0xE8, "?"),
3176432Sas200622 	SMB_COM_ENTRY(0xE9, "?"),
3186432Sas200622 	SMB_COM_ENTRY(0xEA, "?"),
3196432Sas200622 	SMB_COM_ENTRY(0xEB, "?"),
3206432Sas200622 	SMB_COM_ENTRY(0xEC, "?"),
3216432Sas200622 	SMB_COM_ENTRY(0xED, "?"),
3226432Sas200622 	SMB_COM_ENTRY(0xEE, "?"),
3236432Sas200622 	SMB_COM_ENTRY(0xEF, "?"),
3246432Sas200622 	SMB_COM_ENTRY(0xF0, "?"),
3256432Sas200622 	SMB_COM_ENTRY(0xF1, "?"),
3266432Sas200622 	SMB_COM_ENTRY(0xF2, "?"),
3276432Sas200622 	SMB_COM_ENTRY(0xF3, "?"),
3286432Sas200622 	SMB_COM_ENTRY(0xF4, "?"),
3296432Sas200622 	SMB_COM_ENTRY(0xF5, "?"),
3306432Sas200622 	SMB_COM_ENTRY(0xF6, "?"),
3316432Sas200622 	SMB_COM_ENTRY(0xF7, "?"),
3326432Sas200622 	SMB_COM_ENTRY(0xF8, "?"),
3336432Sas200622 	SMB_COM_ENTRY(0xF9, "?"),
3346432Sas200622 	SMB_COM_ENTRY(0xFA, "?"),
3356432Sas200622 	SMB_COM_ENTRY(0xFB, "?"),
3366432Sas200622 	SMB_COM_ENTRY(0xFC, "?"),
3376432Sas200622 	SMB_COM_ENTRY(0xFD, "?"),
3386432Sas200622 	SMB_COM_ENTRY(0xFE, "?"),
3396432Sas200622 	SMB_COM_ENTRY(0xFF, "?")
3406432Sas200622 };
3416139Sjb150015 
3426432Sas200622 static int smb_dcmd_list(uintptr_t, uint_t, int, const mdb_arg_t *);
3436432Sas200622 static void smb_dcmd_list_help(void);
3446432Sas200622 static int smb_dcmd_server(uintptr_t, uint_t, int, const mdb_arg_t *);
3456432Sas200622 static int smb_dcmd_vfs(uintptr_t, uint_t, int, const mdb_arg_t *);
3466432Sas200622 static void smb_dcmd_session_help(void);
3476432Sas200622 static int smb_dcmd_session(uintptr_t, uint_t, int, const mdb_arg_t *);
3486432Sas200622 static int smb_dcmd_request(uintptr_t, uint_t, int, const mdb_arg_t *);
3496432Sas200622 static void smb_dcmd_user_help(void);
3506432Sas200622 static int smb_dcmd_user(uintptr_t, uint_t, int, const mdb_arg_t *);
3516432Sas200622 static void smb_dcmd_tree_help(void);
3526432Sas200622 static int smb_dcmd_tree(uintptr_t, uint_t, int, const mdb_arg_t *);
3536432Sas200622 static int smb_dcmd_odir(uintptr_t, uint_t, int, const mdb_arg_t *);
3546432Sas200622 static int smb_dcmd_ofile(uintptr_t, uint_t, int, const mdb_arg_t *);
3556432Sas200622 static void smb_node_help(void);
3566432Sas200622 static int smb_node(uintptr_t, uint_t, int, const mdb_arg_t *);
3576432Sas200622 static int smb_node_walk_init(mdb_walk_state_t *);
3586432Sas200622 static int smb_node_walk_step(mdb_walk_state_t *);
3596432Sas200622 static int smb_lock(uintptr_t, uint_t, int, const mdb_arg_t *);
3606432Sas200622 static int smb_stats(uintptr_t, uint_t, int, const mdb_arg_t *);
3616432Sas200622 static int smb_ace(uintptr_t, uint_t, int, const mdb_arg_t *);
3626432Sas200622 static int smb_ace_walk_init(mdb_walk_state_t *);
3636432Sas200622 static int smb_ace_walk_step(mdb_walk_state_t *);
3646432Sas200622 static int smb_acl(uintptr_t, uint_t, int, const mdb_arg_t *);
3656432Sas200622 static int smb_sd(uintptr_t, uint_t, int, const mdb_arg_t *);
3666432Sas200622 static int smb_sid(uintptr_t, uint_t, int, const mdb_arg_t *);
3676432Sas200622 static int smb_sid_print(uintptr_t);
3686432Sas200622 static int smb_fssd(uintptr_t, uint_t, int, const mdb_arg_t *);
3696432Sas200622 static int smb_dcmd_getopt(uint_t *, int, const mdb_arg_t *);
3706432Sas200622 static int smb_dcmd_setopt(uint_t, int, mdb_arg_t *);
3716432Sas200622 static int smb_obj_expand(uintptr_t, uint_t, const smb_exp_t *, ulong_t);
3726432Sas200622 static int smb_obj_list(const char *, uint_t, uint_t);
3736139Sjb150015 
3746432Sas200622 /*
3756432Sas200622  * MDB module linkage information:
3766432Sas200622  *
3776432Sas200622  * We declare a list of structures describing our dcmds, a list of structures
3786432Sas200622  * describing our walkers and a function named _mdb_init to return a pointer
3796432Sas200622  * to our module information.
3806432Sas200622  */
3816432Sas200622 static const mdb_dcmd_t dcmds[] = {
3826432Sas200622 	{   "smblist",
3836432Sas200622 	    "[-seutfdwv]",
3846432Sas200622 	    "print tree of SMB objects",
3856432Sas200622 	    smb_dcmd_list,
3866432Sas200622 	    smb_dcmd_list_help },
3876432Sas200622 	{   "smbsrv",
3886432Sas200622 	    "[-seutfdwv]",
3896432Sas200622 	    "print smb_server information",
3906432Sas200622 	    smb_dcmd_server },
3916432Sas200622 	{   "smbvfs",
3926432Sas200622 	    "[-v]",
3936432Sas200622 	    "print smb_vfs information",
3946432Sas200622 	    smb_dcmd_vfs },
3956432Sas200622 	{   "smbnode",
3966432Sas200622 	    "?[-vps]",
3976432Sas200622 	    "print smb_node_t information",
3986432Sas200622 	    smb_node,
3996432Sas200622 	    smb_node_help },
4006432Sas200622 	{   "smbsess",
4016432Sas200622 	    "[-utfdwv]",
4026432Sas200622 	    "print smb_session_t information",
4036432Sas200622 	    smb_dcmd_session,
4046432Sas200622 	    smb_dcmd_session_help},
4056432Sas200622 	{   "smbreq",
4066432Sas200622 	    ":[-v]",
4076432Sas200622 	    "print smb_request_t information",
4086432Sas200622 	    smb_dcmd_request },
4096432Sas200622 	{   "smblock", ":[-v]",
4106432Sas200622 	    "print smb_lock_t information", smb_lock },
4116432Sas200622 	{   "smbuser",
4126432Sas200622 	    ":[-vdftq]",
4136432Sas200622 	    "print smb_user_t information",
4146432Sas200622 	    smb_dcmd_user,
4156432Sas200622 	    smb_dcmd_user_help },
4166432Sas200622 	{   "smbtree",
4176432Sas200622 	    ":[-vdf]",
4186432Sas200622 	    "print smb_tree_t information",
4196432Sas200622 	    smb_dcmd_tree,
4206432Sas200622 	    smb_dcmd_tree_help },
4216432Sas200622 	{   "smbodir",
4226432Sas200622 	    ":[-v]",
4236432Sas200622 	    "print smb_odir_t information",
4246432Sas200622 	    smb_dcmd_odir },
4256432Sas200622 	{   "smbofile",
4266432Sas200622 	    "[-v]",
4276432Sas200622 	    "print smb_odir_t information",
4286432Sas200622 	    smb_dcmd_ofile },
4296432Sas200622 	{   "smbstats", NULL,
4306432Sas200622 	    "print all smb dispatched requests statistics", smb_stats },
4316432Sas200622 	{   "smbace", "[-v]",
4326432Sas200622 	    "print smb_ace_t information", smb_ace },
4336432Sas200622 	{   "smbacl", "[-v]",
4346432Sas200622 	    "print smb_acl_t information", smb_acl },
4356432Sas200622 	{   "smbsid", "[-v]",
4366432Sas200622 	    "print smb_sid_t information", smb_sid },
4376432Sas200622 	{   "smbsd", "[-v]",
4386432Sas200622 	    "print smb_sd_t information", smb_sd },
4396432Sas200622 	{   "smbfssd", "[-v]",
4406432Sas200622 	    "print smb_fssd_t information", smb_fssd },
4416432Sas200622 	{ NULL }
4426432Sas200622 };
4435331Samw 
4446432Sas200622 static const mdb_walker_t walkers[] = {
4456432Sas200622 	{   "smbnode_walker",
4466432Sas200622 	    "walk list of smb_node_t structures",
4476432Sas200622 	    smb_node_walk_init,
4486432Sas200622 	    smb_node_walk_step,
4496432Sas200622 	    NULL,
4506432Sas200622 	    NULL },
4516432Sas200622 	{   "smbace_walker",
4526432Sas200622 	    "walk list of smb_ace_t structures",
4536432Sas200622 	    smb_ace_walk_init,
4546432Sas200622 	    smb_ace_walk_step,
4556432Sas200622 	    NULL,
4566432Sas200622 	    NULL },
4576432Sas200622 	{ NULL }
4586432Sas200622 };
4595331Samw 
4606432Sas200622 static const mdb_modinfo_t modinfo = {
4616432Sas200622 	MDB_API_VERSION, dcmds, walkers
4626432Sas200622 };
4636432Sas200622 
4646432Sas200622 const mdb_modinfo_t *
4656432Sas200622 _mdb_init(void)
4665331Samw {
4676432Sas200622 	return (&modinfo);
4685331Samw }
4695331Samw 
4705331Samw /*
4716432Sas200622  * *****************************************************************************
4726432Sas200622  * ****************************** Top level DCMD *******************************
4736432Sas200622  * *****************************************************************************
4745331Samw  */
4756432Sas200622 
4766432Sas200622 static void
4776432Sas200622 smb_dcmd_list_help(void)
4786432Sas200622 {
4796432Sas200622 	mdb_printf(
4806432Sas200622 	    "Displays the list of objects using an indented tree format.\n"
4816432Sas200622 	    "If no option is specified the entire tree is displayed\n\n");
4826432Sas200622 	(void) mdb_dec_indent(2);
4836432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
4846432Sas200622 	(void) mdb_inc_indent(2);
4856432Sas200622 	mdb_printf(
4866432Sas200622 	    "-v\tDisplay verbose information\n"
4876432Sas200622 	    "-s\tDisplay the list of servers\n"
4886432Sas200622 	    "-m\tDisplay the list of shared file systems\n"
4896432Sas200622 	    "-e\tDisplay the list of sessions\n"
4906432Sas200622 	    "-r\tDisplay the list of smb requests\n"
4916432Sas200622 	    "-u\tDisplay the list of users\n"
4926432Sas200622 	    "-t\tDisplay the list of trees\n"
4936432Sas200622 	    "-f\tDisplay the list of open files\n"
4946432Sas200622 	    "-d\tDisplay the list of open searches\n");
4956432Sas200622 }
4966432Sas200622 
4976432Sas200622 /*
4986432Sas200622  * ::smblist
4996432Sas200622  *
5006432Sas200622  * This function lists the objects specified on the command line. If no object
5016432Sas200622  * is specified the entire tree (server through ofile and odir) is displayed.
5026432Sas200622  *
5036432Sas200622  */
5046432Sas200622 /*ARGSUSED*/
5055331Samw static int
5066432Sas200622 smb_dcmd_list(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5075331Samw {
5085331Samw 	GElf_Sym	sym;
5096432Sas200622 	uint_t		opts = 0;
5106432Sas200622 	int		new_argc;
5116432Sas200622 	mdb_arg_t	new_argv[SMB_MDB_MAX_OPTS];
5126432Sas200622 
5136432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
5146432Sas200622 		return (DCMD_USAGE);
5156432Sas200622 
5166432Sas200622 	if (!(opts & ~(SMB_OPT_WALK | SMB_OPT_VERBOSE)))
5176432Sas200622 		opts |= SMB_OPT_ALL_OBJ;
5186432Sas200622 
5196432Sas200622 	opts |= SMB_OPT_WALK;
5206432Sas200622 
5216432Sas200622 	new_argc = smb_dcmd_setopt(opts, SMB_MDB_MAX_OPTS, new_argv);
5226432Sas200622 
5236432Sas200622 	if (mdb_lookup_by_name("smb_servers", &sym) == -1) {
5246432Sas200622 		mdb_warn("failed to find symbol smb_servers");
5256432Sas200622 		return (DCMD_ERR);
5266432Sas200622 	}
5276432Sas200622 
5286432Sas200622 	addr = (uintptr_t)sym.st_value + offsetof(smb_llist_t, ll_list);
5296432Sas200622 
5306432Sas200622 	if (mdb_pwalk_dcmd("list", "smbsrv", new_argc, new_argv, addr))
5316432Sas200622 		return (DCMD_ERR);
5326432Sas200622 	return (DCMD_OK);
5336432Sas200622 }
5346432Sas200622 
5356432Sas200622 /*
5366432Sas200622  * *****************************************************************************
5376432Sas200622  * ***************************** smb_server_t **********************************
5386432Sas200622  * *****************************************************************************
5396432Sas200622  */
5406432Sas200622 
5416432Sas200622 static const char *smb_server_state[SMB_SERVER_STATE_SENTINEL] =
5426432Sas200622 {
5436432Sas200622 	"CREATED",
5446432Sas200622 	"CONFIGURED",
5456432Sas200622 	"RUNNING",
5466432Sas200622 	"DELETING"
5476432Sas200622 };
5486432Sas200622 
5496432Sas200622 /*
5506432Sas200622  * List of objects that can be expanded under a server structure.
5516432Sas200622  */
5526432Sas200622 static const smb_exp_t smb_server_exp[] =
5536432Sas200622 {
5546432Sas200622 	{ SMB_OPT_ALL_OBJ,
5556432Sas200622 	    offsetof(smb_server_t, sv_nbt_daemon.ld_session_list.se_rdy.lst),
5566432Sas200622 	    "smbsess", "smb_session"},
5576432Sas200622 	{ SMB_OPT_ALL_OBJ,
5586432Sas200622 	    offsetof(smb_server_t, sv_nbt_daemon.ld_session_list.se_act.lst),
5596432Sas200622 	    "smbsess", "smb_session"},
5606432Sas200622 	{ SMB_OPT_ALL_OBJ,
5616432Sas200622 	    offsetof(smb_server_t, sv_tcp_daemon.ld_session_list.se_rdy.lst),
5626432Sas200622 	    "smbsess", "smb_session"},
5636432Sas200622 	{ SMB_OPT_ALL_OBJ,
5646432Sas200622 	    offsetof(smb_server_t, sv_tcp_daemon.ld_session_list.se_act.lst),
5656432Sas200622 	    "smbsess", "smb_session"},
5666432Sas200622 	{ SMB_OPT_ALL_OBJ,
5676432Sas200622 	    offsetof(smb_server_t, sv_vfs_list.ll_list),
5686432Sas200622 	    "smbvfs", "smb_vfs"},
5696432Sas200622 	{ 0, 0, NULL, NULL }
5706432Sas200622 };
5716432Sas200622 
5726432Sas200622 /*
5736432Sas200622  * ::smbsrv
5746432Sas200622  *
5756432Sas200622  * smbsrv dcmd - Print out smb_server structures.
5766432Sas200622  */
5776432Sas200622 /*ARGSUSED*/
5786432Sas200622 static int
5796432Sas200622 smb_dcmd_server(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
5806432Sas200622 {
5816432Sas200622 	uint_t		opts;
5826432Sas200622 	ulong_t		indent = 0;
5835331Samw 
5846432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
5856432Sas200622 		return (DCMD_USAGE);
5866432Sas200622 
5876432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
5886432Sas200622 		return (smb_obj_list("smb_server", opts | SMB_OPT_SERVER,
5896432Sas200622 		    flags));
5906432Sas200622 
5916432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_SERVER)) ||
5926432Sas200622 	    !(opts & SMB_OPT_WALK)) {
5936432Sas200622 		smb_server_t	*sv;
5946432Sas200622 		const char	*state;
5956432Sas200622 
5966432Sas200622 		sv = mdb_alloc(sizeof (smb_server_t), UM_SLEEP | UM_GC);
5976432Sas200622 		if (mdb_vread(sv, sizeof (smb_server_t), addr) == -1) {
5986432Sas200622 			mdb_warn("failed to read smb_server at %p", addr);
5996432Sas200622 			return (DCMD_ERR);
6005331Samw 		}
6016432Sas200622 
6026432Sas200622 		indent = SMB_DCMD_INDENT;
6036432Sas200622 
6046432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
6056432Sas200622 			mdb_arg_t	argv;
6066432Sas200622 
6076432Sas200622 			argv.a_type = MDB_TYPE_STRING;
6086432Sas200622 			argv.a_un.a_str = "smb_server_t";
6096432Sas200622 			if (mdb_call_dcmd("print", addr, flags, 1, &argv))
6106432Sas200622 				return (DCMD_ERR);
6116432Sas200622 		} else {
6126432Sas200622 			if (DCMD_HDRSPEC(flags))
6136432Sas200622 				mdb_printf(
6146432Sas200622 				    "%<b>%<u>%-?s% "
6156432Sas200622 				    "%-4s% "
6166432Sas200622 				    "%-32s% "
6176432Sas200622 				    "%-6s% "
6186432Sas200622 				    "%-6s% "
6196432Sas200622 				    "%-6s%</u>%</b>\n",
6206432Sas200622 				    "SERVER", "ZONE", "STATE", "USERS",
6216432Sas200622 				    "TREES", "FILES");
6226432Sas200622 
6236432Sas200622 			if (sv->sv_state >= SMB_SERVER_STATE_SENTINEL)
6246432Sas200622 				state = "UNKNOWN";
6256432Sas200622 			else
6266432Sas200622 				state = smb_server_state[sv->sv_state];
6276432Sas200622 
6286432Sas200622 			mdb_printf("%-?p %-4d %-32s %-6d %-6d %-6d \n",
6296432Sas200622 			    addr, sv->sv_zid, state, sv->sv_open_users,
6306432Sas200622 			    sv->sv_open_trees, sv->sv_open_files);
6316432Sas200622 		}
6326432Sas200622 	}
6336432Sas200622 	if (smb_obj_expand(addr, opts, smb_server_exp, indent))
6346432Sas200622 		return (DCMD_ERR);
6356432Sas200622 	return (DCMD_OK);
6366432Sas200622 }
6376432Sas200622 
6386432Sas200622 /*
6396432Sas200622  * *****************************************************************************
6406432Sas200622  * ******************************** smb_vfs_t **********************************
6416432Sas200622  * *****************************************************************************
6426432Sas200622  */
6436432Sas200622 
6446432Sas200622 /*
6456432Sas200622  * ::smbvfs
6466432Sas200622  *
6476432Sas200622  * smbvfs dcmd - Prints out smb_vfs structures.
6486432Sas200622  */
6496432Sas200622 /*ARGSUSED*/
6506432Sas200622 static int
6516432Sas200622 smb_dcmd_vfs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
6526432Sas200622 {
6536432Sas200622 
6546432Sas200622 	uint_t		opts;
6556432Sas200622 
6566432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
6576432Sas200622 		return (DCMD_USAGE);
6586432Sas200622 
6596432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
6606432Sas200622 		return (smb_obj_list("smb_vfs", SMB_OPT_VFS, flags));
6615331Samw 	}
6625331Samw 
6636432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_VFS)) ||
6646432Sas200622 	    !(opts & SMB_OPT_WALK)) {
6656432Sas200622 		smb_vfs_t	*sf;
6666432Sas200622 		vnode_t		*vn;
6676432Sas200622 		char		*path;
6686432Sas200622 
6696432Sas200622 		sf = mdb_alloc(sizeof (*sf), UM_SLEEP | UM_GC);
6706432Sas200622 		if (mdb_vread(sf, sizeof (*sf), addr) == -1) {
6716432Sas200622 			mdb_warn("failed to read smb_vfs at %p", addr);
6726432Sas200622 			return (DCMD_ERR);
6736432Sas200622 		}
6746432Sas200622 		vn = mdb_alloc(sizeof (*vn), UM_SLEEP | UM_GC);
6756432Sas200622 		if (mdb_vread(vn, sizeof (*vn),
6766432Sas200622 		    (uintptr_t)sf->sv_rootvp) == -1) {
6776432Sas200622 			mdb_warn("failed to read vnode at %p", sf->sv_rootvp);
6786432Sas200622 			return (DCMD_ERR);
6796432Sas200622 		}
6806432Sas200622 		path = mdb_zalloc(MAXPATHLEN, UM_SLEEP | UM_GC);
6816432Sas200622 		(void) mdb_vread(path, MAXPATHLEN, (uintptr_t)vn->v_path);
6826432Sas200622 
6836432Sas200622 		if (DCMD_HDRSPEC(flags))
6846432Sas200622 			mdb_printf(
6856432Sas200622 			    "%<b>%<u>"
6866432Sas200622 			    "%-?s "
6876432Sas200622 			    "%-10s "
6886432Sas200622 			    "%-16s "
6896432Sas200622 			    "%-16s"
6906432Sas200622 			    "%-s"
6916432Sas200622 			    "%</u>%</b>\n",
6926432Sas200622 			    "SMB_VFS", "REFCNT", "VFS", "VNODE", "ROOT");
6936432Sas200622 		mdb_printf(
6946432Sas200622 		    "%-?p %-10d %-?p %-?p %-s\n", addr, sf->sv_refcnt,
6956432Sas200622 		    sf->sv_vfsp, sf->sv_rootvp, path);
6966432Sas200622 	}
6976432Sas200622 	return (DCMD_OK);
6986432Sas200622 }
6996432Sas200622 
7006432Sas200622 /*
7016432Sas200622  * *****************************************************************************
7026432Sas200622  * ***************************** smb_session_t *********************************
7036432Sas200622  * *****************************************************************************
7046432Sas200622  */
7056432Sas200622 
7066432Sas200622 static const char *smb_session_state[SMB_SESSION_STATE_SENTINEL] =
7076432Sas200622 {
7086432Sas200622 	"INITIALIZED",
7096432Sas200622 	"DISCONNECTED",
7106432Sas200622 	"CONNECTED",
7116432Sas200622 	"ESTABLISHED",
7126432Sas200622 	"NEGOTIATED",
7136432Sas200622 	"OPLOCK_BREAKING",
7146432Sas200622 	"WRITE_RAW_ACTIVE",
7156432Sas200622 	"TERMINATED"
7166432Sas200622 };
7176432Sas200622 
7186432Sas200622 /*
7196432Sas200622  * List of objects that can be expanded under a session structure.
7206432Sas200622  */
7216432Sas200622 static const smb_exp_t smb_session_exp[] =
7226432Sas200622 {
7236432Sas200622 	{ SMB_OPT_REQUEST,
7246432Sas200622 	    offsetof(smb_session_t, s_req_list.sl_list),
7256432Sas200622 	    "smbreq", "smb_request"},
7266432Sas200622 	{ SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_OFILE | SMB_OPT_ODIR,
7276432Sas200622 	    offsetof(smb_session_t, s_user_list.ll_list),
7286432Sas200622 	    "smbuser", "smb_user"},
7296432Sas200622 	{ 0, 0, NULL, NULL}
7306432Sas200622 };
7316432Sas200622 
7326432Sas200622 static void
7336432Sas200622 smb_dcmd_session_help(void)
7346432Sas200622 {
7356432Sas200622 	mdb_printf(
7366432Sas200622 	    "Display the contents of smb_session_t, with optional"
7376432Sas200622 	    " filtering.\n\n");
7386432Sas200622 	(void) mdb_dec_indent(2);
7396432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
7406432Sas200622 	(void) mdb_inc_indent(2);
7416432Sas200622 	mdb_printf(
7426432Sas200622 	    "-v\tDisplay verbose smb_session information\n"
7436432Sas200622 	    "-r\tDisplay the list of smb requests attached\n"
7446432Sas200622 	    "-u\tDisplay the list of users attached\n");
7456432Sas200622 }
7466432Sas200622 
7476432Sas200622 /*
7486432Sas200622  * ::smbsess
7496432Sas200622  *
7506432Sas200622  * smbsess dcmd - Print out the smb_session structure.
7516432Sas200622  */
7526432Sas200622 /*ARGSUSED*/
7536432Sas200622 static int
7546432Sas200622 smb_dcmd_session(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7556432Sas200622 {
7566432Sas200622 	uint_t		opts;
7576432Sas200622 	ulong_t		indent = 0;
7586432Sas200622 
7596432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
7606432Sas200622 		return (DCMD_USAGE);
7616432Sas200622 
7626432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
7636432Sas200622 		opts |= SMB_OPT_SESSION;
7646432Sas200622 		opts &= ~SMB_OPT_SERVER;
7656432Sas200622 		return (smb_obj_list("smb_session", opts, flags));
7666432Sas200622 	}
7676432Sas200622 
7686432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_SESSION)) ||
7696432Sas200622 	    !(opts & SMB_OPT_WALK)) {
7706432Sas200622 		smb_session_t	*se;
7716432Sas200622 		const char	*state;
7726432Sas200622 
7736432Sas200622 		indent = SMB_DCMD_INDENT;
7746432Sas200622 
7756432Sas200622 		se = mdb_alloc(sizeof (*se), UM_SLEEP | UM_GC);
7766432Sas200622 		if (mdb_vread(se, sizeof (*se), addr) == -1) {
7776432Sas200622 			mdb_warn("failed to read smb_session at %p", addr);
7786432Sas200622 			return (DCMD_ERR);
7796432Sas200622 		}
7806432Sas200622 
7816432Sas200622 		if (se->s_state >= SMB_SESSION_STATE_SENTINEL)
7826432Sas200622 			state = "INVALID";
7836432Sas200622 		else
7846432Sas200622 			state = smb_session_state[se->s_state];
7856432Sas200622 
7866432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
7876432Sas200622 			mdb_printf("%<b>%<u>SMB session information "
7886432Sas200622 			    "(%p): %</u>%</b>\n", addr);
7896432Sas200622 			mdb_printf("Client IP address: %I\n", se->ipaddr);
7906432Sas200622 			mdb_printf("Local IP Address: %I\n", se->local_ipaddr);
7916432Sas200622 			mdb_printf("Session KID: %u\n", se->s_kid);
7926432Sas200622 			mdb_printf("Workstation Name: %s\n",
7936432Sas200622 			    se->workstation);
7946432Sas200622 			mdb_printf("Session state: %u (%s)\n", se->s_state,
7956432Sas200622 			    state);
7966432Sas200622 			mdb_printf("Number of Users: %u\n",
7976432Sas200622 			    se->s_user_list.ll_count);
7986432Sas200622 			mdb_printf("Number of Trees: %u\n", se->s_tree_cnt);
7996432Sas200622 			mdb_printf("Number of Files: %u\n", se->s_file_cnt);
8006432Sas200622 			mdb_printf("Number of Shares: %u\n", se->s_dir_cnt);
8016432Sas200622 			mdb_printf("Number of active Transact.: %u\n\n",
8026432Sas200622 			    se->s_xa_list.ll_count);
8036432Sas200622 		} else {
8046432Sas200622 			if (DCMD_HDRSPEC(flags))
8056432Sas200622 				mdb_printf(
8066432Sas200622 				    "%<b>%<u>%-?s "
8076432Sas200622 				    "%-16s "
8086432Sas200622 				    "%-16s%</u>\n",
8096432Sas200622 				    "SESSION", "CLIENT_IP_ADDR",
8106432Sas200622 				    "LOCAL_IP_ADDR");
8116432Sas200622 			mdb_printf(
8126432Sas200622 			    "%-?p %-16I %-16I\n", addr, se->ipaddr,
8136432Sas200622 			    se->local_ipaddr);
8145331Samw 		}
8155331Samw 	}
8166432Sas200622 	if (smb_obj_expand(addr, opts, smb_session_exp, indent))
8176432Sas200622 		return (DCMD_ERR);
8186432Sas200622 	return (DCMD_OK);
8196432Sas200622 }
8205331Samw 
8216432Sas200622 /*
8226432Sas200622  * *****************************************************************************
8236432Sas200622  * **************************** smb_request_t **********************************
8246432Sas200622  * *****************************************************************************
8256432Sas200622  */
8266432Sas200622 
8276432Sas200622 static const char *smb_request_state[SMB_REQ_STATE_SENTINEL] =
8286432Sas200622 {
8296432Sas200622 	"FREE",
8306432Sas200622 	"INITIALIZING",
8316432Sas200622 	"SUBMITTED",
8326432Sas200622 	"ACTIVE",
8336432Sas200622 	"WAITING_EVENT",
8346432Sas200622 	"EVENT_OCCURRED",
8356432Sas200622 	"WAITING_LOCK",
8366432Sas200622 	"COMPLETED",
8376432Sas200622 	"CANCELED",
8386432Sas200622 	"CLEANED_UP"
8396432Sas200622 };
8406432Sas200622 
8416432Sas200622 static int
8426432Sas200622 smb_dcmd_request(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
8436432Sas200622 {
8446432Sas200622 	uint_t		opts;
8456432Sas200622 
8466432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
8476432Sas200622 		return (DCMD_USAGE);
8486432Sas200622 
8496432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
8506432Sas200622 		opts |= SMB_OPT_REQUEST;
8516432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_USER);
8526432Sas200622 		return (smb_obj_list("smb_request", opts, flags));
8536432Sas200622 	}
8546432Sas200622 
8556432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_REQUEST)) ||
8566432Sas200622 	    !(opts & SMB_OPT_WALK)) {
8576432Sas200622 		smb_request_t	*sr;
8586432Sas200622 		const char	*state;
8596432Sas200622 
8606432Sas200622 		sr = mdb_alloc(sizeof (*sr), UM_SLEEP | UM_GC);
8616432Sas200622 		if (mdb_vread(sr, sizeof (*sr), addr) == -1) {
8626432Sas200622 			mdb_warn("failed to read smb_request at %p", addr);
8636432Sas200622 			return (DCMD_ERR);
8646432Sas200622 		}
8656432Sas200622 
8666432Sas200622 		if (sr->sr_state >= SMB_REQ_STATE_SENTINEL)
8676432Sas200622 			state = "INVALID";
8686432Sas200622 		else
8696432Sas200622 			state = smb_request_state[sr->sr_state];
8706432Sas200622 
8716432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
8726432Sas200622 			mdb_printf(
8736432Sas200622 			    "%<b>%<u>SMB request information (%p):"
8746432Sas200622 			    "%</u>%</b>\n\n", addr);
8756432Sas200622 			mdb_printf("First SMB COM: %u (%s)\n",
8766432Sas200622 			    sr->first_smb_com,
8776432Sas200622 			    smb_com[sr->first_smb_com]);
8786432Sas200622 			mdb_printf("State: %u (%s)\n", sr->sr_state, state);
8796432Sas200622 			mdb_printf("Tree: %u (%p)\n", sr->smb_tid,
8806432Sas200622 			    sr->tid_tree);
8816432Sas200622 			mdb_printf("User: %u (%p)\n", sr->smb_uid,
8826432Sas200622 			    sr->uid_user);
8836432Sas200622 			mdb_printf("File: %u (%p)\n",
8846432Sas200622 			    sr->smb_fid, sr->fid_ofile);
8856432Sas200622 			mdb_printf("PID: %u\n", sr->smb_pid);
8866432Sas200622 			mdb_printf("MID: %u\n\n", sr->smb_mid);
8876432Sas200622 		} else {
8886432Sas200622 			if (DCMD_HDRSPEC(flags))
8896432Sas200622 				mdb_printf(
8906432Sas200622 				    "%<b>%<u>"
8916432Sas200622 				    "%-?s "
8926432Sas200622 				    "%s%</u>%</b>\n"
8936432Sas200622 				    "ADDR", "COM");
8946432Sas200622 
8956432Sas200622 			mdb_printf("%-?p %s\n", addr, state,
8966432Sas200622 			    smb_com[sr->first_smb_com]);
8976432Sas200622 		}
8986432Sas200622 	}
8996432Sas200622 	return (DCMD_OK);
9006432Sas200622 }
9016432Sas200622 
9026432Sas200622 /*
9036432Sas200622  * *****************************************************************************
9046432Sas200622  * ****************************** smb_user_t ***********************************
9056432Sas200622  * *****************************************************************************
9066432Sas200622  */
9076432Sas200622 
9086432Sas200622 static const char *smb_user_state[SMB_USER_STATE_SENTINEL] =
9096432Sas200622 {
9106432Sas200622 	"LOGGED_IN",
9116432Sas200622 	"LOGGING_OFF",
9126432Sas200622 	"LOGGED_OFF"
9136432Sas200622 };
9146432Sas200622 
9156432Sas200622 /*
9166432Sas200622  * List of objects that can be expanded under a user structure.
9176432Sas200622  */
9186432Sas200622 static const smb_exp_t smb_user_exp[] =
9196432Sas200622 {
9206432Sas200622 	{ SMB_OPT_TREE | SMB_OPT_OFILE | SMB_OPT_ODIR,
9216432Sas200622 	    offsetof(smb_user_t, u_tree_list.ll_list),
9226432Sas200622 	    "smbtree", "smb_tree"},
9236432Sas200622 	{ 0, 0, NULL, NULL}
9246432Sas200622 };
9256432Sas200622 
9266432Sas200622 static void
9276432Sas200622 smb_dcmd_user_help(void)
9286432Sas200622 {
9296432Sas200622 	mdb_printf(
9306432Sas200622 	    "Display the contents of smb_user_t, with optional filtering.\n\n");
9316432Sas200622 	(void) mdb_dec_indent(2);
9326432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
9336432Sas200622 	(void) mdb_inc_indent(2);
9346432Sas200622 	mdb_printf(
9356432Sas200622 	    "-v\tDisplay verbose smb_user information\n"
9366432Sas200622 	    "-d\tDisplay the list of smb_odirs attached\n"
9376432Sas200622 	    "-f\tDisplay the list of smb_ofiles attached\n"
9386432Sas200622 	    "-t\tDisplay the list of smb_trees attached\n");
9395331Samw }
9405331Samw 
9415331Samw static int
9426432Sas200622 smb_dcmd_user(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9435331Samw {
9446432Sas200622 	uint_t		opts;
9456432Sas200622 	ulong_t		indent = 0;
9466432Sas200622 
9476432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
9486432Sas200622 		return (DCMD_USAGE);
9496432Sas200622 
9506432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
9516432Sas200622 		opts |= SMB_OPT_USER;
9526432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST);
9536432Sas200622 		return (smb_obj_list("smb_user", opts, flags));
9546432Sas200622 	}
9556432Sas200622 
9566432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_USER)) ||
9576432Sas200622 	    !(opts & SMB_OPT_WALK)) {
9586432Sas200622 		smb_user_t	*user;
9596432Sas200622 		char		*account;
9606432Sas200622 
9616432Sas200622 		indent = SMB_DCMD_INDENT;
9626432Sas200622 
9636432Sas200622 		user = mdb_alloc(sizeof (*user), UM_SLEEP | UM_GC);
9646432Sas200622 		if (mdb_vread(user, sizeof (*user), addr) == -1) {
9656432Sas200622 			mdb_warn("failed to read smb_user at %p", addr);
9666432Sas200622 			return (DCMD_ERR);
9676432Sas200622 		}
9686432Sas200622 
9696432Sas200622 		account = mdb_zalloc(user->u_domain_len + user->u_name_len + 2,
9706432Sas200622 		    UM_SLEEP | UM_GC);
9716432Sas200622 
9726432Sas200622 		if (user->u_domain_len)
9736432Sas200622 			(void) mdb_vread(account, user->u_domain_len,
9746432Sas200622 			    (uintptr_t)user->u_domain);
9756432Sas200622 
9766432Sas200622 		strcat(account, "\\");
9776432Sas200622 
9786432Sas200622 		if (user->u_name_len)
9796432Sas200622 			(void) mdb_vread(account + strlen(account),
9806432Sas200622 			    user->u_name_len, (uintptr_t)user->u_name);
9816432Sas200622 
9826432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
9836432Sas200622 			const char	*state;
9846432Sas200622 
9856432Sas200622 			if (user->u_state >= SMB_USER_STATE_SENTINEL)
9866432Sas200622 				state = "INVALID";
9876432Sas200622 			else
9886432Sas200622 				state = smb_user_state[user->u_state];
9896432Sas200622 
9906432Sas200622 			mdb_printf("%<b>%<u>SMB user information (%p):"
9916432Sas200622 			    "%</u>%</b>\n", addr);
9926432Sas200622 			mdb_printf("UID: %u\n", user->u_uid);
9936432Sas200622 			mdb_printf("State: %d (%s)\n", user->u_state, state);
9946432Sas200622 			mdb_printf("Flags: 0x%08x\n", user->u_flags);
9956432Sas200622 			mdb_printf("Privileges: 0x%08x\n", user->u_privileges);
9966432Sas200622 			mdb_printf("Credential: %p\n", user->u_cred);
9976432Sas200622 			mdb_printf("Reference Count: %d\n", user->u_refcnt);
9986432Sas200622 			mdb_printf("User Account: %s\n\n", account);
9996432Sas200622 		} else {
10006432Sas200622 			if (DCMD_HDRSPEC(flags))
10016432Sas200622 				mdb_printf(
10026432Sas200622 				    "%<b>%<u>%?-s "
10036432Sas200622 				    "%-5s "
10046432Sas200622 				    "%-32s%</u>%</b>\n",
10056432Sas200622 				    "USER", "UID", "ACCOUNT");
10066432Sas200622 
10076432Sas200622 			mdb_printf("%-?p %-5u %-32s\n", addr, user->u_uid,
10086432Sas200622 			    account);
10096432Sas200622 		}
10106432Sas200622 	}
10116432Sas200622 	if (smb_obj_expand(addr, opts, smb_user_exp, indent))
10126432Sas200622 		return (DCMD_ERR);
10136432Sas200622 	return (DCMD_OK);
10145331Samw }
10155331Samw 
10165331Samw /*
10176432Sas200622  * *****************************************************************************
10186432Sas200622  * ****************************** smb_tree_t ***********************************
10196432Sas200622  * *****************************************************************************
10205331Samw  */
10216432Sas200622 
10226432Sas200622 static const char *smb_tree_state[SMB_TREE_STATE_SENTINEL] =
10236432Sas200622 {
10246432Sas200622 	"CONNECTED",
10256432Sas200622 	"DISCONNECTING",
10266432Sas200622 	"DISCONNECTED"
10276432Sas200622 };
10286432Sas200622 
10296432Sas200622 /*
10306432Sas200622  * List of objects that can be expanded under a tree structure.
10316432Sas200622  */
10326432Sas200622 static const smb_exp_t smb_tree_exp[] =
10335331Samw {
10346432Sas200622 	{ SMB_OPT_OFILE,
10356432Sas200622 	    offsetof(smb_tree_t, t_ofile_list.ll_list),
10366432Sas200622 	    "smbofile", "smb_ofile"},
10376432Sas200622 	{ SMB_OPT_ODIR,
10386432Sas200622 	    offsetof(smb_tree_t, t_odir_list.ll_list),
10396432Sas200622 	    "smbodir", "smb_odir"},
10406432Sas200622 	{ 0, 0, NULL, NULL}
10416432Sas200622 };
10425331Samw 
10436432Sas200622 static void
10446432Sas200622 smb_dcmd_tree_help(void)
10456432Sas200622 {
10466432Sas200622 	mdb_printf(
10476432Sas200622 	    "Display the contents of smb_tree_t, with optional filtering.\n\n");
10486432Sas200622 	(void) mdb_dec_indent(2);
10496432Sas200622 	mdb_printf("%<b>OPTIONS%</b>\n");
10506432Sas200622 	(void) mdb_inc_indent(2);
10516432Sas200622 	mdb_printf(
10526432Sas200622 	    "-v\tDisplay verbose smb_tree information\n"
10536432Sas200622 	    "-d\tDisplay the list of smb_odirs attached\n"
10546432Sas200622 	    "-f\tDisplay the list of smb_ofiles attached\n");
10556432Sas200622 }
10566432Sas200622 
10576432Sas200622 static int
10586432Sas200622 smb_dcmd_tree(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
10596432Sas200622 {
10606432Sas200622 	uint_t		opts;
10616432Sas200622 	ulong_t		indent = 0;
10626432Sas200622 
10636432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
10645331Samw 		return (DCMD_USAGE);
10655331Samw 
10666432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
10676432Sas200622 		opts |= SMB_OPT_TREE;
10686432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST |
10696432Sas200622 		    SMB_OPT_USER);
10706432Sas200622 		return (smb_obj_list("smb_tree", opts, flags));
10716139Sjb150015 	}
10725331Samw 
10736432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_TREE)) ||
10746432Sas200622 	    !(opts & SMB_OPT_WALK)) {
10756432Sas200622 		smb_tree_t	*tree;
10766432Sas200622 
10776432Sas200622 		indent = SMB_DCMD_INDENT;
10786139Sjb150015 
10796432Sas200622 		tree = mdb_alloc(sizeof (*tree), UM_SLEEP | UM_GC);
10806432Sas200622 		if (mdb_vread(tree, sizeof (*tree), addr) == -1) {
10816432Sas200622 			mdb_warn("failed to read smb_tree at %p", addr);
10826432Sas200622 			return (DCMD_ERR);
10836432Sas200622 		}
10846139Sjb150015 
10856432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
10866432Sas200622 			const char	*state;
10876432Sas200622 
10886432Sas200622 			if (tree->t_state >= SMB_TREE_STATE_SENTINEL)
10896432Sas200622 				state = "INVALID";
10906432Sas200622 			else
10916432Sas200622 				state = smb_tree_state[tree->t_state];
10925331Samw 
10936432Sas200622 			mdb_printf("%<b>%<u>SMB tree information (%p):"
10946432Sas200622 			    "%</u>%</b>\n\n", addr);
10956432Sas200622 			mdb_printf("TID: %04x\n", tree->t_tid);
10966432Sas200622 			mdb_printf("State: %d (%s)\n", tree->t_state, state);
10977348SJose.Borrego@Sun.COM 			mdb_printf("Share: %s\n", tree->t_sharename);
10986432Sas200622 			mdb_printf("Resource: %s\n", tree->t_resource);
10997348SJose.Borrego@Sun.COM 			mdb_printf("Type: %s\n", tree->t_typename);
11007348SJose.Borrego@Sun.COM 			mdb_printf("Volume: %s\n", tree->t_volume);
11016432Sas200622 			mdb_printf("Umask: %04x\n", tree->t_umask);
11026432Sas200622 			mdb_printf("Flags: %08x\n", tree->t_flags);
11036432Sas200622 			mdb_printf("SMB Node: %llx\n", tree->t_snode);
11046432Sas200622 			mdb_printf("Reference Count: %d\n\n", tree->t_refcnt);
11056432Sas200622 		} else {
11066432Sas200622 			if (DCMD_HDRSPEC(flags))
11076432Sas200622 				mdb_printf(
11086432Sas200622 				    "%<b>%<u>%-?s %-5s %-16s %-32s%</u>%</b>\n",
11096432Sas200622 				    "TREE", "TID", "SHARE NAME", "RESOURCE");
11106432Sas200622 
11116432Sas200622 			mdb_printf("%-?p %-5u %-16s %-32s\n", addr,
11126432Sas200622 			    tree->t_tid, tree->t_sharename, tree->t_resource);
11136432Sas200622 		}
11145331Samw 	}
11156432Sas200622 	if (smb_obj_expand(addr, opts, smb_tree_exp, indent))
11166432Sas200622 		return (DCMD_ERR);
11175331Samw 	return (DCMD_OK);
11185331Samw }
11195331Samw 
11206432Sas200622 /*
11216432Sas200622  * *****************************************************************************
11226432Sas200622  * ****************************** smb_odir_t ***********************************
11236432Sas200622  * *****************************************************************************
11246432Sas200622  */
11256432Sas200622 
11266432Sas200622 static const char *smb_odir_state[SMB_ODIR_STATE_SENTINEL] =
11275331Samw {
11286432Sas200622 	"OPEN",
11296432Sas200622 	"CLOSING",
11306432Sas200622 	"CLOSED"
11316432Sas200622 };
11325331Samw 
11336432Sas200622 static int
11346432Sas200622 smb_dcmd_odir(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
11356432Sas200622 {
11366432Sas200622 	uint_t		opts;
11376432Sas200622 
11386432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
11396432Sas200622 		return (DCMD_USAGE);
11406432Sas200622 
11416432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
11426432Sas200622 		opts |= SMB_OPT_ODIR;
11436432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST |
11446432Sas200622 		    SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_OFILE);
11456432Sas200622 		return (smb_obj_list("smb_odir", opts, flags));
11465331Samw 	}
11475331Samw 
11486432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_ODIR)) ||
11496432Sas200622 	    !(opts & SMB_OPT_WALK)) {
11506432Sas200622 		smb_odir_t	*od;
11516432Sas200622 
11526432Sas200622 		od = mdb_alloc(sizeof (*od), UM_SLEEP | UM_GC);
11536432Sas200622 		if (mdb_vread(od, sizeof (*od), addr) == -1) {
11546432Sas200622 			mdb_warn("failed to read smb_odir at %p", addr);
11556432Sas200622 			return (DCMD_ERR);
11566432Sas200622 		}
11576432Sas200622 
11586432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
11596432Sas200622 			const char	*state;
11606432Sas200622 
11616432Sas200622 			if (od->d_state >= SMB_ODIR_STATE_SENTINEL)
11626432Sas200622 				state = "INVALID";
11636432Sas200622 			else
11646432Sas200622 				state = smb_odir_state[od->d_state];
11656432Sas200622 
11666432Sas200622 			mdb_printf(
11676432Sas200622 			    "%<b>%<u>SMB odir information (%p):%</u>%</b>\n\n",
11686432Sas200622 			    addr);
11696432Sas200622 			mdb_printf("State: %d (%s)\n", od->d_state, state);
1170*8670SJose.Borrego@Sun.COM 			mdb_printf("SID: %u\n", od->d_odid);
11716432Sas200622 			mdb_printf("Reference Count: %d\n", od->d_refcnt);
11726432Sas200622 			mdb_printf("Pattern: %s\n", od->d_pattern);
1173*8670SJose.Borrego@Sun.COM 			mdb_printf("SMB Node: %p\n\n", od->d_dnode);
11746432Sas200622 		} else {
11756432Sas200622 			if (DCMD_HDRSPEC(flags))
11766432Sas200622 				mdb_printf(
11776432Sas200622 				    "%<u>%-?s "
11786432Sas200622 				    "%-5s "
11796432Sas200622 				    "%-?s "
11806432Sas200622 				    "%-16s%</u>\n",
11816432Sas200622 				    "ODIR", "SID", "VNODE", "PATTERN");
11826432Sas200622 
11836432Sas200622 			mdb_printf("%?p %-5u %-16s %s\n",
1184*8670SJose.Borrego@Sun.COM 			    addr, od->d_odid, od->d_dnode, od->d_pattern);
11855331Samw 		}
11865331Samw 	}
11876432Sas200622 	return (DCMD_OK);
11885331Samw }
11895331Samw 
11906432Sas200622 /*
11916432Sas200622  * *****************************************************************************
11926432Sas200622  * ****************************** smb_ofile_t **********************************
11936432Sas200622  * *****************************************************************************
11946432Sas200622  */
11956432Sas200622 
11966432Sas200622 static const char *smb_ofile_state[SMB_OFILE_STATE_SENTINEL] =
11976432Sas200622 {
11986432Sas200622 	"OPEN",
11996432Sas200622 	"CLOSING",
12006432Sas200622 	"CLOSED"
12016432Sas200622 };
12026432Sas200622 
12036432Sas200622 static int
12046432Sas200622 smb_dcmd_ofile(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
12056432Sas200622 {
12066432Sas200622 	uint_t		opts;
12076432Sas200622 
12086432Sas200622 	if (smb_dcmd_getopt(&opts, argc, argv))
12096432Sas200622 		return (DCMD_USAGE);
12106432Sas200622 
12116432Sas200622 	if (!(flags & DCMD_ADDRSPEC)) {
12126432Sas200622 		opts |= SMB_OPT_OFILE;
12136432Sas200622 		opts &= ~(SMB_OPT_SERVER | SMB_OPT_SESSION | SMB_OPT_REQUEST |
12146432Sas200622 		    SMB_OPT_USER | SMB_OPT_TREE | SMB_OPT_ODIR);
12156432Sas200622 		return (smb_obj_list("smb_ofile", opts, flags));
12166432Sas200622 	}
12176432Sas200622 
12186432Sas200622 	if (((opts & SMB_OPT_WALK) && (opts & SMB_OPT_OFILE)) ||
12196432Sas200622 	    !(opts & SMB_OPT_WALK)) {
12206432Sas200622 		smb_ofile_t	*of;
12216432Sas200622 
12226432Sas200622 		of = mdb_alloc(sizeof (*of), UM_SLEEP | UM_GC);
12236432Sas200622 		if (mdb_vread(of, sizeof (*of), addr) == -1) {
12246432Sas200622 			mdb_warn("failed to read smb_ofile at %p", addr);
12256432Sas200622 			return (DCMD_ERR);
12266432Sas200622 		}
12276432Sas200622 
12286432Sas200622 		if (opts & SMB_OPT_VERBOSE) {
12296432Sas200622 			const char	*state;
12306432Sas200622 
12316432Sas200622 			if (of->f_state >= SMB_ODIR_STATE_SENTINEL)
12326432Sas200622 				state = "INVALID";
12336432Sas200622 			else
12346432Sas200622 				state = smb_ofile_state[of->f_state];
12356432Sas200622 
12366432Sas200622 			mdb_printf(
12376432Sas200622 			    "%<b>%<u>SMB ofile information (%p):%</u>%</b>\n\n",
12386432Sas200622 			    addr);
12396432Sas200622 			mdb_printf("FID: %u\n", of->f_fid);
12406432Sas200622 			mdb_printf("State: %d (%s)\n", of->f_state, state);
12416432Sas200622 			mdb_printf("SMB Node: %p\n", of->f_node);
12426432Sas200622 			mdb_printf("LLF Offset: 0x%llx (%s)\n",
12436432Sas200622 			    of->f_llf_pos,
12446432Sas200622 			    ((of->f_flags & SMB_OFLAGS_LLF_POS_VALID) ?
12456432Sas200622 			    "Valid" : "Invalid"));
12466432Sas200622 			mdb_printf("Flags: 0x%08x\n", of->f_flags);
12476432Sas200622 			mdb_printf("Credential: %p\n\n", of->f_cr);
12486432Sas200622 		} else {
12496432Sas200622 			if (DCMD_HDRSPEC(flags))
12506432Sas200622 				mdb_printf(
12516432Sas200622 				    "%<b>%<u>%-?s "
12526432Sas200622 				    "%-5s "
12536432Sas200622 				    "%-?s "
12546432Sas200622 				    "%-?s%</u>%</b>\n",
12556432Sas200622 				    "OFILE", "FID", "SMB NODE", "CRED");
12566432Sas200622 
12576432Sas200622 			mdb_printf("%?p %-5u %-p %p\n", addr,
12586432Sas200622 			    of->f_fid, of->f_node, of->f_cr);
12596432Sas200622 		}
12606432Sas200622 	}
12616432Sas200622 	return (DCMD_OK);
12626432Sas200622 }
12636432Sas200622 
12646432Sas200622 /*
12656432Sas200622  * *****************************************************************************
12666432Sas200622  * ******************************* smb_node_t **********************************
12676432Sas200622  * *****************************************************************************
12686432Sas200622  */
12696432Sas200622 
12705331Samw static void
12715331Samw smb_node_help(void)
12725331Samw {
12735331Samw 	mdb_printf(
12745331Samw 	    "Display the contents of smb_node_t, with optional filtering.\n\n");
12756432Sas200622 	(void) mdb_dec_indent(2);
12765331Samw 	mdb_printf("%<b>OPTIONS%</b>\n");
12776432Sas200622 	(void) mdb_inc_indent(2);
12785331Samw 	mdb_printf(
12795331Samw 	    "-v\tDisplay verbose smb_node information\n"
12805331Samw 	    "-p\tDisplay the full path of the vnode associated\n"
12815331Samw 	    "-s\tDisplay the stack of the last 16 calls that modified the "
12825331Samw 	    "reference\n\tcount\n");
12835331Samw }
12845331Samw 
12855331Samw /*
12866432Sas200622  * ::smbnode
12875331Samw  *
12885331Samw  * smb_node dcmd - Print out smb_node structure.
12895331Samw  */
12905331Samw static int
12915331Samw smb_node(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
12925331Samw {
12935331Samw 	smb_node_t	node;
12945331Samw 	int		verbose = FALSE;
12955331Samw 	int		print_full_path = FALSE;
12965331Samw 	int		stack_trace = FALSE;
12975331Samw 	vnode_t		vnode;
12985331Samw 	char		od_name[MAXNAMELEN];
12995331Samw 	char		path_name[1024];
13005331Samw 	uintptr_t	list_addr;
13015331Samw 
13025331Samw 	if (mdb_getopts(argc, argv,
13035331Samw 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
13045331Samw 	    'p', MDB_OPT_SETBITS, TRUE, &print_full_path,
13055331Samw 	    's', MDB_OPT_SETBITS, TRUE, &stack_trace,
13065331Samw 	    NULL) != argc)
13075331Samw 		return (DCMD_USAGE);
13085331Samw 
13095331Samw 	/*
13105331Samw 	 * If no smb_node address was specified on the command line, we can
13115331Samw 	 * print out all smb nodes by invoking the smb_node walker, using
13125331Samw 	 * this dcmd itself as the callback.
13135331Samw 	 */
13145331Samw 	if (!(flags & DCMD_ADDRSPEC)) {
13156432Sas200622 		if (mdb_walk_dcmd("smbnode_walker", "smbnode",
13165331Samw 		    argc, argv) == -1) {
13175331Samw 			mdb_warn("failed to walk 'smb_node'");
13185331Samw 			return (DCMD_ERR);
13195331Samw 		}
13205331Samw 		return (DCMD_OK);
13215331Samw 	}
13225331Samw 
13235331Samw 	/*
13245331Samw 	 * If this is the first invocation of the command, print a nice
13255331Samw 	 * header line for the output that will follow.
13265331Samw 	 */
13275331Samw 	if (DCMD_HDRSPEC(flags)) {
13286432Sas200622 		if (verbose) {
13296432Sas200622 			mdb_printf("%<b>%<u>SMB node information:%</u>%</b>\n");
13306432Sas200622 		} else {
13316432Sas200622 			mdb_printf(
13326432Sas200622 			    "%<b>%<u>%-?s "
13336432Sas200622 			    "%-?s "
13346432Sas200622 			    "%-18s "
13356432Sas200622 			    "%-6s "
13366432Sas200622 			    "%-6s "
13376432Sas200622 			    "%-6s%</u>%</b>\n",
13386432Sas200622 			    "ADDR", "VP", "NODE-NAME", "OFILES", "LOCKS",
13396432Sas200622 			    "REF");
13406432Sas200622 		}
13415331Samw 	}
13425331Samw 
13435331Samw 	/*
13446432Sas200622 	 * For each smb_node, we just need to read the smb_node_t struct, read
13456432Sas200622 	 * and then print out the following fields.
13465331Samw 	 */
13475331Samw 	if (mdb_vread(&node, sizeof (node), addr) == sizeof (node)) {
13486432Sas200622 		(void) mdb_snprintf(od_name, sizeof (od_name), "%s",
13496432Sas200622 		    node.od_name);
13505331Samw 		if (print_full_path) {
13515331Samw 			if (mdb_vread(&vnode, sizeof (vnode_t),
13526432Sas200622 			    (uintptr_t)node.vp) == sizeof (vnode_t)) {
13536432Sas200622 				if (mdb_readstr(path_name, sizeof (path_name),
13545331Samw 				    (uintptr_t)vnode.v_path) != 0) {
13555331Samw 					(void) mdb_snprintf(od_name,
13566432Sas200622 					    sizeof (od_name), "N/A");
13575331Samw 				}
13585331Samw 			}
13595331Samw 		}
13605331Samw 		if (verbose) {
13616432Sas200622 			mdb_printf("VP: %p\n", node.vp);
13626432Sas200622 			mdb_printf("Name: %s\n", od_name);
13636432Sas200622 			if (print_full_path)
13646432Sas200622 				mdb_printf("V-node Path: %s\n", path_name);
13656432Sas200622 			mdb_printf("Ofiles: %u\n", node.n_ofile_list.ll_count);
13666432Sas200622 			mdb_printf("Range Locks: %u\n",
13675331Samw 			    node.n_lock_list.ll_count);
13685331Samw 			if (node.n_lock_list.ll_count != 0) {
13695331Samw 				(void) mdb_inc_indent(SMB_DCMD_INDENT);
13705331Samw 				list_addr = addr +
13715331Samw 				    offsetof(smb_node_t, n_lock_list) +
13725331Samw 				    offsetof(smb_llist_t, ll_list);
13736432Sas200622 				if (mdb_pwalk_dcmd("list", "smblock", 0,
13746432Sas200622 				    NULL, list_addr)) {
13755331Samw 					mdb_warn("failed to walk node's active"
13765331Samw 					    " locks");
13775331Samw 				}
13785331Samw 				(void) mdb_dec_indent(SMB_DCMD_INDENT);
13795331Samw 			}
13806432Sas200622 			mdb_printf("Reference Count: %u\n\n", node.n_refcnt);
13815331Samw 		} else {
13826432Sas200622 			mdb_printf("%-?p %-?p %-18s %-6d %-6d %-6d\n",
13835331Samw 			    addr, node.vp, od_name, node.n_ofile_list.ll_count,
13845331Samw 			    node.n_lock_list.ll_count, node.n_refcnt);
13856432Sas200622 			if (print_full_path)
13866432Sas200622 				mdb_printf("\t%s\n", path_name);
13875331Samw 		}
13885331Samw 		if (stack_trace && node.n_audit_buf) {
13895331Samw 			int ctr;
13905331Samw 			smb_audit_buf_node_t *anb;
13915331Samw 
13925331Samw 			anb = mdb_alloc(sizeof (smb_audit_buf_node_t),
13936432Sas200622 			    UM_SLEEP | UM_GC);
13945331Samw 
13955331Samw 			if (mdb_vread(anb, sizeof (*anb),
13965331Samw 			    (uintptr_t)node.n_audit_buf) != sizeof (*anb)) {
13975331Samw 				mdb_warn("failed to read audit buffer");
13985331Samw 				return (DCMD_ERR);
13995331Samw 			}
14005331Samw 			ctr = anb->anb_max_index + 1;
14015331Samw 			anb->anb_index--;
14025331Samw 			anb->anb_index &= anb->anb_max_index;
14035331Samw 
14045331Samw 			while (ctr) {
14055331Samw 				smb_audit_record_node_t	*anr;
14065331Samw 
14075331Samw 				anr = anb->anb_records + anb->anb_index;
14085331Samw 
14095331Samw 				if (anr->anr_depth) {
14105331Samw 					char c[MDB_SYM_NAMLEN];
14115331Samw 					GElf_Sym sym;
14125331Samw 					int i;
14135331Samw 
14145331Samw 					mdb_printf("\nRefCnt: %u\t",
14155331Samw 					    anr->anr_refcnt);
14165331Samw 
14175331Samw 					for (i = 0;
14185331Samw 					    i < anr->anr_depth;
14195331Samw 					    i++) {
14205331Samw 						if (mdb_lookup_by_addr(
14215331Samw 						    anr->anr_stack[i],
14225331Samw 						    MDB_SYM_FUZZY,
14235331Samw 						    c, sizeof (c),
14245331Samw 						    &sym) == -1) {
14255331Samw 							continue;
14265331Samw 						}
14275331Samw 						mdb_printf("%s+0x%1x",
14285331Samw 						    c,
14295331Samw 						    anr->anr_stack[i] -
14305331Samw 						    (uintptr_t)sym.st_value);
14315331Samw 						++i;
14325331Samw 						break;
14335331Samw 					}
14345331Samw 
14355331Samw 					while (i < anr->anr_depth) {
14365331Samw 						if (mdb_lookup_by_addr(
14375331Samw 						    anr->anr_stack[i],
14385331Samw 						    MDB_SYM_FUZZY,
14395331Samw 						    c, sizeof (c),
14405331Samw 						    &sym) == -1) {
14415331Samw 							++i;
14425331Samw 							continue;
14435331Samw 						}
14445331Samw 						mdb_printf("\n\t\t%s+0x%1x",
14455331Samw 						    c,
14465331Samw 						    anr->anr_stack[i] -
14475331Samw 						    (uintptr_t)sym.st_value);
14485331Samw 						++i;
14495331Samw 					}
14505331Samw 					mdb_printf("\n");
14515331Samw 				}
14525331Samw 				anb->anb_index--;
14535331Samw 				anb->anb_index &= anb->anb_max_index;
14545331Samw 				ctr--;
14555331Samw 			}
14565331Samw 		}
14575331Samw 	} else {
14585331Samw 		mdb_warn("failed to read struct smb_node at %p", addr);
14595331Samw 		return (DCMD_ERR);
14605331Samw 	}
14615331Samw 
14625331Samw 	return (DCMD_OK);
14635331Samw }
14645331Samw 
14656432Sas200622 /*
14666432Sas200622  * Initialize the smb_node_t walker by reading the value of smb_node_hash_table
14676432Sas200622  * in the kernel's symbol table. Only global walk supported.
14686432Sas200622  */
14696432Sas200622 static int
14706432Sas200622 smb_node_walk_init(mdb_walk_state_t *wsp)
14715331Samw {
14726432Sas200622 	GElf_Sym	sym;
14736432Sas200622 	int		i;
14746432Sas200622 	uintptr_t	node_hash_table_addr;
14756432Sas200622 
14766432Sas200622 	if (wsp->walk_addr == NULL) {
14776432Sas200622 		if (mdb_lookup_by_name("smb_node_hash_table", &sym) == -1) {
14786432Sas200622 			mdb_warn("failed to find 'smb_node_hash_table'");
14796432Sas200622 			return (WALK_ERR);
14806432Sas200622 		}
14816432Sas200622 		node_hash_table_addr = (uintptr_t)sym.st_value;
14826432Sas200622 	} else {
14836432Sas200622 		mdb_printf("smb_node walk only supports global walks\n");
14846432Sas200622 		return (WALK_ERR);
14856432Sas200622 	}
14866432Sas200622 
14876432Sas200622 	for (i = 0; i < SMBND_HASH_MASK + 1; i++) {
14886432Sas200622 		wsp->walk_addr = node_hash_table_addr +
14896432Sas200622 		    (i * sizeof (smb_llist_t)) + offsetof(smb_llist_t, ll_list);
14906432Sas200622 		if (mdb_layered_walk("list", wsp) == -1) {
14916432Sas200622 			mdb_warn("failed to walk 'list'");
14926432Sas200622 			return (WALK_ERR);
14936432Sas200622 		}
14946432Sas200622 	}
14956432Sas200622 
14966432Sas200622 	return (WALK_NEXT);
14976432Sas200622 }
14986432Sas200622 
14996432Sas200622 static int
15006432Sas200622 smb_node_walk_step(mdb_walk_state_t *wsp)
15016432Sas200622 {
15026432Sas200622 	return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer,
15036432Sas200622 	    wsp->walk_cbdata));
15045331Samw }
15055331Samw 
15065331Samw /*
15076432Sas200622  * *****************************************************************************
15086432Sas200622  * ****************************** smb_lock_t ***********************************
15096432Sas200622  * *****************************************************************************
15105331Samw  */
15115331Samw 
15125331Samw static int
15135331Samw smb_lock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
15145331Samw {
15155331Samw 	smb_lock_t	lock;
15165331Samw 	int		verbose = FALSE;
15175331Samw 	uintptr_t	list_addr;
15185331Samw 	char		*lock_type;
15195331Samw 
15205331Samw 	if (mdb_getopts(argc, argv,
15215331Samw 	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
15225331Samw 	    NULL) != argc)
15235331Samw 		return (DCMD_USAGE);
15245331Samw 
15255331Samw 	/*
15265331Samw 	 * An smb_lock_t address must be specified.
15275331Samw 	 */
15285331Samw 	if (!(flags & DCMD_ADDRSPEC))
15295331Samw 		return (DCMD_USAGE);
15305331Samw 
15315331Samw 	/*
15325331Samw 	 * If this is the first invocation of the command, print a nice
15335331Samw 	 * header line for the output that will follow.
15345331Samw 	 */
15355331Samw 	if (DCMD_HDRSPEC(flags)) {
15365331Samw 		if (verbose)
15375331Samw 			mdb_printf("SMB lock information:\n\n");
15385331Samw 		else
15395331Samw 			mdb_printf("%<u>%-?s %4s %16s %8s %9s%</u>\n",
15405331Samw 			    "Locks: ", "TYPE", "START", "LENGTH",
15415331Samw 			    "CONFLICTS");
15425331Samw 	}
15435331Samw 
15445331Samw 	if (mdb_vread(&lock, sizeof (lock), addr) == sizeof (lock)) {
15455331Samw 		switch (lock.l_type) {
15465331Samw 		case SMB_LOCK_TYPE_READWRITE:
15475331Samw 			lock_type = "RW";
15485331Samw 			break;
15495331Samw 		case SMB_LOCK_TYPE_READONLY:
15505331Samw 			lock_type = "RO";
15515331Samw 			break;
15525331Samw 		default:
15535331Samw 			lock_type = "N/A";
15545331Samw 			break;
15555331Samw 		}
15565331Samw 		if (verbose) {
15575331Samw 			mdb_printf("Type             :\t%s (%u)\n",
15585331Samw 			    lock_type, lock.l_type);
15595331Samw 			mdb_printf("Start            :\t%llx\n",
15605331Samw 			    lock.l_start);
15615331Samw 			mdb_printf("Length           :\t%lx\n",
15625331Samw 			    lock.l_length);
15635331Samw 			mdb_printf("Session          :\t%p\n",
15645331Samw 			    lock.l_session);
15655331Samw 			mdb_printf("File             :\t%p\n",
15665331Samw 			    lock.l_file);
15675331Samw 			mdb_printf("User ID          :\t%u\n",
15685331Samw 			    lock.l_uid);
15695331Samw 			mdb_printf("Process ID       :\t%u\n",
15705331Samw 			    lock.l_pid);
15715331Samw 			mdb_printf("Conflicts        :\t%u\n",
15725331Samw 			    lock.l_conflict_list.sl_count);
15735331Samw 			if (lock.l_conflict_list.sl_count != 0) {
15745331Samw 				(void) mdb_inc_indent(SMB_DCMD_INDENT);
15755331Samw 				list_addr = addr +
15765331Samw 				    offsetof(smb_lock_t, l_conflict_list) +
15775331Samw 				    offsetof(smb_slist_t, sl_list);
15785331Samw 				if (mdb_pwalk_dcmd("list", "smb_lock",
15795331Samw 				    0, NULL, list_addr)) {
15805331Samw 					mdb_warn("failed to walk conflict "
15815331Samw 					    "locks ");
15825331Samw 				}
15835331Samw 				(void) mdb_dec_indent(SMB_DCMD_INDENT);
15845331Samw 			}
15855331Samw 			mdb_printf("Blocked by       :\t%p\n",
15865331Samw 			    lock.l_blocked_by);
15875331Samw 			mdb_printf("Flags            :\t0x%x\n",
15885331Samw 			    lock.l_flags);
15895331Samw 			mdb_printf("\n");
15905331Samw 		} else {
15915331Samw 			mdb_printf("%?p %4s %16llx %08lx %9x", addr,
15925331Samw 			    lock_type, lock.l_start, lock.l_length,
15935331Samw 			    lock.l_conflict_list.sl_count);
15945331Samw 		}
15955331Samw 	} else {
15965331Samw 		mdb_warn("failed to read struct smb_request at %p", addr);
15975331Samw 		return (DCMD_ERR);
15985331Samw 	}
15995331Samw 
16005331Samw 	return (DCMD_OK);
16015331Samw }
16025331Samw 
16035331Samw /*
16045331Samw  * ::smb_dispatch_stats
16055331Samw  *
16065331Samw  * smb_dispatch_stats dcmd - Prints all dispatched SMB requests statistics.
16075331Samw  */
16085331Samw /*ARGSUSED*/
16095331Samw static int
16106432Sas200622 smb_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
16115331Samw {
16125331Samw 	smb_dispatch_table_t	*disp;
16135331Samw 	GElf_Sym		sym;
16145331Samw 	int			nstats = 0, i;
16155331Samw 
16165331Samw 	if ((flags & DCMD_ADDRSPEC) || argc != 0)
16175331Samw 		return (DCMD_USAGE);
16185331Samw 
16195331Samw 	if (mdb_lookup_by_obj(MDB_OBJ_EVERY, "dispatch", &sym)) {
16205331Samw 		mdb_warn("failed to find dispatch object");
16215331Samw 		return (DCMD_ERR);
16225331Samw 	}
16235331Samw 
16245331Samw 	disp = mdb_alloc(sym.st_size, UM_SLEEP | UM_GC);
16255331Samw 	if (mdb_vread(disp, sym.st_size, sym.st_value) == -1) {
16265331Samw 		mdb_warn("failed to read from dispatch object");
16275331Samw 		return (DCMD_ERR);
16285331Samw 	}
16295331Samw 
16305331Samw 	nstats = sym.st_size / sizeof (smb_dispatch_table_t);
16315331Samw 
16325331Samw 	mdb_printf("All dispatched SMB requests statistics:\n\n");
16335331Samw 	for (i = 0; i < nstats; i++) {
16345331Samw 		if (disp[i].sdt_function)
16355331Samw 			mdb_printf("    %40s\t: %lld\n",
16365331Samw 			    disp[i].sdt_dispatch_stats.name,
16375331Samw 			    disp[i].sdt_dispatch_stats.value.ui64);
16385331Samw 	}
16395331Samw 	return (DCMD_OK);
16405331Samw }
16415331Samw 
16425331Samw /*
16436432Sas200622  * *****************************************************************************
16446432Sas200622  * ******************************** smb_ace_t **********************************
16456432Sas200622  * *****************************************************************************
16465331Samw  */
16476432Sas200622 static const ace_type_entry_t	ace_types[ACE_TYPE_TABLEN] =
16486432Sas200622 {
16496432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_ACE_TYPE),
16506432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_ACE_TYPE),
16516432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_ACE_TYPE),
16526432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_ACE_TYPE),
16536432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_COMPOUND_ACE_TYPE),
16546432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE),
16556432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_OBJECT_ACE_TYPE),
16566432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE),
16576432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE),
16586432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_CALLBACK_ACE_TYPE),
16596432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_CALLBACK_ACE_TYPE),
16606432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE),
16616432Sas200622 	ACE_TYPE_ENTRY(ACE_ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE),
16626432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_CALLBACK_ACE_TYPE),
16636432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_CALLBACK_ACE_TYPE),
16646432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE),
16656432Sas200622 	ACE_TYPE_ENTRY(ACE_SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE),
16666432Sas200622 	ACE_TYPE_ENTRY(0x11),
16676432Sas200622 	ACE_TYPE_ENTRY(0x12),
16686432Sas200622 	ACE_TYPE_ENTRY(0x13),
16696432Sas200622 	ACE_TYPE_ENTRY(0x14),
16706432Sas200622 	ACE_TYPE_ENTRY(0x15),
16716432Sas200622 	ACE_TYPE_ENTRY(0x16),
16726432Sas200622 	ACE_TYPE_ENTRY(0x17),
16736432Sas200622 	ACE_TYPE_ENTRY(0x18),
16746432Sas200622 	ACE_TYPE_ENTRY(0x19),
16756432Sas200622 	ACE_TYPE_ENTRY(0x1A),
16766432Sas200622 	ACE_TYPE_ENTRY(0x1B),
16776432Sas200622 	ACE_TYPE_ENTRY(0x1C),
16786432Sas200622 	ACE_TYPE_ENTRY(0x1D),
16796432Sas200622 	ACE_TYPE_ENTRY(0x1E),
16806432Sas200622 	ACE_TYPE_ENTRY(0x1F)
16816432Sas200622 };
16826432Sas200622 
16836432Sas200622 static const mdb_bitmask_t ace_flag_bits[] = {
16846432Sas200622 	{ "OBJECT_INHERIT_ACE", OBJECT_INHERIT_ACE, OBJECT_INHERIT_ACE },
16856432Sas200622 	{ "CONTAINER_INHERIT_ACE", CONTAINER_INHERIT_ACE,
16866432Sas200622 	    CONTAINER_INHERIT_ACE },
16876432Sas200622 	{ "NO_PROPOGATE_INHERIT_ACE", NO_PROPOGATE_INHERIT_ACE,
16886432Sas200622 	    NO_PROPOGATE_INHERIT_ACE },
16896432Sas200622 	{ "INHERIT_ONLY_ACE", INHERIT_ONLY_ACE, INHERIT_ONLY_ACE },
16906432Sas200622 	{ "INHERITED_ACE", INHERITED_ACE, INHERITED_ACE },
16916432Sas200622 	{ "SUCCESSFUL_ACCESS_ACE_FLAG", SUCCESSFUL_ACCESS_ACE_FLAG,
16926432Sas200622 	    SUCCESSFUL_ACCESS_ACE_FLAG },
16936432Sas200622 	{ "FAILED_ACCESS_ACE_FLAG", FAILED_ACCESS_ACE_FLAG,
16946432Sas200622 	    FAILED_ACCESS_ACE_FLAG },
16956432Sas200622 	{ NULL, 0, 0 }
16965331Samw };
16975331Samw 
16986432Sas200622 /*
16996432Sas200622  * ::smbace
17006432Sas200622  */
17016432Sas200622 static int
17026432Sas200622 smb_ace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
17036432Sas200622 {
17046432Sas200622 	smb_ace_t	ace;
17056432Sas200622 	int		verbose = FALSE;
17066432Sas200622 	const char	*ptr;
17076432Sas200622 	int		rc;
17086432Sas200622 
17096432Sas200622 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose,
17106432Sas200622 	    NULL) != argc)
17116432Sas200622 		return (DCMD_USAGE);
17126432Sas200622 
17136432Sas200622 	/*
17146432Sas200622 	 * An smb_ace address is required.
17156432Sas200622 	 */
17166432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
17176432Sas200622 		return (DCMD_USAGE);
17186432Sas200622 
17196432Sas200622 	if (mdb_vread(&ace, sizeof (ace), addr) != sizeof (ace)) {
17206432Sas200622 		mdb_warn("failed to read struct smb_ace at %p", addr);
17216432Sas200622 		return (DCMD_ERR);
17226432Sas200622 	}
17236432Sas200622 
17246432Sas200622 	if (verbose) {
17256432Sas200622 		if (ace.se_hdr.se_type < ACE_TYPE_TABLEN)
17266432Sas200622 			ptr = ace_types[ace.se_hdr.se_type].ace_type_sting;
17276432Sas200622 		else
17286432Sas200622 			ptr = "Unknown";
17296432Sas200622 
17306432Sas200622 		mdb_printf("ACE Type: 0x%02x (%s)\n", ace.se_hdr.se_type, ptr);
17316432Sas200622 		mdb_printf("ACE Flags: %b\n", (int)ace.se_hdr.se_flags,
17326432Sas200622 		    ace_flag_bits);
17336432Sas200622 		mdb_printf("ACE Wire Size: 0x%04x\n", ace.se_hdr.se_bsize);
17346432Sas200622 		mdb_printf("ACE Mask: 0x%08x\n", ace.se_mask);
17356432Sas200622 		mdb_printf("ACE SID: ");
17366432Sas200622 	} else {
17376432Sas200622 		if (DCMD_HDRSPEC(flags))
17386432Sas200622 			mdb_printf(
17396432Sas200622 			    "%<b>%<u>%?-s %-4s %-4s %-8s %s%</u>%</b>\n",
17406432Sas200622 			    "ACE", "TYPE", "FLAGS", "MASK", "SID");
17416432Sas200622 		mdb_printf("%?p 0x%02x 0x%02x 0x%08x ", addr,
17426432Sas200622 		    ace.se_hdr.se_type, ace.se_hdr.se_flags, ace.se_mask);
17436432Sas200622 	}
17446432Sas200622 	rc = smb_sid_print((uintptr_t)ace.se_sid);
17456432Sas200622 	mdb_printf("\n");
17466432Sas200622 	return (rc);
17476432Sas200622 }
17486432Sas200622 
17496432Sas200622 static int
17506432Sas200622 smb_ace_walk_init(mdb_walk_state_t *wsp)
17516432Sas200622 {
17526432Sas200622 	if (wsp->walk_addr == 0) {
17536432Sas200622 		mdb_printf("smb_ace walk only supports local walks\n");
17546432Sas200622 		return (WALK_ERR);
17556432Sas200622 	}
17566432Sas200622 
17576432Sas200622 	wsp->walk_addr += offsetof(smb_acl_t, sl_sorted);
17586432Sas200622 
17596432Sas200622 	if (mdb_layered_walk("list", wsp) == -1) {
17606432Sas200622 		mdb_warn("failed to walk list of ACEs");
17616432Sas200622 		return (WALK_ERR);
17626432Sas200622 	}
17636432Sas200622 
17646432Sas200622 	return (WALK_NEXT);
17656432Sas200622 }
17666432Sas200622 
17676432Sas200622 static int
17686432Sas200622 smb_ace_walk_step(mdb_walk_state_t *wsp)
17696432Sas200622 {
17706432Sas200622 	return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer,
17716432Sas200622 	    wsp->walk_cbdata));
17726432Sas200622 }
17736432Sas200622 
17746432Sas200622 /*
17756432Sas200622  * *****************************************************************************
17766432Sas200622  * ******************************** smb_acl_t **********************************
17776432Sas200622  * *****************************************************************************
17786432Sas200622  */
17796432Sas200622 
17806432Sas200622 /*
17816432Sas200622  * ::smbacl
17826432Sas200622  */
17836432Sas200622 static int
17846432Sas200622 smb_acl(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
17856432Sas200622 {
17866432Sas200622 	smb_acl_t	acl;
17876432Sas200622 
17886432Sas200622 	/* An smb_acl address is required. */
17896432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
17906432Sas200622 		return (DCMD_USAGE);
17916432Sas200622 
17926432Sas200622 	if (mdb_vread(&acl, sizeof (acl), addr) != sizeof (acl)) {
17936432Sas200622 		mdb_warn("failed to read struct smb_acl at %p", addr);
17946432Sas200622 		return (DCMD_ERR);
17956432Sas200622 	}
17966432Sas200622 
17976432Sas200622 	mdb_printf("ACL Revision: %d\n", acl.sl_revision);
17986432Sas200622 	mdb_printf("ACL Size on Wire: %d\n", acl.sl_bsize);
17996432Sas200622 	mdb_printf("ACL Number of ACEs: %d\n", acl.sl_acecnt);
18006432Sas200622 
18016432Sas200622 	(void) mdb_inc_indent(SMB_DCMD_INDENT);
18026432Sas200622 	if (mdb_pwalk_dcmd("smbace_walker", "smbace", argc, argv, addr)) {
18036432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
18046432Sas200622 		mdb_warn("failed to walk list of ACEs for ACL %p", addr);
18056432Sas200622 		return (DCMD_ERR);
18066432Sas200622 	}
18076432Sas200622 	(void) mdb_dec_indent(SMB_DCMD_INDENT);
18086432Sas200622 	return (DCMD_OK);
18096432Sas200622 }
18106432Sas200622 
18116432Sas200622 /*
18126432Sas200622  * *****************************************************************************
18136432Sas200622  * ********************************* smb_sd_t **********************************
18146432Sas200622  * *****************************************************************************
18156432Sas200622  */
18166432Sas200622 
18176432Sas200622 /*
18186432Sas200622  * ::smbsd
18196432Sas200622  */
18206432Sas200622 static int
18216432Sas200622 smb_sd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
18226432Sas200622 {
18236432Sas200622 	smb_sd_t	sd;
18246432Sas200622 	int		rc;
18256432Sas200622 
18266432Sas200622 	/*
18276432Sas200622 	 * An smb_sid address is required.
18286432Sas200622 	 */
18296432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
18306432Sas200622 		return (DCMD_USAGE);
18316432Sas200622 
18326432Sas200622 	if (mdb_vread(&sd, sizeof (sd), addr) != sizeof (sd)) {
18336432Sas200622 		mdb_warn("failed to read struct smb_sd at %p", addr);
18346432Sas200622 		return (DCMD_ERR);
18356432Sas200622 	}
18366432Sas200622 
18376432Sas200622 	mdb_printf("SD Revision: %d\n", sd.sd_revision);
18386432Sas200622 	mdb_printf("SD Control: %04x\n", sd.sd_control);
18396432Sas200622 	if (sd.sd_control & SE_OWNER_DEFAULTED)
18406432Sas200622 		mdb_printf("\t    SE_OWNER_DEFAULTED\n");
18416432Sas200622 	if (sd.sd_control & SE_GROUP_DEFAULTED)
18426432Sas200622 		mdb_printf("\t    SE_GROUP_DEFAULTED\n");
18436432Sas200622 	if (sd.sd_control & SE_DACL_PRESENT)
18446432Sas200622 		mdb_printf("\t    SE_DACL_PRESENT\n");
18456432Sas200622 	if (sd.sd_control & SE_DACL_DEFAULTED)
18466432Sas200622 		mdb_printf("\t    SE_DACL_DEFAULTED\n");
18476432Sas200622 	if (sd.sd_control & SE_SACL_PRESENT)
18486432Sas200622 		mdb_printf("\t    SE_SACL_PRESENT\n");
18496432Sas200622 	if (sd.sd_control & SE_SACL_DEFAULTED)
18506432Sas200622 		mdb_printf("\t    SE_SACL_DEFAULTED\n");
18516432Sas200622 	if (sd.sd_control & SE_DACL_AUTO_INHERIT_REQ)
18526432Sas200622 		mdb_printf("\t    SE_DACL_AUTO_INHERIT_REQ\n");
18536432Sas200622 	if (sd.sd_control & SE_SACL_AUTO_INHERIT_REQ)
18546432Sas200622 		mdb_printf("\t    SE_SACL_AUTO_INHERIT_REQ\n");
18556432Sas200622 	if (sd.sd_control & SE_DACL_AUTO_INHERITED)
18566432Sas200622 		mdb_printf("\t    SE_DACL_AUTO_INHERITED\n");
18576432Sas200622 	if (sd.sd_control & SE_SACL_AUTO_INHERITED)
18586432Sas200622 		mdb_printf("\t    SE_SACL_AUTO_INHERITED\n");
18596432Sas200622 	if (sd.sd_control & SE_DACL_PROTECTED)
18606432Sas200622 		mdb_printf("\t    SE_DACL_PROTECTED\n");
18616432Sas200622 	if (sd.sd_control & SE_SACL_PROTECTED)
18626432Sas200622 		mdb_printf("\t    SE_SACL_PROTECTED\n");
18636432Sas200622 	if (sd.sd_control & SE_SELF_RELATIVE)
18646432Sas200622 		mdb_printf("\t    SE_SELF_RELATIVE\n");
18656432Sas200622 
18666432Sas200622 	mdb_printf("SID of Owner: ");
18676432Sas200622 	rc = smb_sid_print((uintptr_t)sd.sd_owner);
18686432Sas200622 	if (rc != DCMD_OK)
18696432Sas200622 		return (rc);
18706432Sas200622 	mdb_printf("\nSID of Group: ");
18716432Sas200622 	rc = smb_sid_print((uintptr_t)sd.sd_group);
18726432Sas200622 	if (rc != DCMD_OK)
18736432Sas200622 		return (rc);
18746432Sas200622 	mdb_printf("\n");
18756432Sas200622 
18766432Sas200622 	if (sd.sd_control & SE_SACL_PRESENT && sd.sd_sacl) {
18776432Sas200622 		mdb_printf("%<b>%<u>System ACL%</u>%</b>\n");
18786432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
18796432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)sd.sd_sacl, flags,
18806432Sas200622 		    argc, argv);
18816432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
18826432Sas200622 		if (rc != DCMD_OK)
18836432Sas200622 			return (rc);
18846432Sas200622 	}
18856432Sas200622 	if (sd.sd_control & SE_DACL_PRESENT && sd.sd_dacl) {
18866432Sas200622 		mdb_printf("%<b>%<u>Discretionary ACL%</u>%</b>\n");
18876432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
18886432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)sd.sd_dacl, flags,
18896432Sas200622 		    argc, argv);
18906432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
18916432Sas200622 		if (rc != DCMD_OK)
18926432Sas200622 			return (rc);
18936432Sas200622 	}
18946432Sas200622 
18956432Sas200622 	return (DCMD_OK);
18966432Sas200622 }
18976432Sas200622 
18986432Sas200622 /*
18996432Sas200622  * *****************************************************************************
19006432Sas200622  * ********************************* smb_sid_t *********************************
19016432Sas200622  * *****************************************************************************
19026432Sas200622  */
19036432Sas200622 
19046432Sas200622 /*
19056432Sas200622  * ::smbsid
19066432Sas200622  */
19076432Sas200622 /*ARGSUSED*/
19086432Sas200622 static int
19096432Sas200622 smb_sid(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
19106432Sas200622 {
19116432Sas200622 	/*
19126432Sas200622 	 * An smb_sid address is required.
19136432Sas200622 	 */
19146432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
19156432Sas200622 		return (DCMD_USAGE);
19165331Samw 
19176432Sas200622 	return (smb_sid_print(addr));
19186432Sas200622 }
19196432Sas200622 
19206432Sas200622 /*
19216432Sas200622  * smb_sid_print
19226432Sas200622  */
19236432Sas200622 static int
19246432Sas200622 smb_sid_print(uintptr_t addr)
19256432Sas200622 {
19266432Sas200622 	smb_sid_t	sid;
19276432Sas200622 	smb_sid_t	*psid;
19286432Sas200622 	size_t		sid_size;
19296432Sas200622 	int		i;
19306432Sas200622 	uint64_t	authority;
19316432Sas200622 
19326432Sas200622 	sid_size = offsetof(smb_sid_t, sid_subauth);
19336432Sas200622 
19346432Sas200622 	if (mdb_vread(&sid, sid_size, addr) != sid_size) {
19356432Sas200622 		mdb_warn("failed to read struct smb_sid at %p", addr);
19366432Sas200622 		return (DCMD_ERR);
19376432Sas200622 	}
19386432Sas200622 
19396432Sas200622 	sid_size += sid.sid_subauthcnt * sizeof (sid.sid_subauth[0]);
19406432Sas200622 
19416432Sas200622 	psid = mdb_zalloc(sid_size, UM_SLEEP | UM_GC);
19426432Sas200622 	if (mdb_vread(psid, sid_size, addr) != sid_size) {
19436432Sas200622 		mdb_warn("failed to read struct smb_sid at %p", addr);
19446432Sas200622 		return (DCMD_ERR);
19456432Sas200622 	}
19466432Sas200622 
19476432Sas200622 	mdb_printf("S-%d", psid->sid_revision);
19486432Sas200622 	authority = 0;
19496432Sas200622 	for (i = 0; i < NT_SID_AUTH_MAX; i++) {
19506432Sas200622 		authority += ((uint64_t)psid->sid_authority[i]) <<
19516432Sas200622 		    (8 * (NT_SID_AUTH_MAX - 1) - i);
19526432Sas200622 	}
19536432Sas200622 	mdb_printf("-%ll", authority);
19546432Sas200622 
19556432Sas200622 	for (i = 0; i < psid->sid_subauthcnt; i++)
19566432Sas200622 		mdb_printf("-%d", psid->sid_subauth[i]);
19576432Sas200622 
19586432Sas200622 	return (DCMD_OK);
19596432Sas200622 }
19606432Sas200622 
19616432Sas200622 /*
19626432Sas200622  * *****************************************************************************
19636432Sas200622  * ********************************* smb_fssd_t ********************************
19646432Sas200622  * *****************************************************************************
19656432Sas200622  */
19666432Sas200622 
19676432Sas200622 /*
19686432Sas200622  * ::smbfssd
19696432Sas200622  */
19706432Sas200622 static int
19716432Sas200622 smb_fssd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
19726432Sas200622 {
19736432Sas200622 	smb_fssd_t	fssd;
19746432Sas200622 	int		rc;
19756432Sas200622 
19766432Sas200622 	/*
19776432Sas200622 	 * An smb_fssd address is required.
19786432Sas200622 	 */
19796432Sas200622 	if (!(flags & DCMD_ADDRSPEC))
19806432Sas200622 		return (DCMD_USAGE);
19816432Sas200622 
19826432Sas200622 	if (mdb_vread(&fssd, sizeof (fssd), addr) != sizeof (fssd)) {
19836432Sas200622 		mdb_warn("failed to read struct smb_fssd at %p", addr);
19846432Sas200622 		return (DCMD_ERR);
19856432Sas200622 	}
19866432Sas200622 
19876432Sas200622 	mdb_printf("FSSD secinfo: 0x%x\n", fssd.sd_secinfo);
19886432Sas200622 	if (fssd.sd_secinfo & SMB_OWNER_SECINFO)
19896432Sas200622 		mdb_printf("FSSD uid: %d\n", fssd.sd_uid);
19906432Sas200622 	if (fssd.sd_secinfo & SMB_GROUP_SECINFO)
19916432Sas200622 		mdb_printf("FSSD gid: %d\n", fssd.sd_gid);
19926432Sas200622 	if (fssd.sd_secinfo & SMB_SACL_SECINFO && fssd.sd_zsacl) {
19936432Sas200622 		mdb_printf("%<b>%<u>System ACL%</u>%</b>\n");
19946432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
19956432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)fssd.sd_zsacl, flags,
19966432Sas200622 		    argc, argv);
19976432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
19986432Sas200622 		if (rc != DCMD_OK)
19996432Sas200622 			return (rc);
20006432Sas200622 	}
20016432Sas200622 	if (fssd.sd_secinfo & SMB_DACL_SECINFO && fssd.sd_zdacl) {
20026432Sas200622 		mdb_printf("%<b>%<u>Discretionary ACL%</u>%</b>\n");
20036432Sas200622 		(void) mdb_inc_indent(SMB_DCMD_INDENT);
20046432Sas200622 		rc = mdb_call_dcmd("smbacl", (uintptr_t)fssd.sd_zdacl, flags,
20056432Sas200622 		    argc, argv);
20066432Sas200622 		(void) mdb_dec_indent(SMB_DCMD_INDENT);
20076432Sas200622 		if (rc != DCMD_OK)
20086432Sas200622 			return (rc);
20096432Sas200622 	}
20106432Sas200622 
20116432Sas200622 	return (DCMD_OK);
20126432Sas200622 }
20136432Sas200622 
20146432Sas200622 /*
20156432Sas200622  * *****************************************************************************
20166432Sas200622  * **************************** Utility Funcions *******************************
20176432Sas200622  * *****************************************************************************
20186432Sas200622  */
20195331Samw 
20206432Sas200622 /*
20216432Sas200622  * smb_dcmd_getopt
20226432Sas200622  *
20236432Sas200622  * This function analyzes the arguments passed in and sets the bit corresponding
20246432Sas200622  * to the options found in the opts variable.
20256432Sas200622  *
20266432Sas200622  * Return Value
20276432Sas200622  *
20286432Sas200622  *	-1	An error occured during the decoding
20296432Sas200622  *	0	The decoding was successful
20306432Sas200622  */
20316432Sas200622 static int
20326432Sas200622 smb_dcmd_getopt(uint_t *opts, int argc, const mdb_arg_t *argv)
20336432Sas200622 {
20346432Sas200622 	*opts = 0;
20356432Sas200622 
20366432Sas200622 	if (mdb_getopts(argc, argv,
20376432Sas200622 	    's', MDB_OPT_SETBITS, SMB_OPT_SERVER, opts,
20386432Sas200622 	    'm', MDB_OPT_SETBITS, SMB_OPT_VFS, opts,
20396432Sas200622 	    'e', MDB_OPT_SETBITS, SMB_OPT_SESSION, opts,
20406432Sas200622 	    'r', MDB_OPT_SETBITS, SMB_OPT_REQUEST, opts,
20416432Sas200622 	    'u', MDB_OPT_SETBITS, SMB_OPT_USER, opts,
20426432Sas200622 	    't', MDB_OPT_SETBITS, SMB_OPT_TREE, opts,
20436432Sas200622 	    'f', MDB_OPT_SETBITS, SMB_OPT_OFILE, opts,
20446432Sas200622 	    'd', MDB_OPT_SETBITS, SMB_OPT_ODIR, opts,
20456432Sas200622 	    'w', MDB_OPT_SETBITS, SMB_OPT_WALK, opts,
20466432Sas200622 	    'v', MDB_OPT_SETBITS, SMB_OPT_VERBOSE, opts,
20476432Sas200622 	    NULL) != argc)
20486432Sas200622 		return (-1);
20496432Sas200622 
20506432Sas200622 	return (0);
20516432Sas200622 }
20526432Sas200622 
20536432Sas200622 /*
20546432Sas200622  * smb_dcmd_setopt
20556432Sas200622  *
20566432Sas200622  * This function set the arguments corresponding to the bits set in opts.
20576432Sas200622  *
20586432Sas200622  * Return Value
20596432Sas200622  *
20606432Sas200622  *	Number of arguments set.
20616432Sas200622  */
20626432Sas200622 static int
20636432Sas200622 smb_dcmd_setopt(uint_t opts, int max_argc, mdb_arg_t *argv)
20645331Samw {
20656432Sas200622 	int	i;
20666432Sas200622 	uint_t	mask = 0x00000001;
20676432Sas200622 	int	argc = 0;
20686432Sas200622 
20696432Sas200622 	for (i = 0; i < SMB_MDB_MAX_OPTS; i++) {
20706432Sas200622 		if ((opts & mask) && (argc < max_argc)) {
20716432Sas200622 			argv->a_type = MDB_TYPE_STRING;
20726432Sas200622 			argv->a_un.a_str = smb_opts[i];
20736432Sas200622 			argc++;
20746432Sas200622 			argv++;
20756432Sas200622 		}
20766432Sas200622 		mask = mask << 1;
20776432Sas200622 	}
20786432Sas200622 	return (argc);
20795331Samw }
20806432Sas200622 
20816432Sas200622 /*
20826432Sas200622  * smb_obj_expand
20836432Sas200622  */
20846432Sas200622 static int
20856432Sas200622 smb_obj_expand(uintptr_t addr, uint_t opts, const smb_exp_t *x, ulong_t indent)
20866432Sas200622 {
20876432Sas200622 	int		rc = 0;
20886432Sas200622 	int		argc;
20896432Sas200622 	mdb_arg_t	argv[SMB_MDB_MAX_OPTS];
20906432Sas200622 
20916432Sas200622 	argc = smb_dcmd_setopt(opts | SMB_OPT_WALK, SMB_MDB_MAX_OPTS, argv);
20926432Sas200622 
20936432Sas200622 	(void) mdb_inc_indent(indent);
20946432Sas200622 	while (x->ex_dcmd) {
20956432Sas200622 		if (x->ex_mask & opts) {
20966432Sas200622 			rc = mdb_pwalk_dcmd("list", x->ex_dcmd, argc, argv,
20976432Sas200622 			    addr + x->ex_offset);
20986432Sas200622 
20996432Sas200622 			if (rc) {
21006432Sas200622 				mdb_warn("failed to walk the list of %s in %p",
21016432Sas200622 				    x->ex_name, addr + x->ex_offset);
21026432Sas200622 				break;
21036432Sas200622 			}
21046432Sas200622 		}
21056432Sas200622 		x++;
21066432Sas200622 	}
21076432Sas200622 	(void) mdb_dec_indent(indent);
21086432Sas200622 	return (rc);
21096432Sas200622 }
21106432Sas200622 
21116432Sas200622 /*
21126432Sas200622  * smb_obj_list
21136432Sas200622  *
21146432Sas200622  * Function called by the DCMDs when no address is provided. It expands the
21156432Sas200622  * tree under the object type associated with the calling DCMD (based on the
21166432Sas200622  * flags passed in).
21176432Sas200622  *
21186432Sas200622  * Return Value
21196432Sas200622  *
21206432Sas200622  *	DCMD_OK
21216432Sas200622  *	DCMD_ERR
21226432Sas200622  */
21236432Sas200622 static int
21246432Sas200622 smb_obj_list(const char *name, uint_t opts, uint_t flags)
21256432Sas200622 {
21266432Sas200622 	int		argc;
21276432Sas200622 	mdb_arg_t	argv[SMB_MDB_MAX_OPTS];
21286432Sas200622 
21296432Sas200622 	argc = smb_dcmd_setopt(opts, SMB_MDB_MAX_OPTS, argv);
21306432Sas200622 
21316432Sas200622 	if (mdb_call_dcmd("smblist", 0, flags, argc, argv)) {
21326432Sas200622 		mdb_warn("failed to list %s", name);
21336432Sas200622 		return (DCMD_ERR);
21346432Sas200622 	}
21356432Sas200622 	return (DCMD_OK);
21366432Sas200622 }
2137