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 2013 Nexenta Systems, Inc.  All rights reserved.
14  */
15 
16 /*
17  * Helper functions for SMB2 open handles
18  */
19 
20 #include <smbsrv/smb2_kproto.h>
21 
22 uint32_t
smb2_ofile_getattr(smb_request_t * sr,smb_ofile_t * of,smb_attr_t * ap)23 smb2_ofile_getattr(smb_request_t *sr, smb_ofile_t *of, smb_attr_t *ap)
24 {
25 	uint_t mask;
26 	int rc;
27 
28 	mask = ap->sa_mask;
29 	bzero(ap, sizeof (*ap));
30 	ap->sa_mask = mask;
31 
32 	switch (of->f_ftype) {
33 	case SMB_FTYPE_DISK:
34 	case SMB_FTYPE_PRINTER:
35 		rc = smb_node_getattr(sr, of->f_node, of->f_cr, of, ap);
36 		break;
37 	case SMB_FTYPE_BYTE_PIPE:
38 	case SMB_FTYPE_MESG_PIPE:
39 		rc = smb_opipe_getattr(of, ap);
40 		break;
41 	default:
42 		rc = ENOTTY;
43 		break;
44 	}
45 	if (rc)
46 		return (smb_errno2status(rc));
47 
48 	return (0);
49 }
50 
51 /*
52  * Get the stuff needed by FileStandardInformation that was
53  * not already obtained by smb2_ofile_getattr().
54  * (qi_delete_on_close, qi_isdir)
55  */
56 uint32_t
smb2_ofile_getstd(smb_ofile_t * of,smb_queryinfo_t * qi)57 smb2_ofile_getstd(smb_ofile_t *of, smb_queryinfo_t *qi)
58 {
59 	smb_node_t *node;
60 
61 	switch (of->f_ftype) {
62 	case SMB_FTYPE_DISK:
63 	case SMB_FTYPE_PRINTER:
64 		node = of->f_node;
65 		qi->qi_delete_on_close =
66 		    (node->flags & NODE_FLAGS_DELETE_ON_CLOSE) != 0;
67 		qi->qi_isdir = smb_node_is_dir(node);
68 		break;
69 	case SMB_FTYPE_BYTE_PIPE:
70 	case SMB_FTYPE_MESG_PIPE:
71 		qi->qi_delete_on_close = 1;
72 		qi->qi_isdir = 0;
73 		break;
74 	default:
75 		return (NT_STATUS_INVALID_DEVICE_REQUEST);
76 	}
77 
78 	return (0);
79 }
80 
81 /*
82  * Get info for FileNameInformation, FileAlternateNameInformation.
83  * (qi_name, qi_shortname)
84  */
85 uint32_t
smb2_ofile_getname(smb_ofile_t * of,smb_queryinfo_t * qi)86 smb2_ofile_getname(smb_ofile_t *of, smb_queryinfo_t *qi)
87 {
88 	int rc;
89 
90 	switch (of->f_ftype) {
91 	case SMB_FTYPE_DISK:
92 	case SMB_FTYPE_PRINTER:
93 		rc = smb_node_getshrpath(of->f_node, of->f_tree,
94 		    qi->qi_name, MAXPATHLEN);
95 		break;
96 	case SMB_FTYPE_BYTE_PIPE:
97 	case SMB_FTYPE_MESG_PIPE:
98 		rc = smb_opipe_getname(of, qi->qi_name, MAXPATHLEN);
99 		break;
100 	default:
101 		rc = ENOTTY;
102 		break;
103 	}
104 	if (rc)
105 		return (smb_errno2status(rc));
106 	qi->qi_namelen = smb_wcequiv_strlen(qi->qi_name);
107 
108 	return (0);
109 
110 }
111