svn commit: samba r7654 - in branches/SAMBA_4_0/source/libcli/raw: .

tridge at samba.org tridge at samba.org
Thu Jun 16 23:19:03 GMT 2005


Author: tridge
Date: 2005-06-16 23:19:03 +0000 (Thu, 16 Jun 2005)
New Revision: 7654

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

Log:
 - add a timeout to all smb requests (default 60 seconds)

 - add a request destructor, to make it safe to destroy a pending
   request with talloc_free()


Modified:
   branches/SAMBA_4_0/source/libcli/raw/clitransport.c
   branches/SAMBA_4_0/source/libcli/raw/libcliraw.h


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/raw/clitransport.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/clitransport.c	2005-06-16 23:02:40 UTC (rev 7653)
+++ branches/SAMBA_4_0/source/libcli/raw/clitransport.c	2005-06-16 23:19:03 UTC (rev 7654)
@@ -79,6 +79,7 @@
 	transport->options.use_spnego = lp_use_spnego();
 	transport->options.max_xmit = lp_max_xmit();
 	transport->options.max_mux = lp_maxmux();
+	transport->options.request_timeout = SMB_REQUEST_TIMEOUT;
 
 	transport->negotiate.max_xmit = transport->options.max_xmit;
 	
@@ -580,9 +581,45 @@
 	return True;
 }
 
+/*
+  handle timeouts of individual smb requests
+*/
+static void smbcli_timeout_handler(struct event_context *ev, struct timed_event *te, 
+				   struct timeval t, void *private)
+{
+	struct smbcli_request *req = talloc_get_type(private, struct smbcli_request);
 
+	if (req->state == SMBCLI_REQUEST_SEND) {
+		DLIST_REMOVE(req->transport->pending_send, req);
+	}
+	if (req->state == SMBCLI_REQUEST_RECV) {
+		DLIST_REMOVE(req->transport->pending_recv, req);
+	}
+	req->status = NT_STATUS_IO_TIMEOUT;
+	req->state = SMBCLI_REQUEST_ERROR;
+	if (req->async.fn) {
+		req->async.fn(req);
+	}
+}
 
+
 /*
+  destroy a request
+*/
+static int smbcli_request_destructor(void *ptr)
+{
+	struct smbcli_request *req = talloc_get_type(ptr, struct smbcli_request);
+	if (req->state == SMBCLI_REQUEST_SEND) {
+		DLIST_REMOVE(req->transport->pending_send, req);
+	}
+	if (req->state == SMBCLI_REQUEST_RECV) {
+		DLIST_REMOVE(req->transport->pending_recv, req);
+	}
+	return 0;
+}
+
+
+/*
   put a request into the send queue
 */
 void smbcli_transport_send(struct smbcli_request *req)
@@ -600,4 +637,13 @@
 
 	/* make sure we look for write events */
 	smbcli_transport_write_enable(req->transport);
+
+	/* add a timeout */
+	if (req->transport->options.request_timeout) {
+		event_add_timed(req->transport->socket->event.ctx, req, 
+				timeval_current_ofs(req->transport->options.request_timeout, 0), 
+				smbcli_timeout_handler, req);
+	}
+
+	talloc_set_destructor(req, smbcli_request_destructor);
 }

Modified: branches/SAMBA_4_0/source/libcli/raw/libcliraw.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/libcliraw.h	2005-06-16 23:02:40 UTC (rev 7653)
+++ branches/SAMBA_4_0/source/libcli/raw/libcliraw.h	2005-06-16 23:19:03 UTC (rev 7654)
@@ -28,6 +28,9 @@
 struct smbcli_session;  /* forward declare */
 struct smbcli_transport;  /* forward declare */
 
+/* default timeout for all smb requests */
+#define SMB_REQUEST_TIMEOUT 60
+
 /* context that will be and has been negotiated between the client and server */
 struct smbcli_negotiate {
 	/* 
@@ -88,6 +91,7 @@
 	uint_t use_spnego:1;
 	uint32_t max_xmit;
 	uint16_t max_mux;
+	int request_timeout;
 };
 
 /* this is the context for the client transport layer */



More information about the samba-cvs mailing list