4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER START
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
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 *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * or http://www.opensolaris.org/os/licensing.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * See the License for the specific language governing permissions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and limitations under the License.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
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 *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * CDDL HEADER END
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
430b4c467020edf2445feb0c21db01c88b86243aGordon Ross * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Use is subject to license terms.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/mdb_modapi.h>
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include <mdb/mdb_ctf.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/types.h>
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include <sys/socket.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
430b4c467020edf2445feb0c21db01c88b86243aGordon Ross#include <netsmb/smb_conn.h>
430b4c467020edf2445feb0c21db01c88b86243aGordon Ross#include <netsmb/smb_rq.h>
430b4c467020edf2445feb0c21db01c88b86243aGordon Ross#include <netsmb/smb_pass.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define OPT_VERBOSE 0x0001 /* Be [-v]erbose in dcmd's */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define OPT_RECURSE 0x0002 /* recursive display */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * We need to read in a private copy
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * of every string we want to print out.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowprint_str(uintptr_t addr)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char buf[32];
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int len, mx = sizeof (buf) - 4;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if ((len = mdb_readstr(buf, sizeof (buf), addr)) <= 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" (%p)", addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } else {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (len > mx)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcpy(&buf[mx], "...");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" %s", buf);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
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.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smb_co_walk_data {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uintptr_t pp;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int level; /* SMBL_SM, SMBL_VC, SMBL_SHARE */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int size; /* sizeof (union member) */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow union co_u {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_connobj_t co; /* copy of the list element */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_vc_t vc;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_share_t ss;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } u;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} smb_co_walk_data_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Common walk_init for walking structs inherited
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * from smb_connobj_t (smb_vc_t, smb_share_t)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_co_walk_init(mdb_walk_state_t *wsp, int level)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_co_walk_data_t *smbw;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow size_t psz;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr == NULL)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw = mdb_alloc(sizeof (*smbw), UM_SLEEP | UM_GC);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_data = smbw;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
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 */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw->pp = wsp->walk_addr;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw->level = level;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow switch (level) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case SMBL_SM:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw->size = sizeof (smbw->u.co);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case SMBL_VC:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw->size = sizeof (smbw->u.vc);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case SMBL_SHARE:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw->size = sizeof (smbw->u.ss);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow default:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbw->size = sizeof (smbw->u);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
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 */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow psz = sizeof (smbw->u.co);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(&smbw->u.co, psz, smbw->pp) != psz) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("cannot read connobj from %p", smbw->pp);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Finally, setup to walk the list of children.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)smbw->u.co.co_children.slh_first;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walk the (global) VC list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_vc_walk_init(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow GElf_Sym sym;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr != NULL) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("::walk smb_vc only supports global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Locate the VC list head. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_lookup_by_obj("nsmb", "smb_vclist", &sym)) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to lookup `smb_vclist'\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = sym.st_value;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (smb_co_walk_init(wsp, SMBL_VC));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walk the share list below some VC.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_ss_walk_init(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Initial walk_addr is address of parent (VC)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("::walk smb_ss does not support global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (smb_co_walk_init(wsp, SMBL_SHARE));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Common walk_step for walking structs inherited
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * from smb_connobj_t (smb_vc_t, smb_share_t)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_co_walk_step(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_co_walk_data_t *smbw = wsp->walk_data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int status;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr == NULL)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_DONE);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(&smbw->u, smbw->size, wsp->walk_addr)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow != smbw->size) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("cannot read connobj from %p", wsp->walk_addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* XXX: Sanity check level? parent pointer? */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow status = wsp->walk_callback(wsp->walk_addr, &smbw->u,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_cbdata);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)smbw->u.co.co_next.sle_next;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (status);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Dcmd (and callback function) to print a summary of
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * all VCs, and optionally all shares under each VC.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smb_co_cbdata {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int flags; /* OPT_... */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int printed_header;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_ctf_id_t ctf_id;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} smb_co_cbdata_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Call-back function for walking a share list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_ss_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const smb_share_t *ssp = data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_co_cbdata_t *cbd = arg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf(" %-p\t%s\n", addr, ssp->ss_name);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->flags & OPT_VERBOSE) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_inc_indent(2);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Anything wanted here? */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_dec_indent(2);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic const char *
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvcstate_str(smb_co_cbdata_t *cbd, int stval)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross static const char prefix[] = "SMBIOD_ST_";
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross int prefix_len = sizeof (prefix) - 1;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_ctf_id_t vcst_enum;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross const char *cp;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Got this in smb_vc_dcmd. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross vcst_enum = cbd->ctf_id;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Get the name for the enum value. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if ((cp = mdb_ctf_enum_name(vcst_enum, stval)) == NULL)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return ("?");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Skip the prefix part. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (strncmp(cp, prefix, prefix_len) == 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross cp += prefix_len;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (cp);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Call-back function for walking the VC list.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_vc_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const smb_vc_t *vcp = data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_co_cbdata_t *cbd = arg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->printed_header == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cbd->printed_header = 1;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf("// smb_vc_t uid server \tuser\t\tstate\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("%-p", addr);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf(" %7d", vcp->vc_owner);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross switch (vcp->vc_srvaddr.sa.sa_family) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross case AF_INET:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf(" %I", vcp->vc_srvaddr.sin.sin_addr);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross break;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross case AF_INET6:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf(" %N", &vcp->vc_srvaddr.sin6.sin6_addr);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross break;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross default:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf(" %15s", "(bad af)");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross break;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (vcp->vc_username[0] != '\0')
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf("\t%s", vcp->vc_username);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross else
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf("\t%s", "(?)");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (vcp->vc_domain[0] != '\0')
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf("@%s", vcp->vc_domain);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_printf("\t%s\n", vcstate_str(cbd, vcp->vc_state));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->flags & OPT_RECURSE) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_inc_indent(2);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_pwalk("nsmb_ss", smb_ss_cb, cbd, addr) < 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to walk 'nsmb_ss'");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Don't: return (WALK_ERR); */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_dec_indent(2);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_vc_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_co_cbdata_t cbd;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_vc_t *vcp;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow size_t vcsz;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow memset(&cbd, 0, sizeof (cbd));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_getopts(argc, argv,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow 'r', MDB_OPT_SETBITS, OPT_RECURSE, &cbd.flags,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow 'v', MDB_OPT_SETBITS, OPT_VERBOSE, &cbd.flags,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow NULL) != argc) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_USAGE);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (mdb_ctf_lookup_by_name("enum smbiod_state", &cbd.ctf_id) == -1) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross mdb_warn("Could not find enum smbiod_state");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (!(flags & DCMD_ADDRSPEC)) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_walk("nsmb_vc", smb_vc_cb, &cbd) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to walk 'nsmb_vc'");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_OK);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow vcsz = sizeof (*vcp);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow vcp = mdb_alloc(vcsz, UM_SLEEP | UM_GC);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(vcp, vcsz, addr) != vcsz) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("cannot read VC from %p", addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_vc_cb(addr, vcp, &cbd);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_OK);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_vc_help(void)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("Options:\n"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " -r recursive display of share lists\n"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " -v be verbose when displaying smb_vc\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Walker for the request list on a VC,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and dcmd to show a summary.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrqlist_walk_init(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct smb_rqhead rqh;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uintptr_t addr;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Initial walk_addr is the address of the VC.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Add offsetof(iod_rqlist) to get the rqhead.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("::walk smb_ss does not support global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow addr = wsp->walk_addr;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow addr += OFFSETOF(smb_vc_t, iod_rqlist);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(&rqh, sizeof (rqh), addr) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to read smb_rqhead at %p", addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)rqh.tqh_first;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrqlist_walk_step(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_rq_t rq;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int status;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr == NULL)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_DONE);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_vread(&rq, sizeof (rq), wsp->walk_addr) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("cannot read smb_rq from %p", wsp->walk_addr);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow status = wsp->walk_callback(wsp->walk_addr, &rq,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_cbdata);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)rq.sr_link.tqe_next;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (status);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct rqlist_cbdata {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int printed_header;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uintptr_t uid; /* optional filtering by UID */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} rqlist_cbdata_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrqlist_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const smb_rq_t *rq = data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow rqlist_cbdata_t *cbd = arg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->printed_header == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cbd->printed_header = 1;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("// smb_rq_t MID cmd sr_state sr_flags\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" %-p", addr); /* smb_rq_t */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" x%04x", rq->sr_mid);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" x%02x", rq->sr_cmd);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" %d", rq->sr_state);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" x%x", rq->sr_flags);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*ARGSUSED*/
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrqlist_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow rqlist_cbdata_t cbd;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow memset(&cbd, 0, sizeof (cbd));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Initial walk_addr is address of parent (VC)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (!(flags & DCMD_ADDRSPEC)) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("address required\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_pwalk("nsmb_rqlist", rqlist_cb, &cbd, addr) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to walk 'nsmb_rqlist'");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_OK);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * AVL walker for the passwords AVL tree,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and dcmd to show a summary.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic int
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_walk_init(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow GElf_Sym sym;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (wsp->walk_addr != NULL) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("pwtree walk only supports global walks\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_lookup_by_obj("nsmb", "smb_ptd", &sym) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to find symbol 'smb_ptd'");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow wsp->walk_addr = (uintptr_t)sym.st_value;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_layered_walk("avl", wsp) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to walk 'avl'\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic int
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_walk_step(mdb_walk_state_t *wsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_passid_t ptnode;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
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 (WALK_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (wsp->walk_callback(wsp->walk_addr, &ptnode, wsp->walk_cbdata));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct pwtree_cbdata {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int printed_header;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uid_t uid; /* optional filtering by UID */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} pwtree_cbdata_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_cb(uintptr_t addr, const void *data, void *arg)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const smb_passid_t *ptn = data;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pwtree_cbdata_t *cbd = arg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* Optional filtering by UID. */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->uid != (uid_t)-1 && cbd->uid != ptn->uid) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cbd->printed_header == 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cbd->printed_header = 1;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("// smb_passid_t UID domain user\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" %-p", addr); /* smb_passid_t */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf(" %d", (uintptr_t)ptn->uid);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow print_str((uintptr_t)ptn->srvdom);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow print_str((uintptr_t)ptn->username);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (WALK_NEXT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*ARGSUSED*/
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pwtree_cbdata_t cbd;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *uid_str = NULL;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char buf[32];
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow memset(&cbd, 0, sizeof (cbd));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_getopts(argc, argv,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow 'u', MDB_OPT_STR, &uid_str, NULL) != argc) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_USAGE);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (uid_str) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
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 */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (uid_str[0] == '0' && uid_str[1] > '9') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cbd.uid = (uid_t)mdb_strtoull(uid_str);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } else {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcpy(buf, "0t");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strlcat(buf, uid_str, sizeof (buf));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cbd.uid = (uid_t)mdb_strtoull(buf);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } else
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cbd.uid = (uid_t)-1;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (flags & DCMD_ADDRSPEC) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("address not allowed\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (mdb_pwalk("nsmb_pwtree", pwtree_cb, &cbd, 0) == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_warn("failed to walk 'nsmb_pwtree'");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_ERR);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (DCMD_OK);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowpwtree_help(void)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mdb_printf("Options:\n"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow " -u uid show only entries belonging to uid (decimal)\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic const mdb_dcmd_t dcmds[] = {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_vc", "?[-rv]",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "show smb_vc (or list)",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_vc_dcmd, smb_vc_help },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_rqlist", ":",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "show smb_rq list on a VC",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow rqlist_dcmd, NULL },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_pwtree", "?[-u uid]",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "list smb_passid_t (password tree)",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pwtree_dcmd, pwtree_help },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow {NULL}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow};
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic const mdb_walker_t walkers[] = {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_vc", "walk nsmb VC list",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_vc_walk_init, smb_co_walk_step, NULL },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_ss", "walk nsmb share list for some VC",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_ss_walk_init, smb_co_walk_step, NULL },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_rqlist", "walk request list for some VC",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow rqlist_walk_init, rqlist_walk_step, NULL },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow { "nsmb_pwtree", "walk passord AVL tree",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pwtree_walk_init, pwtree_walk_step, NULL },
4bff34e37def8a90f9194d81bc345c52ba20086athurlow {NULL}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow};
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic const mdb_modinfo_t modinfo = {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow MDB_API_VERSION,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow dcmds,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow walkers
4bff34e37def8a90f9194d81bc345c52ba20086athurlow};
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowconst mdb_modinfo_t *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow_mdb_init(void)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (&modinfo);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}