mirror of
https://github.com/samba-team/samba.git
synced 2025-02-10 13:57:47 +03:00
r8407: fixed a bug left over from our old socket code.
Thanks to lha for giving me a login on a netbsd machine to see this
This commit is contained in:
parent
632f99017d
commit
4e66f682e4
@ -273,48 +273,33 @@ void smbcli_sock_set_options(struct smbcli_socket *sock, const char *options)
|
||||
/****************************************************************************
|
||||
Write to socket. Return amount written.
|
||||
****************************************************************************/
|
||||
ssize_t smbcli_sock_write(struct smbcli_socket *sock, const uint8_t *data, size_t len)
|
||||
NTSTATUS smbcli_sock_write(struct smbcli_socket *sock, const uint8_t *data,
|
||||
size_t len, size_t *nsent)
|
||||
{
|
||||
NTSTATUS status;
|
||||
DATA_BLOB blob;
|
||||
size_t nsent;
|
||||
|
||||
if (sock->sock == NULL) {
|
||||
errno = EIO;
|
||||
return -1;
|
||||
return NT_STATUS_CONNECTION_DISCONNECTED;
|
||||
}
|
||||
|
||||
blob.data = discard_const(data);
|
||||
blob.length = len;
|
||||
|
||||
status = socket_send(sock->sock, &blob, &nsent, 0);
|
||||
if (NT_STATUS_IS_ERR(status)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return nsent;
|
||||
return socket_send(sock->sock, &blob, nsent, 0);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Read from socket. return amount read
|
||||
****************************************************************************/
|
||||
ssize_t smbcli_sock_read(struct smbcli_socket *sock, uint8_t *data, size_t len)
|
||||
NTSTATUS smbcli_sock_read(struct smbcli_socket *sock, uint8_t *data,
|
||||
size_t len, size_t *nread)
|
||||
{
|
||||
NTSTATUS status;
|
||||
size_t nread;
|
||||
|
||||
if (sock->sock == NULL) {
|
||||
errno = EIO;
|
||||
return -1;
|
||||
return NT_STATUS_CONNECTION_DISCONNECTED;
|
||||
}
|
||||
|
||||
status = socket_recv(sock->sock, data, len, &nread, 0);
|
||||
if (NT_STATUS_IS_ERR(status)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return nread;
|
||||
return socket_recv(sock->sock, data, len, nread, 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -346,17 +346,19 @@ static void smbcli_transport_process_send(struct smbcli_transport *transport)
|
||||
{
|
||||
while (transport->pending_send) {
|
||||
struct smbcli_request *req = transport->pending_send;
|
||||
ssize_t ret;
|
||||
ret = smbcli_sock_write(transport->socket, req->out.buffer, req->out.size);
|
||||
if (ret == -1) {
|
||||
if (errno == EAGAIN || errno == EINTR) {
|
||||
return;
|
||||
}
|
||||
NTSTATUS status;
|
||||
size_t nwritten;
|
||||
|
||||
status = smbcli_sock_write(transport->socket, req->out.buffer,
|
||||
req->out.size, &nwritten);
|
||||
if (NT_STATUS_IS_ERR(status)) {
|
||||
smbcli_transport_dead(transport);
|
||||
}
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return;
|
||||
}
|
||||
req->out.buffer += ret;
|
||||
req->out.size -= ret;
|
||||
req->out.buffer += nwritten;
|
||||
req->out.size -= nwritten;
|
||||
if (req->out.size == 0) {
|
||||
DLIST_REMOVE(transport->pending_send, req);
|
||||
if (req->one_way_request) {
|
||||
@ -529,17 +531,21 @@ static void smbcli_transport_process_recv(struct smbcli_transport *transport)
|
||||
4 byte header, which tells us how much more is coming. Then
|
||||
we read the rest */
|
||||
if (transport->recv_buffer.received < NBT_HDR_SIZE) {
|
||||
ssize_t ret;
|
||||
ret = smbcli_sock_read(transport->socket,
|
||||
transport->recv_buffer.header +
|
||||
transport->recv_buffer.received,
|
||||
NBT_HDR_SIZE - transport->recv_buffer.received);
|
||||
if (ret == -1) {
|
||||
NTSTATUS status;
|
||||
size_t nread;
|
||||
status = smbcli_sock_read(transport->socket,
|
||||
transport->recv_buffer.header +
|
||||
transport->recv_buffer.received,
|
||||
NBT_HDR_SIZE - transport->recv_buffer.received,
|
||||
&nread);
|
||||
if (NT_STATUS_IS_ERR(status)) {
|
||||
smbcli_transport_dead(transport);
|
||||
}
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
transport->recv_buffer.received += ret;
|
||||
transport->recv_buffer.received += nread;
|
||||
|
||||
if (transport->recv_buffer.received == NBT_HDR_SIZE) {
|
||||
/* we've got a full header */
|
||||
@ -555,17 +561,21 @@ static void smbcli_transport_process_recv(struct smbcli_transport *transport)
|
||||
}
|
||||
|
||||
if (transport->recv_buffer.received < transport->recv_buffer.req_size) {
|
||||
ssize_t ret;
|
||||
ret = smbcli_sock_read(transport->socket,
|
||||
transport->recv_buffer.buffer +
|
||||
transport->recv_buffer.received,
|
||||
transport->recv_buffer.req_size -
|
||||
transport->recv_buffer.received);
|
||||
if (ret == -1) {
|
||||
NTSTATUS status;
|
||||
size_t nread;
|
||||
status = smbcli_sock_read(transport->socket,
|
||||
transport->recv_buffer.buffer +
|
||||
transport->recv_buffer.received,
|
||||
transport->recv_buffer.req_size -
|
||||
transport->recv_buffer.received,
|
||||
&nread);
|
||||
if (NT_STATUS_IS_ERR(status)) {
|
||||
smbcli_transport_dead(transport);
|
||||
}
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return;
|
||||
}
|
||||
transport->recv_buffer.received += ret;
|
||||
transport->recv_buffer.received += nread;
|
||||
}
|
||||
|
||||
if (transport->recv_buffer.received != 0 &&
|
||||
|
Loading…
x
Reference in New Issue
Block a user