r17088: add ntvfs mapping function for notify
authorStefan Metzmacher <metze@samba.org>
Mon, 17 Jul 2006 11:17:32 +0000 (11:17 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:10:12 +0000 (14:10 -0500)
metze
(This used to be commit 7daf432d58ecebd10a28acd3ddbded9cb16536d0)

source4/ntvfs/ntvfs_generic.c
source4/ntvfs/posix/pvfs_notify.c

index e0e69b25e125ec9b13aabe48e8ed54b5d9a2b971..aff05b70a8905f32e861a73ab30b428e1e510660 100644 (file)
@@ -1327,3 +1327,67 @@ _PUBLIC_ NTSTATUS ntvfs_map_close(struct ntvfs_module_context *ntvfs,
 
        return ntvfs->ops->close(ntvfs, req, cl2);
 }
+
+/* 
+   NTVFS notify generic to any mapper
+*/
+static NTSTATUS ntvfs_map_notify_finish(struct ntvfs_module_context *ntvfs,
+                                       struct ntvfs_request *req,
+                                       union smb_notify *nt, 
+                                       union smb_notify *nt2, 
+                                       NTSTATUS status)
+{
+       NT_STATUS_NOT_OK_RETURN(status);
+
+       switch (nt->nttrans.level) {
+       case RAW_NOTIFY_SMB2:
+               if (nt2->nttrans.out.num_changes == 0) {
+                       return STATUS_NOTIFY_ENUM_DIR;
+               }
+               nt->smb2.out.num_changes        = nt2->nttrans.out.num_changes;
+               nt->smb2.out.changes            = talloc_steal(req, nt2->nttrans.out.changes);
+               break;
+
+       default:
+               return NT_STATUS_INVALID_LEVEL;
+       }
+
+       return status;
+}
+
+
+/* 
+   NTVFS notify generic to any mapper
+*/
+_PUBLIC_ NTSTATUS ntvfs_map_notify(struct ntvfs_module_context *ntvfs,
+                                  struct ntvfs_request *req,
+                                  union smb_notify *nt)
+{
+       union smb_notify *nt2;
+       NTSTATUS status;
+
+       nt2 = talloc(req, union smb_notify);
+       NT_STATUS_HAVE_NO_MEMORY(nt2);
+
+       status = ntvfs_map_async_setup(ntvfs, req, nt, nt2, 
+                                      (second_stage_t)ntvfs_map_notify_finish);
+       NT_STATUS_NOT_OK_RETURN(status);
+
+       nt2->nttrans.level = RAW_NOTIFY_NTTRANS;
+
+       switch (nt->nttrans.level) {
+       case RAW_NOTIFY_NTTRANS:
+               status = NT_STATUS_INVALID_LEVEL;
+               break;
+
+       case RAW_NOTIFY_SMB2:
+               nt2->nttrans.in.file.ntvfs              = nt->smb2.in.file.ntvfs;
+               nt2->nttrans.in.buffer_size             = nt->smb2.in.buffer_size;
+               nt2->nttrans.in.completion_filter       = nt->smb2.in.completion_filter;
+               nt2->nttrans.in.recursive               = nt->smb2.in.recursive;
+               status = ntvfs->ops->notify(ntvfs, req, nt2);
+               break;
+       }
+
+       return ntvfs_map_async_finish(req, status);
+}
index d6fec02305559dbeb790f0d34af050dd23ebf327..460bf11f4039575e3e61c6c25ed7a4718b25000a 100644 (file)
@@ -226,7 +226,7 @@ NTSTATUS pvfs_notify(struct ntvfs_module_context *ntvfs,
        struct notify_pending *pending;
 
        if (info->nttrans.level != RAW_NOTIFY_NTTRANS) {
-               return NT_STATUS_NOT_IMPLEMENTED;
+               return ntvfs_map_notify(ntvfs, req, info);
        }
 
        f = pvfs_find_fd(pvfs, req, info->nttrans.in.file.ntvfs);