1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2017 Nexenta Systems, Inc. All rights reserved. 14 */ 15 16 /* 17 * Dispatch function for SMB2_TREE_CONNECT 18 */ 19 20 #include <smbsrv/smb2_kproto.h> 21 22 smb_sdrc_t 23 smb2_tree_connect(smb_request_t *sr) 24 { 25 smb_arg_tcon_t *tcon = &sr->sr_tcon; 26 smb_tree_t *tree = NULL; 27 uint16_t StructureSize; 28 uint16_t PathOffset; 29 uint16_t PathLength; 30 uint8_t ShareType; 31 uint32_t ShareFlags; 32 uint32_t Capabilities; 33 uint32_t status; 34 int skip; 35 int rc = 0; 36 37 /* 38 * SMB2 Tree Connect request 39 */ 40 rc = smb_mbc_decodef( 41 &sr->smb_data, "w..ww", 42 &StructureSize, 43 /* reserved */ 44 &PathOffset, 45 &PathLength); 46 if (rc) 47 return (SDRC_ERROR); 48 49 /* 50 * We're normally positioned at the path name now, 51 * but there could be some padding before it. 52 */ 53 skip = (PathOffset + sr->smb2_cmd_hdr) - 54 sr->smb_data.chain_offset; 55 if (skip < 0) 56 return (SDRC_ERROR); 57 if (skip > 0) 58 (void) smb_mbc_decodef(&sr->smb_data, "#.", skip); 59 60 /* 61 * Get the path name 62 */ 63 rc = smb_mbc_decodef( 64 &sr->smb_data, "%#U", 65 sr, (uint_t)PathLength, &tcon->path); 66 if (rc) 67 return (SDRC_ERROR); 68 69 DTRACE_SMB2_START(op__TreeConnect, smb_request_t *, sr); 70 71 status = smb_tree_connect(sr); 72 73 sr->smb2_status = status; 74 DTRACE_SMB2_DONE(op__TreeConnect, smb_request_t *, sr); 75 76 if (status) { 77 (void) smb2sr_put_error(sr, status); 78 return (SDRC_SUCCESS); 79 } 80 tree = sr->tid_tree; 81 82 /* 83 * Report the share type. 84 */ 85 switch (tree->t_res_type & STYPE_MASK) { 86 case STYPE_IPC: 87 ShareType = SMB2_SHARE_TYPE_PIPE; 88 break; 89 case STYPE_PRINTQ: 90 ShareType = SMB2_SHARE_TYPE_PRINT; 91 break; 92 case STYPE_DISKTREE: 93 default: 94 ShareType = SMB2_SHARE_TYPE_DISK; 95 break; 96 } 97 98 /* 99 * XXX These need work.. 100 */ 101 ShareFlags = 0; 102 Capabilities = 0; 103 104 /* 105 * SMB2 Tree Connect reply 106 */ 107 (void) smb_mbc_encodef( 108 &sr->reply, 109 "wb.lll", 110 16, /* StructSize */ /* w */ 111 ShareType, /* b */ 112 ShareFlags, /* l */ 113 Capabilities, /* l */ 114 tree->t_access); /* l */ 115 116 return (SDRC_SUCCESS); 117 } 118