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); } /****************************************************************************