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