Decouple clistr_pull from struct cli_state->inbuf
[metze/samba/wip.git] / source3 / libsmb / clistr.c
index 3c9964368edea37899ba507e3360c268961ba5fc..86857814043338df630c326d6a3b2007bf067338 100644 (file)
@@ -2,10 +2,11 @@
    Unix SMB/CIFS implementation.
    client string routines
    Copyright (C) Andrew Tridgell 2001
-   
+   Copyright (C) Andrew Bartlett <abartlet@samba.org> 2003
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 
-int clistr_push(struct cli_state *cli, void *dest, const char *src, int dest_len, int flags)
+size_t clistr_push_fn(const char *function,
+                       unsigned int line,
+                       struct cli_state *cli,
+                       void *dest,
+                       const char *src,
+                       int dest_len,
+                       int flags)
 {
-       return push_string(cli->outbuf, dest, src, dest_len, flags);
+       size_t buf_used = PTR_DIFF(dest, cli->outbuf);
+       if (dest_len == -1) {
+               if (((ptrdiff_t)dest < (ptrdiff_t)cli->outbuf) || (buf_used > cli->bufsize)) {
+                       DEBUG(0, ("Pushing string of 'unlimited' length into non-SMB buffer!\n"));
+                       return push_string_fn(function, line,
+                                             cli->outbuf,
+                                             SVAL(cli->outbuf, smb_flg2),
+                                             dest, src, -1, flags);
+               }
+               return push_string_fn(function, line, cli->outbuf,
+                                     SVAL(cli->outbuf, smb_flg2),
+                                     dest, src, cli->bufsize - buf_used,
+                                     flags);
+       }
+
+       /* 'normal' push into size-specified buffer */
+       return push_string_fn(function, line, cli->outbuf,
+                             SVAL(cli->outbuf, smb_flg2),
+                             dest, src, dest_len, flags);
 }
 
-int clistr_pull(struct cli_state *cli, char *dest, const void *src, int dest_len, int src_len, 
-               int flags)
+size_t clistr_pull_fn(const char *function,
+                       unsigned int line,
+                       const char *inbuf,
+                       char *dest,
+                       const void *src,
+                       int dest_len,
+                       int src_len,
+                       int flags)
 {
-       return pull_string(cli->inbuf, dest, src, dest_len, src_len, flags);
+       return pull_string_fn(function, line, inbuf,
+                             SVAL(inbuf, smb_flg2), dest, src, dest_len,
+                             src_len, flags);
 }
 
+size_t clistr_pull_talloc_fn(const char *function,
+                               unsigned int line,
+                               TALLOC_CTX *ctx,
+                               const char *inbuf,
+                               char **pp_dest,
+                               const void *src,
+                               int src_len,
+                               int flags)
+{
+       return pull_string_talloc_fn(function,
+                                       line,
+                                       ctx,
+                                       inbuf,
+                                       SVAL(inbuf, smb_flg2),
+                                       pp_dest,
+                                       src,
+                                       src_len,
+                                       flags);
+}
 
-int clistr_align_out(struct cli_state *cli, const void *p, int flags)
+size_t clistr_align_out(struct cli_state *cli, const void *p, int flags)
 {
-       return align_string(cli->outbuf, p, flags);
+       return align_string(cli->outbuf, (const char *)p, flags);
 }
 
-int clistr_align_in(struct cli_state *cli, const void *p, int flags)
+size_t clistr_align_in(struct cli_state *cli, const void *p, int flags)
 {
-       return align_string(cli->inbuf, p, flags);
+       return align_string(cli->inbuf, (const char *)p, flags);
 }