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