s3:smb2_break: make use of file_fsp_smb2()
[Samba/gebeck_regimport.git] / source4 / ntvfs / posix / pvfs_flush.c
blobf425fccec759347a8f2362b63366f43c0e882834
1 /*
2 Unix SMB/CIFS implementation.
4 POSIX NTVFS backend - flush
6 Copyright (C) Andrew Tridgell 2004
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.
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.
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/>.
22 #include "includes.h"
23 #include "vfs_posix.h"
26 flush a single open file
28 static void pvfs_flush_file(struct pvfs_state *pvfs, struct pvfs_file *f)
30 if (f->handle->fd == -1) {
31 return;
33 if (pvfs->flags & PVFS_FLAG_STRICT_SYNC) {
34 fsync(f->handle->fd);
39 flush a fnum
41 NTSTATUS pvfs_flush(struct ntvfs_module_context *ntvfs,
42 struct ntvfs_request *req,
43 union smb_flush *io)
45 struct pvfs_state *pvfs = talloc_get_type(ntvfs->private_data,
46 struct pvfs_state);
47 struct pvfs_file *f;
49 switch (io->generic.level) {
50 case RAW_FLUSH_FLUSH:
51 case RAW_FLUSH_SMB2:
52 /* TODO: take care of io->smb2.in.unknown */
53 f = pvfs_find_fd(pvfs, req, io->generic.in.file.ntvfs);
54 if (!f) {
55 return NT_STATUS_INVALID_HANDLE;
57 pvfs_flush_file(pvfs, f);
58 io->smb2.out.reserved = 0;
59 return NT_STATUS_OK;
61 case RAW_FLUSH_ALL:
62 if (!(pvfs->flags & PVFS_FLAG_STRICT_SYNC)) {
63 return NT_STATUS_OK;
66 /*
67 * they are asking to flush all open files
68 * for the given SMBPID
70 for (f=pvfs->files.list;f;f=f->next) {
71 if (f->ntvfs->smbpid != req->smbpid) continue;
73 pvfs_flush_file(pvfs, f);
76 return NT_STATUS_OK;
79 return NT_STATUS_INVALID_LEVEL;