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