Move client_receive_smb to clientgen.c as a static, as proposed by Elrond.
[kai/samba.git] / source3 / libsmb / clientgen.c
index 610af9cc237378100cacda19f65103aeac6c1b58..dee86b2b05d86b32c6c11ca5a4277e776aee79be 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    SMB client generic functions
    Copyright (C) Andrew Tridgell 1994-1998
    
@@ -32,6 +31,41 @@ int cli_set_port(struct cli_state *cli, int port)
        return port;
 }
 
+/****************************************************************************
+  read an smb from a fd ignoring all keepalive packets. Note that the buffer 
+  *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
+  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(int fd,char *buffer, unsigned int timeout)
+{
+  BOOL ret;
+
+  for(;;)
+  {
+    ret = receive_smb(fd, buffer, timeout);
+
+    if (!ret)
+    {
+      DEBUG(10,("client_receive_smb failed\n"));
+      show_msg(buffer);
+      return ret;
+    }
+
+    /* Ignore session keepalive packets. */
+    if(CVAL(buffer,0) != SMBkeepalive)
+      break;
+  }
+  show_msg(buffer);
+  return ret;
+}
+
+
 /****************************************************************************
 recv an smb
 ****************************************************************************/
@@ -57,7 +91,7 @@ BOOL cli_receive_smb(struct cli_state *cli)
                                if (!cli->oplock_handler(cli, fnum, level)) return False;
                        }
                        /* try to prevent loops */
-                       CVAL(cli->inbuf,smb_com) = 0xFF;
+                       SCVAL(cli->inbuf,smb_com,0xFF);
                        goto again;
                }
        }
@@ -139,7 +173,7 @@ void cli_setup_bcc(struct cli_state *cli, void *p)
 
 
 /****************************************************************************
-initialise a client structure
+initialise credentials of a client structure
 ****************************************************************************/
 void cli_init_creds(struct cli_state *cli, const struct ntuser_creds *usr)
 {
@@ -208,7 +242,7 @@ struct cli_state *cli_initialise(struct cli_state *cli)
        if (!cli->outbuf || !cli->inbuf)
                 goto error;
 
-       if ((cli->mem_ctx = talloc_init()) == NULL)
+       if ((cli->mem_ctx = talloc_init_named("cli based talloc")) == NULL)
                 goto error;
 
        memset(cli->outbuf, 0, cli->bufsize);
@@ -248,10 +282,6 @@ void cli_shutdown(struct cli_state *cli)
        if (cli->mem_ctx)
                talloc_destroy(cli->mem_ctx);
 
-#ifdef WITH_SSL
-       if (cli->fd != -1)
-               sslutil_disconnect(cli->fd);
-#endif /* WITH_SSL */
        if (cli->fd != -1) 
                close(cli->fd);
        allocated = cli->allocated;