summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/client/client.c4
-rw-r--r--source3/libsmb/clientgen.c32
2 files changed, 28 insertions, 8 deletions
diff --git a/source3/client/client.c b/source3/client/client.c
index 481fca8f84..b32e5baae6 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -3666,12 +3666,12 @@ static void readline_callback(void)
timeout.tv_usec = 0;
sys_select_intr(cli->fd+1,&fds,NULL,NULL,&timeout);
- /* We deliberately use receive_smb instead of
+ /* We deliberately use cli_receive_smb_return_keepalive instead of
client_receive_smb as we want to receive
session keepalives and then drop them here.
*/
if (FD_ISSET(cli->fd,&fds)) {
- if (!receive_smb(cli->fd,cli->inbuf,0)) {
+ if (!cli_receive_smb_return_keepalive(cli)) {
DEBUG(0, ("Read from server failed, maybe it closed the "
"connection\n"));
return;
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index fc88f7f1e2..b3c38f39ae 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -48,13 +48,13 @@ int cli_set_port(struct cli_state *cli, int port)
*MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
The timeout is in milliseconds
- This is exactly the same as receive_smb except that it never returns
+ This is exactly the same as receive_smb except that it can be set to never return
a session keepalive packet (just as receive_smb used to do).
receive_smb was changed to return keepalives as the oplock processing means this call
should never go into a blocking read.
****************************************************************************/
-static BOOL client_receive_smb(struct cli_state *cli)
+static BOOL client_receive_smb(struct cli_state *cli, BOOL eat_keepalives)
{
BOOL ret;
int fd = cli->fd;
@@ -71,8 +71,10 @@ static BOOL client_receive_smb(struct cli_state *cli)
}
/* Ignore session keepalive packets. */
- if(CVAL(buffer,0) != SMBkeepalive)
- break;
+ if (eat_keepalives && (CVAL(buffer,0) == SMBkeepalive)) {
+ continue;
+ }
+ break;
}
if (cli_encryption_on(cli)) {
@@ -94,7 +96,7 @@ static BOOL client_receive_smb(struct cli_state *cli)
Recv an smb.
****************************************************************************/
-BOOL cli_receive_smb(struct cli_state *cli)
+BOOL cli_receive_smb_internal(struct cli_state *cli, BOOL eat_keepalives)
{
BOOL ret;
@@ -103,7 +105,7 @@ BOOL cli_receive_smb(struct cli_state *cli)
return False;
again:
- ret = client_receive_smb(cli);
+ ret = client_receive_smb(cli, eat_keepalives);
if (ret) {
/* it might be an oplock break request */
@@ -142,6 +144,24 @@ BOOL cli_receive_smb(struct cli_state *cli)
return True;
}
+/****************************************************************************
+ Recv an smb - eat keepalives.
+****************************************************************************/
+
+BOOL cli_receive_smb(struct cli_state *cli)
+{
+ return cli_receive_smb_internal(cli, True);
+}
+
+/****************************************************************************
+ Recv an smb - return keepalives.
+****************************************************************************/
+
+BOOL cli_receive_smb_return_keepalive(struct cli_state *cli)
+{
+ return cli_receive_smb_internal(cli, False);
+}
+
static ssize_t write_socket(int fd, const char *buf, size_t len)
{
ssize_t ret=0;