r3336: use a struct ntvfs_async_state to be able to do async chaning of ntvfs modules
[samba.git] / source4 / ntvfs / ntvfs_util.c
index 4036fb0935cfe380830c36c65dc6c0db6b2fce26..929ec037de182cb26d17ba435bc923bf07d4364a 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    NTVFS utility code
-   Copyright (C) Andrew Tridgell 2003
+   Copyright (C) Stefan Metzmacher 2004
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include "includes.h"
 
+NTSTATUS ntvfs_async_state_push(struct smbsrv_request *req,
+                               void *private_data,
+                               void (*send_fn)(struct smbsrv_request *),
+                               struct ntvfs_module_context *ntvfs)
+{
+       struct ntvfs_async_state *async;
 
+       async = talloc_p(req, struct ntvfs_async_state);
+       if (!async) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       async->state            = req->async_states->state;
+       async->private_data     = private_data;
+       async->send_fn          = send_fn;
+       async->status           = NT_STATUS_INTERNAL_ERROR;
+
+       async->ntvfs            = ntvfs;
+
+       DLIST_ADD(req->async_states, async);
+
+       return NT_STATUS_OK;
+}
+
+void ntvfs_async_state_pop(struct smbsrv_request *req)
+{
+       struct ntvfs_async_state *async;
+
+       async = req->async_states;
+
+       DLIST_REMOVE(req->async_states, async);
+
+       req->async_states->state        = async->state;
+       req->async_states->status       = async->status;
+
+       talloc_free(async);
+}