1a90cf9f2SGordon Ross /*
2a90cf9f2SGordon Ross * This file and its contents are supplied under the terms of the
3a90cf9f2SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
4a90cf9f2SGordon Ross * You may only use this file in accordance with the terms of version
5a90cf9f2SGordon Ross * 1.0 of the CDDL.
6a90cf9f2SGordon Ross *
7a90cf9f2SGordon Ross * A full copy of the text of the CDDL should have accompanied this
8a90cf9f2SGordon Ross * source. A copy of the CDDL is also available via the Internet at
9a90cf9f2SGordon Ross * http://www.illumos.org/license/CDDL.
10a90cf9f2SGordon Ross */
11a90cf9f2SGordon Ross
12a90cf9f2SGordon Ross /*
13*8d94f651SGordon Ross * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
14a90cf9f2SGordon Ross */
15a90cf9f2SGordon Ross
16a90cf9f2SGordon Ross /*
17a90cf9f2SGordon Ross * Dispatch function for SMB2_CLOSE
18a90cf9f2SGordon Ross */
19a90cf9f2SGordon Ross
20a90cf9f2SGordon Ross #include <smbsrv/smb2_kproto.h>
21a90cf9f2SGordon Ross
22a90cf9f2SGordon Ross smb_sdrc_t
smb2_close(smb_request_t * sr)23a90cf9f2SGordon Ross smb2_close(smb_request_t *sr)
24a90cf9f2SGordon Ross {
25a90cf9f2SGordon Ross smb_attr_t attr;
26a90cf9f2SGordon Ross smb_ofile_t *of;
27a90cf9f2SGordon Ross uint16_t StructSize;
28a90cf9f2SGordon Ross uint16_t Flags;
29a90cf9f2SGordon Ross uint32_t reserved;
30a90cf9f2SGordon Ross smb2fid_t smb2fid;
31a90cf9f2SGordon Ross uint32_t status;
32a90cf9f2SGordon Ross int rc = 0;
33a90cf9f2SGordon Ross
34a90cf9f2SGordon Ross /*
35a90cf9f2SGordon Ross * SMB2 Close request
36a90cf9f2SGordon Ross */
37a90cf9f2SGordon Ross rc = smb_mbc_decodef(
38a90cf9f2SGordon Ross &sr->smb_data, "wwlqq",
39a90cf9f2SGordon Ross &StructSize, /* w */
40a90cf9f2SGordon Ross &Flags, /* w */
41a90cf9f2SGordon Ross &reserved, /* l */
42a90cf9f2SGordon Ross &smb2fid.persistent, /* q */
43a90cf9f2SGordon Ross &smb2fid.temporal); /* q */
44a90cf9f2SGordon Ross if (rc)
45a90cf9f2SGordon Ross return (SDRC_ERROR);
46a90cf9f2SGordon Ross if (StructSize != 24)
47a90cf9f2SGordon Ross return (SDRC_ERROR);
48a90cf9f2SGordon Ross
4993bc28dbSGordon Ross /*
5093bc28dbSGordon Ross * Want FID lookup before the start probe.
5193bc28dbSGordon Ross */
52a90cf9f2SGordon Ross status = smb2sr_lookup_fid(sr, &smb2fid);
53a90cf9f2SGordon Ross of = sr->fid_ofile;
54a90cf9f2SGordon Ross
5593bc28dbSGordon Ross DTRACE_SMB2_START(op__Close, smb_request_t *, sr);
5693bc28dbSGordon Ross
5793bc28dbSGordon Ross if (status)
5893bc28dbSGordon Ross goto errout; /* Bad FID */
5993bc28dbSGordon Ross
60a90cf9f2SGordon Ross bzero(&attr, sizeof (attr));
61a90cf9f2SGordon Ross if (Flags & SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB) {
62a90cf9f2SGordon Ross attr.sa_mask = SMB_AT_ALL;
63a90cf9f2SGordon Ross status = smb2_ofile_getattr(sr, of, &attr);
64a90cf9f2SGordon Ross if (status) {
65a90cf9f2SGordon Ross /*
66a90cf9f2SGordon Ross * We could not stat the open file.
67a90cf9f2SGordon Ross * Let's not fail the close call,
68a90cf9f2SGordon Ross * but just turn off the flag.
69a90cf9f2SGordon Ross */
70a90cf9f2SGordon Ross Flags = 0;
71a90cf9f2SGordon Ross }
72a90cf9f2SGordon Ross }
73a90cf9f2SGordon Ross
74*8d94f651SGordon Ross if (of->dh_persist)
75*8d94f651SGordon Ross smb2_dh_setdoc_persistent(of);
76a90cf9f2SGordon Ross smb_ofile_close(of, 0);
77a90cf9f2SGordon Ross
7893bc28dbSGordon Ross errout:
7993bc28dbSGordon Ross sr->smb2_status = status;
8093bc28dbSGordon Ross DTRACE_SMB2_DONE(op__Close, smb_request_t *, sr);
8193bc28dbSGordon Ross
8293bc28dbSGordon Ross if (status) {
8393bc28dbSGordon Ross smb2sr_put_error(sr, status);
8493bc28dbSGordon Ross return (SDRC_SUCCESS);
8593bc28dbSGordon Ross }
8693bc28dbSGordon Ross
87a90cf9f2SGordon Ross /*
88a90cf9f2SGordon Ross * SMB2 Close reply
89a90cf9f2SGordon Ross */
90a90cf9f2SGordon Ross (void) smb_mbc_encodef(
91a90cf9f2SGordon Ross &sr->reply,
92a90cf9f2SGordon Ross "wwlTTTTqql",
93a90cf9f2SGordon Ross 60, /* StructSize */ /* w */
94a90cf9f2SGordon Ross Flags, /* w */
95a90cf9f2SGordon Ross 0, /* reserved */ /* l */
96a90cf9f2SGordon Ross &attr.sa_crtime, /* T */
97a90cf9f2SGordon Ross &attr.sa_vattr.va_atime, /* T */
98a90cf9f2SGordon Ross &attr.sa_vattr.va_mtime, /* T */
99a90cf9f2SGordon Ross &attr.sa_vattr.va_ctime, /* T */
100a90cf9f2SGordon Ross attr.sa_allocsz, /* q */
101a90cf9f2SGordon Ross attr.sa_vattr.va_size, /* q */
102a90cf9f2SGordon Ross attr.sa_dosattr); /* l */
103a90cf9f2SGordon Ross
104a90cf9f2SGordon Ross return (SDRC_SUCCESS);
105a90cf9f2SGordon Ross }
106