xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c (revision 00fc50d191cf90458c41a077d59fe2f81223f00a)
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