svn commit: samba r14012 - in branches/SAMBA_4_0/source/ntvfs/cifs: .

tridge at samba.org tridge at samba.org
Wed Mar 8 05:46:09 GMT 2006


Author: tridge
Date: 2006-03-08 05:46:09 +0000 (Wed, 08 Mar 2006)
New Revision: 14012

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=14012

Log:

added support for the SMBntcancel operation in the cifs ntvfs
backend. This requires keeping a list of outstanding requests so the
MID can be matched. Use a talloc destructor to manage the list.



Modified:
   branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c	2006-03-08 03:54:24 UTC (rev 14011)
+++ branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c	2006-03-08 05:46:09 UTC (rev 14012)
@@ -32,19 +32,24 @@
 #include "smbd/service_stream.h"
 #include "auth/auth.h"
 #include "ntvfs/ntvfs.h"
+#include "include/dlinklist.h"
 
 /* this is stored in ntvfs_private */
 struct cvfs_private {
 	struct smbcli_tree *tree;
 	struct smbcli_transport *transport;
 	struct smbsrv_tcon *tcon;
+	struct async_info *pending;
 	BOOL map_generic;
 };
 
 
 /* a structure used to pass information to an async handler */
 struct async_info {
+	struct async_info *next, *prev;
+	struct cvfs_private *cvfs;
 	struct smbsrv_request *req;
+	struct smbcli_request *c_req;
 	void *parms;
 };
 
@@ -93,11 +98,10 @@
 
 	machine_account = lp_parm_bool(req->tcon->service, "cifs", "use_machine_account", False);
 
-	private = talloc(ntvfs, struct cvfs_private);
+	private = talloc_zero(ntvfs, struct cvfs_private);
 	if (!private) {
 		return NT_STATUS_NO_MEMORY;
 	}
-	ZERO_STRUCTP(private);
 
 	ntvfs->private_data = private;
 
@@ -184,6 +188,16 @@
 }
 
 /*
+  destroy an async info structure
+*/
+static int async_info_destructor(void *p)
+{
+	struct async_info *async = talloc_get_type(p, struct async_info);
+	DLIST_REMOVE(async->cvfs->pending, async);
+	return 0;
+}
+
+/*
   a handler for simple async replies
   this handler can only be used for functions that don't return any
   parameters (those that just return a status code)
@@ -206,7 +220,11 @@
 		if (!async) return NT_STATUS_NO_MEMORY; \
 		async->parms = io; \
 		async->req = req; \
+		async->cvfs = private; \
+		async->c_req = c_req; \
+		DLIST_ADD(private->pending, async); \
 		c_req->async.private = async; \
+		talloc_set_destructor(async, async_info_destructor); \
 	} \
 	c_req->async.fn = async_fn; \
 	req->async_states->state |= NTVFS_ASYNC_STATE_ASYNC; \
@@ -673,7 +691,21 @@
 static NTSTATUS cvfs_cancel(struct ntvfs_module_context *ntvfs, 
 			    struct smbsrv_request *req)
 {
-	return NT_STATUS_NOT_IMPLEMENTED;
+	struct cvfs_private *private = ntvfs->private_data;
+
+	/* find the matching request */
+	struct async_info *a;
+	for (a=private->pending;a;a=a->next) {
+		if (SVAL(a->req->in.hdr, HDR_MID) == SVAL(req->in.hdr, HDR_MID)) {
+			break;
+		}
+	}
+
+	if (a == NULL) {
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	return smb_raw_ntcancel(a->c_req);
 }
 
 /*



More information about the samba-cvs mailing list