Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : POSIX NTVFS backend - open and close
5 :
6 : Copyright (C) Andrew Tridgell 2004
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "vfs_posix.h"
24 : #include "../libcli/smb/smb_constants.h"
25 :
26 : /*
27 : old ioctl interface
28 : */
29 65540 : static NTSTATUS pvfs_ioctl_old(struct ntvfs_module_context *ntvfs,
30 : struct ntvfs_request *req, union smb_ioctl *io)
31 : {
32 65540 : return NT_STATUS_DOS(ERRSRV, ERRerror);
33 : }
34 :
35 : /*
36 : nt ioctl interface
37 : */
38 9 : static NTSTATUS pvfs_ntioctl(struct ntvfs_module_context *ntvfs,
39 : struct ntvfs_request *req, union smb_ioctl *io)
40 : {
41 9 : struct pvfs_state *pvfs = talloc_get_type(ntvfs->private_data,
42 : struct pvfs_state);
43 : struct pvfs_file *f;
44 :
45 9 : f = pvfs_find_fd(pvfs, req, io->ntioctl.in.file.ntvfs);
46 9 : if (!f) {
47 0 : return NT_STATUS_INVALID_HANDLE;
48 : }
49 :
50 9 : switch (io->ntioctl.in.function) {
51 5 : case FSCTL_SET_SPARSE:
52 : /* maybe some posix systems have a way of marking
53 : a file non-sparse? */
54 5 : io->ntioctl.out.blob = data_blob(NULL, 0);
55 5 : return NT_STATUS_OK;
56 : }
57 :
58 4 : return NT_STATUS_NOT_SUPPORTED;
59 : }
60 :
61 : /*
62 : ioctl interface
63 : */
64 66125 : NTSTATUS pvfs_ioctl(struct ntvfs_module_context *ntvfs,
65 : struct ntvfs_request *req,
66 : union smb_ioctl *io)
67 : {
68 66125 : switch (io->generic.level) {
69 65540 : case RAW_IOCTL_IOCTL:
70 65540 : return pvfs_ioctl_old(ntvfs, req, io);
71 :
72 9 : case RAW_IOCTL_NTIOCTL:
73 9 : return pvfs_ntioctl(ntvfs, req, io);
74 :
75 576 : case RAW_IOCTL_SMB2:
76 : case RAW_IOCTL_SMB2_NO_HANDLE:
77 : /* see WSPP SMB2 test 46 */
78 576 : return NT_STATUS_INVALID_DEVICE_REQUEST;
79 : }
80 :
81 0 : return NT_STATUS_INVALID_LEVEL;
82 : }
|