Author: tridge
Date: 2005-01-16 01:22:08 +0000 (Sun, 16 Jan 2005)
New Revision: 4767

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

Log:
handle the different NBT session request refusals, and map them to
reasonable NT_STATUS values

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


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/raw/clitransport.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/clitransport.c 2005-01-16 01:21:58 UTC 
(rev 4766)
+++ branches/SAMBA_4_0/source/libcli/raw/clitransport.c 2005-01-16 01:22:08 UTC 
(rev 4767)
@@ -182,24 +182,53 @@
 }
 
 /*
+  map a session request error to a NTSTATUS
+ */
+static NTSTATUS map_session_refused_error(uint8_t error)
+{
+       switch (error) {
+       case 0x80:
+       case 0x81:
+               return NT_STATUS_REMOTE_NOT_LISTENING;
+       case 0x82:
+               return NT_STATUS_RESOURCE_NAME_NOT_FOUND;
+       case 0x83:
+               return NT_STATUS_REMOTE_RESOURCES;
+       }
+       return NT_STATUS_UNEXPECTED_IO_ERROR;
+}
+
+
+/*
   finish a smbcli_transport_connect()
 */
-BOOL smbcli_transport_connect_recv(struct smbcli_request *req)
+NTSTATUS smbcli_transport_connect_recv(struct smbcli_request *req)
 {
+       NTSTATUS status;
+
        if (!smbcli_request_receive(req)) {
                smbcli_request_destroy(req);
-               return False;
+               return NT_STATUS_UNEXPECTED_NETWORK_ERROR;
        }
 
-       if (CVAL(req->in.buffer,0) != 0x82) {
-               req->transport->error.etype = ETYPE_NBT;
-               req->transport->error.e.nbt_error = CVAL(req->in.buffer,4);
-               smbcli_request_destroy(req);
-               return False;
+       switch (CVAL(req->in.buffer,0)) {
+       case 0x82:
+               status = NT_STATUS_OK;
+               break;
+       case 0x83:
+               status = map_session_refused_error(CVAL(req->in.buffer,4));
+               break;
+       case 0x84:
+               DEBUG(1,("Warning: session retarget not supported\n"));
+               status = NT_STATUS_NOT_SUPPORTED;
+               break;
+       default:
+               status = NT_STATUS_UNEXPECTED_IO_ERROR;
+               break;
        }
 
        smbcli_request_destroy(req);
-       return True;
+       return status;
 }
 
 
@@ -211,14 +240,16 @@
                              struct nmb_name *called)
 {
        struct smbcli_request *req;
-       
+       NTSTATUS status;
+
        if (transport->socket->port == 445) {
                return True;
        }
 
        req = smbcli_transport_connect_send(transport, 
                                            calling, called);
-       return smbcli_transport_connect_recv(req);
+       status = smbcli_transport_connect_recv(req);
+       return NT_STATUS_IS_OK(status);
 }
 
 /****************************************************************************

Reply via email to