da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * General Structures Layout
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * -------------------------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This is a simplified diagram showing the relationship between most of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * main structures.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_INFO |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SESSION |<----->| SESSION |......| SESSION |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | v
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | +-------------------+ +-------------------+ +-------------------+
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | | USER |<--->| USER |...| USER |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * | +-------------------+ +-------------------+ +-------------------+
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * |
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | TREE |<----->| TREE |......| TREE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | +-------+ +-------+ +-------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | | OFILE |<----->| OFILE |......| OFILE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | +-------+ +-------+ +-------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------+ +------+ +------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | ODIR |<----->| ODIR |......| ODIR |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------+ +------+ +------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Tree State Machine
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ------------------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+ T0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_TREE_STATE_CONNECTED |<----------- Creation/Allocation
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | T1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +------------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_TREE_STATE_DISCONNECTING |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +------------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | T2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * v
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+ T3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_TREE_STATE_DISCONNECTED |----------> Deletion/Free
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * SMB_TREE_STATE_CONNECTED
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * While in this state:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The tree is queued in the list of trees of its user.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - References will be given out if the tree is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - Files under that tree can be accessed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * SMB_TREE_STATE_DISCONNECTING
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * While in this state:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The tree is queued in the list of trees of its user.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - References will not be given out if the tree is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The files and directories open under the tree are being closed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The resources associated with the tree remain.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * SMB_TREE_STATE_DISCONNECTED
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * While in this state:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The tree is queued in the list of trees of its user.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - References will not be given out if the tree is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The tree has no more files and directories opened.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The resources associated with the tree remain.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This transition occurs in smb_tree_connect(). A new tree is created and
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * added to the list of trees of a user.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This transition occurs in smb_tree_disconnect().
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This transition occurs in smb_tree_release(). The resources associated
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * with the tree are freed as well as the tree structure. For the transition
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to occur, the tree must be in the SMB_TREE_STATE_DISCONNECTED state and
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the reference count be zero.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Comments
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * --------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The state machine of the tree structures is controlled by 3 elements:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The list of trees of the user it belongs to.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The mutex embedded in the structure itself.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * - The reference count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * There's a mutex embedded in the tree structure used to protect its fields
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and there's a lock embedded in the list of trees of a user. To
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * increment or to decrement the reference count the mutex must be entered.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * To insert the tree into the list of trees of the user and to remove
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the tree from it, the lock must be entered in RW_WRITER mode.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Rules of access to a tree structure:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1) In order to avoid deadlocks, when both (mutex and lock of the user
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * list) have to be entered, the lock must be entered first.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 2) All actions applied to a tree require a reference count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * 3) There are 2 ways of getting a reference count: when a tree is
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * connected and when a tree is looked up.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * It should be noted that the reference count of a tree registers the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * number of references to the tree in other structures (such as an smb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * request). The reference count is not incremented in these 2 instances:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1) The tree is connected. An tree is anchored by his state. If there's
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * no activity involving a tree currently connected, the reference
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * count of that tree is zero.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 2) The tree is queued in the list of trees of the user. The fact of
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * being queued in that list is NOT registered by incrementing the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * reference count.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego#include <sys/refstr_impl.h>
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown#include <smbsrv/smb_kproto.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <smbsrv/smb_ktypes.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/smb_fsops.h>
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh#include <smbsrv/smb_share.h>
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregoint smb_tcon_mute = 0;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb_tree_connect_core(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb_tree_connect_disk(smb_request_t *, smb_arg_tcon_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb_tree_connect_printq(smb_request_t *, smb_arg_tcon_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb_tree_connect_ipc(smb_request_t *, smb_arg_tcon_t *);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiserstatic smb_tree_t *smb_tree_alloc(smb_request_t *, const smb_kshare_t *,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_t *, uint32_t, uint32_t);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic boolean_t smb_tree_is_connected_locked(smb_tree_t *);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic boolean_t smb_tree_is_disconnected(smb_tree_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic char *smb_tree_get_sharename(char *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic int smb_tree_getattr(const smb_kshare_t *, smb_node_t *, smb_tree_t *);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic void smb_tree_get_volname(vfs_t *, smb_tree_t *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smb_tree_get_flags(const smb_kshare_t *, vfs_t *, smb_tree_t *);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic void smb_tree_log(smb_request_t *, const char *, const char *, ...);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic void smb_tree_close_odirs(smb_tree_t *, uint16_t);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic smb_ofile_t *smb_tree_get_ofile(smb_tree_t *, smb_ofile_t *);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic smb_odir_t *smb_tree_get_odir(smb_tree_t *, smb_odir_t *);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic void smb_tree_set_execinfo(smb_tree_t *, smb_shr_execinfo_t *, int);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic int smb_tree_enum_private(smb_tree_t *, smb_svcenum_t *);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic int smb_tree_netinfo_encode(smb_tree_t *, uint8_t *, size_t, uint32_t *);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic void smb_tree_netinfo_init(smb_tree_t *tree, smb_netconnectinfo_t *);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic void smb_tree_netinfo_fini(smb_netconnectinfo_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshsmb_tree_connect(smb_request_t *sr)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh{
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh smb_server_t *sv = sr->sr_server;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (smb_threshold_enter(&sv->sv_tcon_ct) != 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INSUFF_SERVER_RESOURCES);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_tree_connect_core(sr);
856399cf160942495309c59ac7a9541834573cd3Gordon Ross smb_threshold_exit(&sv->sv_tcon_ct);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh}
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Lookup the share name dispatch the appropriate stype handler.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Share names are case insensitive so we map the share name to
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * lower-case as a convenience for internal processing.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Valid service values are:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * A: Disk share
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * LPT1: Printer
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * IPC Named pipe (IPC$ is reserved as the named pipe share).
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * COMM Communications device
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * ????? Any type of device (wildcard)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshsmb_tree_connect_core(smb_request_t *sr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_arg_tcon_t *tcon = &sr->sr_tcon;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_kshare_t *si;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *name;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_strlwr(tcon->path);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if ((name = smb_tree_get_sharename(tcon->path)) == NULL) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_log(sr, tcon->path, "invalid UNC path");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_NETWORK_NAME);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8622ec4569457733001d4982ef7f5b44427069beGordon Ross si = smb_kshare_lookup(sr->sr_server, name);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross if (si == NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, name, "share not found");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_NETWORK_NAME);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (!strcasecmp(SMB_SHARE_PRINT, name)) {
8622ec4569457733001d4982ef7f5b44427069beGordon Ross smb_kshare_release(sr->sr_server, si);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh smb_tree_log(sr, name, "access not permitted");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_ACCESS_DENIED);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* NB: name points into tcon->path - don't free it. */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->name = name;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sr->sr_tcon.si = si;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright switch (si->shr_type & STYPE_MASK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case STYPE_DISKTREE:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_tree_connect_disk(sr, &sr->sr_tcon);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case STYPE_IPC:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_tree_connect_ipc(sr, &sr->sr_tcon);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright case STYPE_PRINTQ:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_tree_connect_printq(sr, &sr->sr_tcon);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = NT_STATUS_BAD_DEVICE_TYPE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8622ec4569457733001d4982ef7f5b44427069beGordon Ross smb_kshare_release(sr->sr_server, si);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->sr_tcon.si = NULL;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Disconnect a tree.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsmb_tree_disconnect(smb_tree_t *tree, boolean_t do_exec)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_shr_execinfo_t execinfo;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(tree->t_magic == SMB_TREE_MAGIC);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_enter(&tree->t_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(tree->t_refcnt);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_tree_is_connected_locked(tree)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Indicate that the disconnect process has started.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tree->t_state = SMB_TREE_STATE_DISCONNECTING;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_exit(&tree->t_mutex);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (do_exec) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * The files opened under this tree are closed.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_ofile_close_all(tree);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * The directories opened under this tree are closed.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_tree_close_odirs(tree, 0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_enter(&tree->t_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tree->t_state = SMB_TREE_STATE_DISCONNECTED;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_server_dec_trees(tree->t_server);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_exit(&tree->t_mutex);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (do_exec && (tree->t_state == SMB_TREE_STATE_DISCONNECTED) &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (tree->t_execflags & SMB_EXEC_UNMAP)) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_set_execinfo(tree, &execinfo, SMB_EXEC_UNMAP);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross (void) smb_kshare_exec(tree->t_server, &execinfo);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Take a reference on a tree.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregoboolean_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_hold(
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_tree_t *tree)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross SMB_TREE_VALID(tree);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego mutex_enter(&tree->t_mutex);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_tree_is_connected_locked(tree)) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_refcnt++;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego mutex_exit(&tree->t_mutex);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_TRUE);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego mutex_exit(&tree->t_mutex);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_FALSE);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Bump the hold count regardless of the tree state. This is used in
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * some internal code paths where we've already checked that we had a
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * valid tree connection, and don't want to deal with the possiblity
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * that the tree state might have changed to disconnecting after our
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * original hold was taken. It's correct to continue processing a
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * request even when new requests cannot lookup that tree anymore.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossvoid
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_tree_hold_internal(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross SMB_TREE_VALID(tree);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mutex_enter(&tree->t_mutex);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tree->t_refcnt++;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mutex_exit(&tree->t_mutex);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Release a reference on a tree. If the tree is disconnected and the
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * reference count falls to zero, post the object for deletion.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Object deletion is deferred to avoid modifying a list while an
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * iteration may be in progress.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_release(
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_tree_t *tree)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_TREE_VALID(tree);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego mutex_enter(&tree->t_mutex);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(tree->t_refcnt);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_refcnt--;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai /* flush the ofile and odir lists' delete queues */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai smb_llist_flush(&tree->t_ofile_list);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai smb_llist_flush(&tree->t_odir_list);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_tree_is_disconnected(tree) && (tree->t_refcnt == 0))
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_session_post_tree(tree->t_session, tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego mutex_exit(&tree->t_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_tree_post_ofile(smb_tree_t *tree, smb_ofile_t *of)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_TREE_VALID(tree);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_OFILE_VALID(of);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(of->f_refcnt == 0);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(of->f_state == SMB_OFILE_STATE_CLOSED);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(of->f_tree == tree);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_post(&tree->t_ofile_list, of, smb_ofile_delete);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_tree_post_odir(smb_tree_t *tree, smb_odir_t *od)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_TREE_VALID(tree);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_ODIR_VALID(od);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(od->d_refcnt == 0);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(od->d_state == SMB_ODIR_STATE_CLOSED);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ASSERT(od->d_tree == tree);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_post(&tree->t_odir_list, od, smb_odir_delete);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Close ofiles and odirs that match pid.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_close_pid(
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_tree_t *tree,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t pid)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(tree);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(tree->t_magic == SMB_TREE_MAGIC);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_ofile_close_all_by_pid(tree, pid);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_tree_close_odirs(tree, pid);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Check whether or not a tree supports the features identified by flags.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregoboolean_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_has_feature(smb_tree_t *tree, uint32_t flags)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(tree->t_magic == SMB_TREE_MAGIC);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return ((tree->t_flags & flags) == flags);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * If the enumeration request is for tree data, handle the request
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * here. Otherwise, pass it on to the ofiles.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown *
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * This function should be called with a hold on the tree.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownint
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_enum(smb_tree_t *tree, smb_svcenum_t *svcenum)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_t *of;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_t *next;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser int rc = 0;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree->t_magic == SMB_TREE_MAGIC);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (svcenum->se_type == SMB_SVCENUM_TYPE_TREE)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (smb_tree_enum_private(tree, svcenum));
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown of = smb_tree_get_ofile(tree, NULL);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown while (of) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(of->f_tree == tree);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown rc = smb_ofile_enum(of, svcenum);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (rc != 0) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_release(of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown break;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown next = smb_tree_get_ofile(tree, of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_release(of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown of = next;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (rc);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Close a file by its unique id.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownint
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_fclose(smb_tree_t *tree, uint32_t uniqid)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_t *of;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree->t_magic == SMB_TREE_MAGIC);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if ((of = smb_ofile_lookup_by_uniqid(tree, uniqid)) == NULL)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (ENOENT);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (smb_ofile_disallow_fclose(of)) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_release(of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (EACCES);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_close(of, 0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_ofile_release(of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/* *************************** Static Functions ***************************** */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright#define SHARES_DIR ".zfs/shares/"
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Calculates permissions given by the share's ACL to the
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * user in the passed request. The default is full access.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * If any error occurs, full access is granted.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Using the vnode of the share path find the root directory
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * of the mounted file system. Then look to see if there is a
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * .zfs/shares directory and if there is, lookup the file with
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * the same name as the share name in it. The ACL set for this
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * file is the share's ACL which is used for access check here.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic uint32_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_tree_acl_access(smb_request_t *sr, const smb_kshare_t *si, vnode_t *pathvp)
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright{
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier smb_user_t *user;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier cred_t *cred;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier int rc;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier vfs_t *vfsp;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier vnode_t *root = NULL;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier vnode_t *sharevp = NULL;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier char *sharepath;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier struct pathname pnp;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier size_t size;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t access;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier user = sr->uid_user;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier cred = user->u_cred;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright access = ACE_ALL_PERMS;
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (si->shr_flags & SMB_SHRF_AUTOHOME) {
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier /*
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier * An autohome share owner gets full access to the share.
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier * Everyone else is denied access.
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (si->shr_uid != crgetuid(cred))
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright access = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (access);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * The hold on 'root' is released by the lookuppnvp() that follows
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright */
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright vfsp = pathvp->v_vfsp;
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright if (vfsp != NULL)
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright rc = VFS_ROOT(vfsp, &root);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright else
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright rc = ENOENT;
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright if (rc != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (access);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier size = sizeof (SHARES_DIR) + strlen(si->shr_name) + 1;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sharepath = smb_srm_alloc(sr, size);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) snprintf(sharepath, size, "%s%s", SHARES_DIR, si->shr_name);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright pn_alloc(&pnp);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright (void) pn_set(&pnp, sharepath);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = lookuppnvp(&pnp, NULL, NO_FOLLOW, NULL, &sharevp, rootdir, root,
8622ec4569457733001d4982ef7f5b44427069beGordon Ross zone_kcred());
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright pn_free(&pnp);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Now get the effective access value based on cred and ACL values.
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright */
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh if (rc == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_vop_eaccess(sharevp, (int *)&access, V_ACE_MASK, NULL,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright cred);
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh VN_RELE(sharevp);
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (access);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Performs the following access checks for a disk share:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * - No IPC/anonymous user is allowed
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * - If user is Guest, guestok property of the share should be
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * enabled
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * - If this is an Admin share, the user should have administrative
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * privileges
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * - Host based access control lists
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * - Share ACL
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Returns the access allowed or 0 if access is denied.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightstatic uint32_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_tree_chkaccess(smb_request_t *sr, smb_kshare_t *shr, vnode_t *vp)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_user_t *user = sr->uid_user;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *sharename = shr->shr_name;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t host_access;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t acl_access;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t access;
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (user->u_flags & SMB_USER_FLAG_ANON) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "access denied: IPC only");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((user->u_flags & SMB_USER_FLAG_GUEST) &&
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ((shr->shr_flags & SMB_SHRF_GUEST_OK) == 0)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "access denied: guest disabled");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((shr->shr_flags & SMB_SHRF_ADMIN) && !smb_user_is_admin(user)) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "access denied: not admin");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
8622ec4569457733001d4982ef7f5b44427069beGordon Ross host_access = smb_kshare_hostaccess(shr, sr->session);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((host_access & ACE_ALL_PERMS) == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "access denied: host access");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright acl_access = smb_tree_acl_access(sr, shr, vp);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((acl_access & ACE_ALL_PERMS) == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "access denied: share ACL");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright access = host_access & acl_access;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((access & ACE_ALL_PERMS) == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "access denied");
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return (access);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Connect a share for use with files and directories.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_tree_connect_disk(smb_request_t *sr, smb_arg_tcon_t *tcon)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *sharename = tcon->path;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *any = "?????";
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_user_t *user = sr->uid_user;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_node_t *dnode = NULL;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_node_t *snode = NULL;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kshare_t *si = tcon->si;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *service = tcon->service;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego char last_component[MAXNAMELEN];
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_tree_t *tree;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego int rc;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t access;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_shr_execinfo_t execinfo;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(user);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(user->u_cred);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (service != NULL &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross strcmp(service, any) != 0 &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross strcasecmp(service, "A:") != 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "invalid service (%s)", service);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_DEVICE_TYPE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Check that the shared directory exists.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = smb_pathname_reduce(sr, user->u_cred, si->shr_path, 0, 0, &dnode,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright last_component);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = smb_fsop_lookup(sr, user->u_cred, SMB_FOLLOW_LINKS,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sr->sr_server->si_root_smb_node, dnode, last_component,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright &snode);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_release(dnode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (rc) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (snode)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_release(snode);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "bad path: %s", si->shr_path);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_NETWORK_NAME);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((access = smb_tree_chkaccess(sr, si, snode->vp)) == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_release(snode);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_ACCESS_DENIED);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Set up the OptionalSupport for this share.
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support = SMB_SUPPORT_SEARCH_BITS;
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego switch (si->shr_flags & SMB_SHRF_CSC_MASK) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego case SMB_SHRF_CSC_DISABLED:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support |= SMB_CSC_CACHE_NONE;
8d7e41661dc4633488e93b13363137523ce59977jose borrego break;
8d7e41661dc4633488e93b13363137523ce59977jose borrego case SMB_SHRF_CSC_AUTO:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support |= SMB_CSC_CACHE_AUTO_REINT;
8d7e41661dc4633488e93b13363137523ce59977jose borrego break;
8d7e41661dc4633488e93b13363137523ce59977jose borrego case SMB_SHRF_CSC_VDO:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support |= SMB_CSC_CACHE_VDO;
8d7e41661dc4633488e93b13363137523ce59977jose borrego break;
8d7e41661dc4633488e93b13363137523ce59977jose borrego case SMB_SHRF_CSC_MANUAL:
8d7e41661dc4633488e93b13363137523ce59977jose borrego default:
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Default to SMB_CSC_CACHE_MANUAL_REINT.
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
8d7e41661dc4633488e93b13363137523ce59977jose borrego break;
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai /* ABE support */
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (si->shr_flags & SMB_SHRF_ABE)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support |=
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (si->shr_flags & SMB_SHRF_DFSROOT)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support |= SMB_SHARE_IS_IN_DFS;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /* if 'smb' zfs property: shortnames=disabled */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (!smb_shortnames)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh sr->arg.tcon.optional_support |= SMB_UNIQUE_FILE_NAME;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser tree = smb_tree_alloc(sr, si, snode, access, sr->sr_cfg->skc_execflags);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_release(snode);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree == NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INSUFF_SERVER_RESOURCES);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree->t_execflags & SMB_EXEC_MAP) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_set_execinfo(tree, &execinfo, SMB_EXEC_MAP);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = smb_kshare_exec(tree->t_server, &execinfo);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if ((rc != 0) && (tree->t_execflags & SMB_EXEC_TERM)) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_disconnect(tree, B_FALSE);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_release(tree);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_ACCESS_DENIED);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->tid_tree = tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->smb_tid = tree->t_tid;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Shares have both a share and host based access control. The access
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * granted will be minimum permissions based on both hostaccess
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * (permissions allowed by host based access) and aclaccess (from the
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * share ACL).
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_tree_connect_printq(smb_request_t *sr, smb_arg_tcon_t *tcon)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *sharename = tcon->path;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *any = "?????";
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_user_t *user = sr->uid_user;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_t *dnode = NULL;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_node_t *snode = NULL;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kshare_t *si = tcon->si;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *service = tcon->service;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char last_component[MAXNAMELEN];
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_t *tree;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t access;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(user);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright ASSERT(user->u_cred);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
b7301bf5522d8b9141fe432333ded586218327f2Gordon Ross if (sr->sr_server->sv_cfg.skc_print_enable == 0) {
b7301bf5522d8b9141fe432333ded586218327f2Gordon Ross smb_tree_log(sr, sharename, "printing disabled");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_NETWORK_NAME);
b7301bf5522d8b9141fe432333ded586218327f2Gordon Ross }
b7301bf5522d8b9141fe432333ded586218327f2Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (service != NULL &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross strcmp(service, any) != 0 &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross strcasecmp(service, "LPT1:") != 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_tree_log(sr, sharename, "invalid service (%s)", service);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_DEVICE_TYPE);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States }
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Check that the shared directory exists.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = smb_pathname_reduce(sr, user->u_cred, si->shr_path, 0, 0, &dnode,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego last_component);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (rc == 0) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright rc = smb_fsop_lookup(sr, user->u_cred, SMB_FOLLOW_LINKS,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown sr->sr_server->si_root_smb_node, dnode, last_component,
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh &snode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_node_release(dnode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (rc) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (snode)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_node_release(snode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States smb_tree_log(sr, sharename, "bad path: %s", si->shr_path);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_NETWORK_NAME);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if ((access = smb_tree_chkaccess(sr, si, snode->vp)) == 0) {
037cac007b685e7ea79f6ef7e8e62bfd342a4d56joyce mcintosh smb_node_release(snode);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_ACCESS_DENIED);
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright }
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support = SMB_SUPPORT_SEARCH_BITS;
2c2961f8403049d948b9f3e6c35d6488b6b7e1aajose borrego
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser tree = smb_tree_alloc(sr, si, snode, access, sr->sr_cfg->skc_execflags);
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright smb_node_release(snode);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (tree == NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INSUFF_SERVER_RESOURCES);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->tid_tree = tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->smb_tid = tree->t_tid;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Connect an IPC share for use with named pipes.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_tree_connect_ipc(smb_request_t *sr, smb_arg_tcon_t *tcon)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *name = tcon->path;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright const char *any = "?????";
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States smb_user_t *user = sr->uid_user;
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States smb_tree_t *tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_kshare_t *si = tcon->si;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *service = tcon->service;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(user);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (service != NULL &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross strcmp(service, any) != 0 &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross strcasecmp(service, "IPC") != 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_log(sr, name, "invalid service (%s)", service);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_BAD_DEVICE_TYPE);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if ((user->u_flags & SMB_USER_FLAG_ANON) &&
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->sr_cfg->skc_restrict_anon) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_log(sr, name, "access denied: restrict anonymous");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_ACCESS_DENIED);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tcon->optional_support = SMB_SUPPORT_SEARCH_BITS;
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser tree = smb_tree_alloc(sr, si, NULL, ACE_ALL_PERMS, 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree == NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INSUFF_SERVER_RESOURCES);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->tid_tree = tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sr->smb_tid = tree->t_tid;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Allocate a tree.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic smb_tree_t *
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keisersmb_tree_alloc(smb_request_t *sr, const smb_kshare_t *si,
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_node_t *snode, uint32_t access, uint32_t execflags)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_session_t *session = sr->session;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_tree_t *tree;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright uint32_t stype = si->shr_type;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego uint16_t tid;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser if (smb_idpool_alloc(&session->s_tid_pool, &tid))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
8622ec4569457733001d4982ef7f5b44427069beGordon Ross tree = kmem_cache_alloc(smb_cache_tree, KM_SLEEP);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego bzero(tree, sizeof (smb_tree_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser tree->t_session = session;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser tree->t_server = session->s_server;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser /* grab a ref for tree->t_owner */
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_user_hold_internal(sr->uid_user);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser tree->t_owner = sr->uid_user;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (STYPE_ISDSK(stype) || STYPE_ISPRN(stype)) {
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_tree_getattr(si, snode, tree) != 0) {
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_idpool_free(&session->s_tid_pool, tid);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross kmem_cache_free(smb_cache_tree, tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (smb_idpool_constructor(&tree->t_fid_pool)) {
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_idpool_free(&session->s_tid_pool, tid);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross kmem_cache_free(smb_cache_tree, tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (smb_idpool_constructor(&tree->t_odid_pool)) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_idpool_destructor(&tree->t_fid_pool);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_idpool_free(&session->s_tid_pool, tid);
8622ec4569457733001d4982ef7f5b44427069beGordon Ross kmem_cache_free(smb_cache_tree, tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_llist_constructor(&tree->t_ofile_list, sizeof (smb_ofile_t),
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego offsetof(smb_ofile_t, f_lnd));
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_llist_constructor(&tree->t_odir_list, sizeof (smb_odir_t),
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego offsetof(smb_odir_t, d_lnd));
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(tree->t_sharename, si->shr_name,
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego sizeof (tree->t_sharename));
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States (void) strlcpy(tree->t_resource, si->shr_path,
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States sizeof (tree->t_resource));
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego mutex_init(&tree->t_mutex, NULL, MUTEX_DEFAULT, NULL);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_refcnt = 1;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_tid = tid;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_res_type = stype;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_state = SMB_TREE_STATE_CONNECTED;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_magic = SMB_TREE_MAGIC;
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright tree->t_access = access;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown tree->t_connect_time = gethrestime_sec();
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright tree->t_execflags = execflags;
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright /* if FS is readonly, enforce that here */
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright if (tree->t_flags & SMB_TREE_READONLY)
743a77ed89085d3c232c4a2f65ab4e19576839e2Alan Wright tree->t_access &= ~ACE_ALL_WRITE_PERMS;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (STYPE_ISDSK(stype) || STYPE_ISPRN(stype)) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_node_ref(snode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_snode = snode;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_acltype = smb_fsop_acltype(snode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_enter(&session->s_tree_list, RW_WRITER);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_insert_head(&session->s_tree_list, tree);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_exit(&session->s_tree_list);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser atomic_inc_32(&session->s_tree_cnt);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_server_inc_trees(session->s_server);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Deallocate a tree. The open file and open directory lists should be
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * empty.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Remove the tree from the user's tree list before freeing resources
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * associated with the tree.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_tree_dealloc(void *arg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_session_t *session;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_tree_t *tree = (smb_tree_t *)arg;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_TREE_VALID(tree);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(tree->t_state == SMB_TREE_STATE_DISCONNECTED);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ASSERT(tree->t_refcnt == 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser session = tree->t_session;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_enter(&session->s_tree_list, RW_WRITER);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_remove(&session->s_tree_list, tree);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_idpool_free(&session->s_tid_pool, tree->t_tid);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser atomic_dec_32(&session->s_tree_cnt);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_exit(&session->s_tree_list);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&tree->t_mutex);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&tree->t_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tree->t_magic = (uint32_t)~SMB_TREE_MAGIC;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (tree->t_snode)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_node_release(tree->t_snode);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_destroy(&tree->t_mutex);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_llist_destructor(&tree->t_ofile_list);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_llist_destructor(&tree->t_odir_list);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_idpool_destructor(&tree->t_fid_pool);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_idpool_destructor(&tree->t_odid_pool);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser SMB_USER_VALID(tree->t_owner);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_user_release(tree->t_owner);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
8622ec4569457733001d4982ef7f5b44427069beGordon Ross kmem_cache_free(smb_cache_tree, tree);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Determine whether or not a tree is connected.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * This function must be called with the tree mutex held.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic boolean_t
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_tree_is_connected_locked(smb_tree_t *tree)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego switch (tree->t_state) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego case SMB_TREE_STATE_CONNECTED:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_TRUE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego case SMB_TREE_STATE_DISCONNECTING:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego case SMB_TREE_STATE_DISCONNECTED:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * The tree exists but being diconnected or destroyed.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_FALSE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego default:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(0);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_FALSE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Determine whether or not a tree is disconnected.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * This function must be called with the tree mutex held.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic boolean_t
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_is_disconnected(smb_tree_t *tree)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego switch (tree->t_state) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego case SMB_TREE_STATE_DISCONNECTED:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_TRUE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego case SMB_TREE_STATE_CONNECTED:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego case SMB_TREE_STATE_DISCONNECTING:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_FALSE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego default:
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(0);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (B_FALSE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Return a pointer to the share name within a share resource path.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * The share path may be a Uniform Naming Convention (UNC) string
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * (\\server\share) or simply the share name. We validate the UNC
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * format but we don't look at the server name.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic char *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_tree_get_sharename(char *unc_path)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *sharename = unc_path;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (sharename[0] == '\\') {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Looks like a UNC path, validate the format.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (sharename[1] != '\\')
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if ((sharename = strchr(sharename+2, '\\')) == NULL)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ++sharename;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego } else if (strchr(sharename, '\\') != NULL) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * This should be a share name (no embedded \'s).
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (NULL);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (sharename);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Obtain the tree attributes: volume name, typename and flags.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic int
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_tree_getattr(const smb_kshare_t *si, smb_node_t *node, smb_tree_t *tree)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego vfs_t *vfsp = SMB_NODE_VFS(node);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(vfsp);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (getvfs(&vfsp->vfs_fsid) != vfsp)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (ESTALE);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_tree_get_volname(vfsp, tree);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States smb_tree_get_flags(si, vfsp, tree);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego VFS_RELE(vfsp);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (0);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Extract the volume name.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic void
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_get_volname(vfs_t *vfsp, smb_tree_t *tree)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#ifdef _FAKE_KERNEL
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(vfsp))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) strlcpy(tree->t_volume, "fake", SMB_VOLNAMELEN);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#else /* _FAKE_KERNEL */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego refstr_t *vfs_mntpoint;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego const char *s;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego char *name;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego vfs_mntpoint = vfs_getmntpoint(vfsp);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross s = refstr_value(vfs_mntpoint);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego s += strspn(s, "/");
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (void) strlcpy(tree->t_volume, s, SMB_VOLNAMELEN);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego refstr_rele(vfs_mntpoint);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego name = tree->t_volume;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (void) strsep((char **)&name, "/");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#endif /* _FAKE_KERNEL */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Always set "unicode on disk" because we always use utf8 names locally.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Always set ACL support because the VFS will fake ACLs for file systems
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * that don't support them.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Some flags are dependent on the typename, which is also set up here.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * File system types are hardcoded in uts/common/os/vfs_conf.c.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic void
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_tree_get_flags(const smb_kshare_t *si, vfs_t *vfsp, smb_tree_t *tree)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu smb_session_t *ssn = tree->t_session;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct vfssw *vswp;
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright typedef struct smb_mtype {
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright char *mt_name;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright size_t mt_namelen;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright uint32_t mt_flags;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright } smb_mtype_t;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright static smb_mtype_t smb_mtype[] = {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross { "zfs", 3, SMB_TREE_QUOTA | SMB_TREE_SPARSE},
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross { "ufs", 3, 0 },
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States { "nfs", 3, SMB_TREE_NFS_MOUNTED },
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States { "tmpfs", 5, SMB_TREE_NO_EXPORT }
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright };
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright smb_mtype_t *mtype;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright char *name;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t flags =
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross SMB_TREE_SUPPORTS_ACLS |
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross SMB_TREE_UNICODE_ON_DISK;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright int i;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (si->shr_flags & SMB_SHRF_DFSROOT)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States flags |= SMB_TREE_DFSROOT;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States if (si->shr_flags & SMB_SHRF_CATIA)
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States flags |= SMB_TREE_CATIA;
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai if (si->shr_flags & SMB_SHRF_ABE)
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai flags |= SMB_TREE_ABE;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu if (ssn->s_cfg.skc_oplock_enable) {
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /* if 'smb' zfs property: oplocks=enabled */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh flags |= SMB_TREE_OPLOCKS;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu /* Global config option for now. Later make per-share. */
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu if (ssn->s_cfg.skc_traverse_mounts)
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu flags |= SMB_TREE_TRAVERSE_MOUNTS;
5f1ef25c7a11451cbd3080dc3ce8e8db4ca996c4Aram Hăvărneanu
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /* if 'smb' zfs property: shortnames=enabled */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (smb_shortnames)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh flags |= SMB_TREE_SHORTNAMES;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfsp->vfs_flag & VFS_RDONLY)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_READONLY;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfsp->vfs_flag & VFS_XATTR)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_STREAMS;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vswp = vfs_getvfsswbyvfsops(vfs_getops(vfsp));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vswp != NULL) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross name = vswp->vsw_name;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vfs_unrefvfssw(vswp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross } else {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross name = "?";
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright for (i = 0; i < sizeof (smb_mtype) / sizeof (smb_mtype[0]); ++i) {
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright mtype = &smb_mtype[i];
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright if (strncasecmp(name, mtype->mt_name, mtype->mt_namelen) == 0)
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright flags |= mtype->mt_flags;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright }
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (void) strlcpy(tree->t_typename, name, SMB_TYPENAMELEN);
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown (void) smb_strupr((char *)tree->t_typename);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfs_has_feature(vfsp, VFSFT_XVATTR))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_XVATTR;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfs_has_feature(vfsp, VFSFT_CASEINSENSITIVE))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_CASEINSENSITIVE;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfs_has_feature(vfsp, VFSFT_NOCASESENSITIVE))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_NO_CASESENSITIVE;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfs_has_feature(vfsp, VFSFT_DIRENTFLAGS))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_DIRENTFLAGS;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfs_has_feature(vfsp, VFSFT_ACLONCREATE))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_ACLONCREATE;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (vfs_has_feature(vfsp, VFSFT_ACEMASKONACCESS))
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego flags |= SMB_TREE_ACEMASKONACCESS;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright DTRACE_PROBE2(smb__tree__flags, uint32_t, flags, char *, name);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego tree->t_flags = flags;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Report share access result to syslog.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregostatic void
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_tree_log(smb_request_t *sr, const char *sharename, const char *fmt, ...)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego va_list ap;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego char buf[128];
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego smb_user_t *user = sr->uid_user;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego ASSERT(user);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (smb_tcon_mute)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return;
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if ((user->u_name) && (strcasecmp(sharename, "IPC$") == 0)) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Only report normal users, i.e. ignore W2K misuse
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * of the IPC connection by filtering out internal
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * names such as nobody and root.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if ((strcmp(user->u_name, "root") == 0) ||
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (strcmp(user->u_name, "nobody") == 0)) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego va_start(ap, fmt);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego (void) vsnprintf(buf, 128, fmt, ap);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego va_end(ap);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego cmn_err(CE_NOTE, "smbd[%s\\%s]: %s %s",
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego user->u_domain, user->u_name, sharename, buf);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego/*
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * smb_tree_lookup_odir
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego *
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * Find the specified odir in the tree's list of odirs, and
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * attempt to obtain a hold on the odir.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego *
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * Returns NULL if odir not found or a hold cannot be obtained.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego */
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_odir_t *
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keisersmb_tree_lookup_odir(smb_request_t *sr, uint16_t odid)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego{
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_odir_t *od;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_llist_t *od_list;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_tree_t *tree = sr->tid_tree;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(tree->t_magic == SMB_TREE_MAGIC);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od_list = &tree->t_odir_list;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_llist_enter(od_list, RW_READER);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = smb_llist_head(od_list);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego while (od) {
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser if (od->d_odid == odid)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego break;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = smb_llist_next(od_list, od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser if (od == NULL)
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser goto out;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser /*
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * Only allow use of a given Search ID with the same UID that
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * was used to create it. MS-CIFS 3.3.5.14
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser */
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser if (od->d_user != sr->uid_user) {
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser od = NULL;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser goto out;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser }
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser if (!smb_odir_hold(od))
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser od = NULL;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiserout:
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_llist_exit(od_list);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego return (od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego}
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United Statesboolean_t
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_tree_is_connected(smb_tree_t *tree)
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States{
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States boolean_t rb;
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States mutex_enter(&tree->t_mutex);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States rb = smb_tree_is_connected_locked(tree);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States mutex_exit(&tree->t_mutex);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States return (rb);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States}
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Get the next open ofile in the list. A reference is taken on
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * the ofile, which can be released later with smb_ofile_release().
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown *
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * If the specified ofile is NULL, search from the beginning of the
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * list. Otherwise, the search starts just after that ofile.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown *
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Returns NULL if there are no open files in the list.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic smb_ofile_t *
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_get_ofile(smb_tree_t *tree, smb_ofile_t *of)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_llist_t *ofile_list;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree->t_magic == SMB_TREE_MAGIC);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ofile_list = &tree->t_ofile_list;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_llist_enter(ofile_list, RW_READER);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (of) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(of->f_magic == SMB_OFILE_MAGIC);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown of = smb_llist_next(ofile_list, of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown } else {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown of = smb_llist_head(ofile_list);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown while (of) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (smb_ofile_hold(of))
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown break;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown of = smb_llist_next(ofile_list, of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_llist_exit(ofile_list);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (of);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego/*
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * smb_tree_get_odir
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego *
a1511e6b39158073666f6bd04cec5295813931f6joyce mcintosh * Find the next odir in the tree's list of odirs, and obtain a
a1511e6b39158073666f6bd04cec5295813931f6joyce mcintosh * hold on it.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * If the specified odir is NULL the search starts at the beginning
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * of the tree's odir list, otherwise the search starts after the
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * specified odir.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego */
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic smb_odir_t *
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_tree_get_odir(smb_tree_t *tree, smb_odir_t *od)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego{
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_llist_t *od_list;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(tree);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(tree->t_magic == SMB_TREE_MAGIC);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od_list = &tree->t_odir_list;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_llist_enter(od_list, RW_READER);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (od) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(od->d_magic == SMB_ODIR_MAGIC);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = smb_llist_next(od_list, od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego } else {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = smb_llist_head(od_list);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego while (od) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(od->d_magic == SMB_ODIR_MAGIC);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (smb_odir_hold(od))
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego break;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = smb_llist_next(od_list, od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_llist_exit(od_list);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego return (od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego}
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego/*
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * smb_tree_close_odirs
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego *
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * Close all open odirs in the tree's list which were opened by
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * the process identified by pid.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * If pid is zero, close all open odirs in the tree's list.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego */
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic void
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_tree_close_odirs(smb_tree_t *tree, uint16_t pid)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego{
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_odir_t *od, *next_od;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(tree);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(tree->t_magic == SMB_TREE_MAGIC);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = smb_tree_get_odir(tree, NULL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego while (od) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(od->d_magic == SMB_ODIR_MAGIC);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ASSERT(od->d_tree == tree);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego next_od = smb_tree_get_odir(tree, od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((pid == 0) || (od->d_opened_by_pid == pid))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_odir_close(od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_odir_release(od);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego od = next_od;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic void
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keisersmb_tree_set_execinfo(smb_tree_t *tree, smb_shr_execinfo_t *exec,
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser int exec_type)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright exec->e_sharename = tree->t_sharename;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser exec->e_winname = tree->t_owner->u_name;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser exec->e_userdom = tree->t_owner->u_domain;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright exec->e_srv_ipaddr = tree->t_session->local_ipaddr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright exec->e_cli_ipaddr = tree->t_session->ipaddr;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright exec->e_cli_netbiosname = tree->t_session->workstation;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser exec->e_uid = crgetuid(tree->t_owner->u_cred);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright exec->e_type = exec_type;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Private function to support smb_tree_enum.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic int
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_enum_private(smb_tree_t *tree, smb_svcenum_t *svcenum)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown uint8_t *pb;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown uint_t nbytes;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int rc;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (svcenum->se_nskip > 0) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_nskip--;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (svcenum->se_nitems >= svcenum->se_nlimit) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_nitems = svcenum->se_nlimit;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (0);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown pb = &svcenum->se_buf[svcenum->se_bused];
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown rc = smb_tree_netinfo_encode(tree, pb, svcenum->se_bavail, &nbytes);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (rc == 0) {
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_bavail -= nbytes;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_bused += nbytes;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown svcenum->se_nitems++;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown }
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (rc);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Encode connection information into a buffer: connection information
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * needed in user space to support RPC requests.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic int
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_netinfo_encode(smb_tree_t *tree, uint8_t *buf, size_t buflen,
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown uint32_t *nbytes)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_netconnectinfo_t info;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown int rc;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_tree_netinfo_init(tree, &info);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown rc = smb_netconnectinfo_encode(&info, buf, buflen, nbytes);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown smb_tree_netinfo_fini(&info);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return (rc);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiserstatic void
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keisersmb_tree_netinfo_username(smb_tree_t *tree, char **namestr, uint32_t *namelen)
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser{
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_user_t *user = tree->t_owner;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser /*
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * u_domain_len and u_name_len include the '\0' in their
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * lengths, hence the sum of the two lengths gives us room
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser * for both the '\\' and '\0' chars.
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser */
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser ASSERT(namestr);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser ASSERT(namelen);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser ASSERT(user->u_domain_len > 0);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser ASSERT(user->u_name_len > 0);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser *namelen = user->u_domain_len + user->u_name_len;
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser *namestr = kmem_alloc(*namelen, KM_SLEEP);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser (void) snprintf(*namestr, *namelen, "%s\\%s", user->u_domain,
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser user->u_name);
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser}
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown/*
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Note: ci_numusers should be the number of users connected to
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * the share rather than the number of references on the tree but
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * we don't have a mechanism to track users/share in smbsrv yet.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown */
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic void
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_netinfo_init(smb_tree_t *tree, smb_netconnectinfo_t *info)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown ASSERT(tree);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ci_id = tree->t_tid;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ci_type = tree->t_res_type;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ci_numopens = tree->t_open_files;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ci_numusers = tree->t_refcnt;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ci_time = gethrestime_sec() - tree->t_connect_time;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown info->ci_sharelen = strlen(tree->t_sharename) + 1;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States info->ci_share = smb_mem_strdup(tree->t_sharename);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
3b13a1ef7511135ec0c75b5f94de8075454efd79Thomas Keiser smb_tree_netinfo_username(tree, &info->ci_username, &info->ci_namelen);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownstatic void
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brownsmb_tree_netinfo_fini(smb_netconnectinfo_t *info)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown{
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info == NULL)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown return;
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info->ci_username)
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown kmem_free(info->ci_username, info->ci_namelen);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (info->ci_share)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_mem_free(info->ci_share);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown bzero(info, sizeof (smb_netconnectinfo_t));
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown}