r17020: pass the real error to the failing requests
authorStefan Metzmacher <metze@samba.org>
Thu, 13 Jul 2006 17:37:45 +0000 (17:37 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:10:08 +0000 (14:10 -0500)
metze
(This used to be commit 49b96ac44a883c020c69df7a12df154dc4faa4d5)

source4/libcli/raw/clitransport.c
source4/libcli/smb2/transport.c
source4/torture/basic/delete.c
source4/torture/raw/notify.c

index fc257b909811078cc1145d7f598330150e97d1fc..641ad38031057310c4cb869c58120371088c5d60 100644 (file)
@@ -52,7 +52,7 @@ static void smbcli_transport_event_handler(struct event_context *ev,
  */
 static int transport_destructor(struct smbcli_transport *transport)
 {
-       smbcli_transport_dead(transport);
+       smbcli_transport_dead(transport, NT_STATUS_LOCAL_DISCONNECT);
        return 0;
 }
 
@@ -63,7 +63,7 @@ static int transport_destructor(struct smbcli_transport *transport)
 static void smbcli_transport_error(void *private, NTSTATUS status)
 {
        struct smbcli_transport *transport = talloc_get_type(private, struct smbcli_transport);
-       smbcli_transport_dead(transport);
+       smbcli_transport_dead(transport, status);
 }
 
 static NTSTATUS smbcli_transport_finish_recv(void *private, DATA_BLOB blob);
@@ -130,15 +130,19 @@ struct smbcli_transport *smbcli_transport_init(struct smbcli_socket *sock,
 /*
   mark the transport as dead
 */
-void smbcli_transport_dead(struct smbcli_transport *transport)
+void smbcli_transport_dead(struct smbcli_transport *transport, NTSTATUS status)
 {
        smbcli_sock_dead(transport->socket);
 
+       if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) {
+               status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
+       }
+
        /* kill all pending receives */
        while (transport->pending_recv) {
                struct smbcli_request *req = transport->pending_recv;
                req->state = SMBCLI_REQUEST_ERROR;
-               req->status = NT_STATUS_NET_WRITE_FAULT;
+               req->status = status;
                DLIST_REMOVE(transport->pending_recv, req);
                if (req->async.fn) {
                        req->async.fn(req);
index 6f916997048def1312094552ad09248cf33b6bc6..df3bec8720d63554c9b1ddeabbb49447eda16cb0 100644 (file)
@@ -53,7 +53,7 @@ static void smb2_transport_event_handler(struct event_context *ev,
  */
 static int transport_destructor(struct smb2_transport *transport)
 {
-       smb2_transport_dead(transport);
+       smb2_transport_dead(transport, NT_STATUS_LOCAL_DISCONNECT);
        return 0;
 }
 
@@ -65,7 +65,7 @@ static void smb2_transport_error(void *private, NTSTATUS status)
 {
        struct smb2_transport *transport = talloc_get_type(private, 
                                                           struct smb2_transport);
-       smb2_transport_dead(transport);
+       smb2_transport_dead(transport, status);
 }
 
 static NTSTATUS smb2_transport_finish_recv(void *private, DATA_BLOB blob);
@@ -120,15 +120,19 @@ struct smb2_transport *smb2_transport_init(struct smbcli_socket *sock,
 /*
   mark the transport as dead
 */
-void smb2_transport_dead(struct smb2_transport *transport)
+void smb2_transport_dead(struct smb2_transport *transport, NTSTATUS status)
 {
        smbcli_sock_dead(transport->socket);
 
+       if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) {
+               status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
+       }
+
        /* kill all pending receives */
        while (transport->pending_recv) {
                struct smb2_request *req = transport->pending_recv;
                req->state = SMB2_REQUEST_ERROR;
-               req->status = NT_STATUS_NET_WRITE_FAULT;
+               req->status = status;
                DLIST_REMOVE(transport->pending_recv, req);
                if (req->async.fn) {
                        req->async.fn(req);
index d3f7de201f91344ae702720bbd47fceab7e9f4e7..445333ca6fac3fa2e200ef71a8badcf715dc2092 100644 (file)
@@ -1592,7 +1592,7 @@ static BOOL deltest21(struct smbcli_state **ppcli1, struct smbcli_state **ppcli2
        correct &= check_delete_on_close(cli1, fnum1, fname, True, __location__);
 
        /* Now yank the rug from under cli1. */
-       smbcli_transport_dead(cli1->transport);
+       smbcli_transport_dead(cli1->transport, NT_STATUS_LOCAL_DISCONNECT);
 
        fnum1 = -1;
 
index 577f46121958c6a5df617c3e4c6796ffcef1994b..b7bbb774b6b500555d35956a425f4bf4cad685d9 100644 (file)
@@ -842,7 +842,7 @@ done:
 static void tcp_dis_handler(struct smbcli_transport *t, void *p)
 {
        struct smbcli_state *cli = p;
-       smbcli_transport_dead(cli->transport);
+       smbcli_transport_dead(cli->transport, NT_STATUS_LOCAL_DISCONNECT);
        cli->transport = NULL;
        cli->tree = NULL;
 }
@@ -898,7 +898,7 @@ static BOOL test_notify_tcp_dis(TALLOC_CTX *mem_ctx)
        smbcli_transport_idle_handler(cli->transport, tcp_dis_handler, 250, cli);
 
        status = smb_raw_changenotify_recv(req, mem_ctx, &notify);
-       CHECK_STATUS(status, NT_STATUS_NET_WRITE_FAULT);
+       CHECK_STATUS(status, NT_STATUS_LOCAL_DISCONNECT);
 
 done:
        torture_close_connection(cli);