r15758: - handle RAW_FLUSH_SMB2 in the posix ntvfs backend
authorStefan Metzmacher <metze@samba.org>
Sat, 20 May 2006 18:57:32 +0000 (18:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:08:15 +0000 (14:08 -0500)
- Implement SMB2 Flush

metze
(This used to be commit 41d87ebe355cd34d35a93d1e90cd2680363cb5d3)

source4/ntvfs/posix/pvfs_flush.c
source4/smb_server/smb2/fileio.c

index 7bd973ed4ee2d89f1ff59347d27f1fe6a1bf50cb..2e64dc983d0824f0abc85d72cfb829726bde57a0 100644 (file)
@@ -48,7 +48,9 @@ NTSTATUS pvfs_flush(struct ntvfs_module_context *ntvfs,
 
        switch (io->generic.level) {
        case RAW_FLUSH_FLUSH:
-               f = pvfs_find_fd(pvfs, req, io->flush.in.file.ntvfs);
+       case RAW_FLUSH_SMB2:
+               /* TODO: take care of io->smb2.in.unknown */
+               f = pvfs_find_fd(pvfs, req, io->generic.in.file.ntvfs);
                if (!f) {
                        return NT_STATUS_INVALID_HANDLE;
                }
index 2b25cf0af1b46130732f4fdb9e8e22a5b9a6d062..e46a42c2d87748710f4070ba9dfe0ee2a9ddcaad 100644 (file)
@@ -117,9 +117,35 @@ void smb2srv_close_recv(struct smb2srv_request *req)
        SMB2SRV_CALL_NTVFS_BACKEND(ntvfs_close(req->ntvfs, io));
 }
 
+static void smb2srv_flush_send(struct ntvfs_request *ntvfs)
+{
+       struct smb2srv_request *req;
+       union smb_flush *io;
+
+       SMB2SRV_CHECK_ASYNC_STATUS(io, union smb_flush);
+       SMB2SRV_CHECK(smb2srv_setup_reply(req, 0x04, False, 0));
+
+       SSVAL(req->out.body,    0x02,   0);
+
+       smb2srv_send_reply(req);
+}
+
 void smb2srv_flush_recv(struct smb2srv_request *req)
 {
-       smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
+       union smb_flush *io;
+       uint16_t _pad;
+
+       SMB2SRV_CHECK_BODY_SIZE(req, 0x18, False);
+       SMB2SRV_TALLOC_IO_PTR(io, union smb_flush);
+       SMB2SRV_SETUP_NTVFS_REQUEST(smb2srv_flush_send, NTVFS_ASYNC_STATE_MAY_ASYNC);
+
+       io->smb2.level                  = RAW_FLUSH_SMB2;
+       _pad                            = SVAL(req->in.body, 0x02);
+       io->smb2.in.unknown             = IVAL(req->in.body, 0x04);
+       io->smb2.in.file.ntvfs          = smb2srv_pull_handle(req, req->in.body, 0x08);
+
+       SMB2SRV_CHECK_FILE_HANDLE(io->smb2.in.file.ntvfs);
+       SMB2SRV_CALL_NTVFS_BACKEND(ntvfs_flush(req->ntvfs, io));
 }
 
 void smb2srv_read_recv(struct smb2srv_request *req)