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 2014 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 status = smb_tree_connect(sr); 70 if (status) { 71 (void) smb2sr_put_error(sr, status); 72 return (SDRC_SUCCESS); 73 } 74 tree = sr->tid_tree; 75 76 /* 77 * Report the share type. 78 */ 79 switch (tree->t_res_type & STYPE_MASK) { 80 case STYPE_IPC: 81 ShareType = SMB2_SHARE_TYPE_PIPE; 82 break; 83 case STYPE_PRINTQ: 84 ShareType = SMB2_SHARE_TYPE_PRINT; 85 break; 86 case STYPE_DISKTREE: 87 default: 88 ShareType = SMB2_SHARE_TYPE_DISK; 89 break; 90 } 91 92 /* 93 * XXX These need work.. 94 */ 95 ShareFlags = 0; 96 Capabilities = 0; 97 98 /* 99 * SMB2 Tree Connect reply 100 */ 101 rc = smb_mbc_encodef( 102 &sr->reply, 103 "wb.lll", 104 16, /* StructSize */ /* w */ 105 ShareType, /* b */ 106 ShareFlags, /* l */ 107 Capabilities, /* l */ 108 tree->t_access); /* l */ 109 if (rc) 110 return (SDRC_ERROR); 111 112 return (SDRC_SUCCESS); 113 } 114