nsmb.c revision 4bff34e37def8a90f9194d81bc345c52ba20086a
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER START
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The contents of this file are subject to the terms of the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Common Development and Distribution License (the "License").
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * You may not use this file except in compliance with the License.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * See the License for the specific language governing permissions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and limitations under the License.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * When distributing Covered Code, include this CDDL HEADER in each
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If applicable, add the following below this CDDL HEADER, with the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * fields enclosed by brackets "[]" replaced with your own identifying
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * information: Portions Copyright [yyyy] [name of copyright owner]
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER END
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Use is subject to license terms.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#pragma ident "%Z%%M% %I% %E% SMI"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define OPT_VERBOSE 0x0001 /* Be [-v]erbose in dcmd's */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We need to read in a private copy
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * of every string we want to print out.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if ((len = mdb_readstr(buf, sizeof (buf), addr)) <= 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walker for smb_connobj_t structures, including
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * smb_vc_t and smb_share_t which "inherit" from it.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Tricky: Exploit the "inheritance" of smb_connobj_t
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * with common functions for walk_init, walk_next.
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smb_co_walk_data {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Common walk_init for walking structs inherited
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * from smb_connobj_t (smb_vc_t, smb_share_t)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Save the parent pointer for later checks, and
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * the level so we know which union member it is.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Also the size of this union member.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Read in the parent object. Just need the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * invariant part (smb_connobj_t) so we can
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * get the list of children below it.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Finally, setup to walk the list of children.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)smbw->u.co.co_children.slh_first;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walk the (global) VC list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("::walk smb_vc only supports global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Locate the VC list head. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_lookup_by_obj("nsmb", "smb_vclist", &sym)) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walk the share list below some VC.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Initial walk_addr is address of parent (VC)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("::walk smb_ss does not support global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Common walk_step for walking structs inherited
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * from smb_connobj_t (smb_vc_t, smb_share_t)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("cannot read connobj from %p", wsp->walk_addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* XXX: Sanity check level? parent pointer? */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow status = wsp->walk_callback(wsp->walk_addr, &smbw->u,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)smbw->u.co.co_next.sle_next;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Dcmd (and callback function) to print a summary of
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * all VCs, and optionally all shares under each VC.
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smb_co_cbdata {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Call-back function for walking a share list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_ss_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Anything wanted here? */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Call-back function for walking the VC list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_vc_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_pwalk("nsmb_ss", smb_ss_cb, cbd, addr) < 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Don't: return (WALK_ERR); */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_vc_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " -r recursive display of share lists\n"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " -v be verbose when displaying smb_vc\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walker for the request list on a VC,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and dcmd to show a summary.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Initial walk_addr is the address of the VC.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Add offsetof(iod_rqlist) to get the rqhead.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("::walk smb_ss does not support global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(&rq, sizeof (rq), wsp->walk_addr) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("cannot read smb_rq from %p", wsp->walk_addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct rqlist_cbdata {
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrqlist_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("// smb_rq_t MID cmd sr_state sr_flags\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*ARGSUSED*/
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrqlist_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Initial walk_addr is address of parent (VC)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_pwalk("nsmb_rqlist", rqlist_cb, &cbd, addr) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * AVL walker for the passwords AVL tree,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and dcmd to show a summary.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("pwtree walk only supports global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_lookup_by_obj("nsmb", "smb_ptd", &sym) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(&ptnode, sizeof (ptnode), wsp->walk_addr) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to read smb_passid_t at %p", wsp->walk_addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (wsp->walk_callback(wsp->walk_addr, &ptnode, wsp->walk_cbdata));
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct pwtree_cbdata {
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Optional filtering by UID. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->uid != (uid_t)-1 && cbd->uid != ptn->uid) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*ARGSUSED*/
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Want the the default radix to be 10 here.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * If the string has some kind of radix prefix,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * just use that as-is, otherwise prepend "0t".
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Cheating on the "not a digit" test, but
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * mdb_strtoull will do a real syntax check.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_pwalk("nsmb_pwtree", pwtree_cb, &cbd, 0) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " -u uid show only entries belonging to uid (decimal)\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "show smb_vc (or list)",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "show smb_rq list on a VC",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "list smb_passid_t (password tree)",