s3-talloc Change TALLOC_REALLOC_ARRAY() to talloc_realloc()
[ira/wip.git] / source3 / libsmb / clireadwrite.c
index 6482a335e1b9ce579252a67f6fa70e814d5ab370..fc6c9ffc0053f5fa545063a83a219781ce0e6f7d 100644 (file)
@@ -18,6 +18,8 @@
 */
 
 #include "includes.h"
+#include "libsmb/libsmb.h"
+#include "../lib/util/tevent_ntstatus.h"
 #include "async_smb.h"
 #include "trans2.h"
 
@@ -196,7 +198,7 @@ static void cli_read_andx_done(struct tevent_req *subreq)
                return;
        }
 
-       state->buf = (uint8_t *)smb_base(inbuf) + SVAL(vwv+6, 0);
+       state->buf = discard_const_p(uint8_t, smb_base(inbuf)) + SVAL(vwv+6, 0);
 
        if (trans_oob(smb_len(inbuf), SVAL(vwv+6, 0), state->received)
            || ((state->received != 0) && (state->buf < bytes))) {
@@ -663,9 +665,6 @@ NTSTATUS cli_pull(struct cli_state *cli, uint16_t fnum,
        status = cli_pull_recv(req, received);
  fail:
        TALLOC_FREE(frame);
-       if (!NT_STATUS_IS_OK(status)) {
-               cli_set_error(cli, status);
-       }
        return status;
 }
 
@@ -686,170 +685,11 @@ ssize_t cli_read(struct cli_state *cli, uint16_t fnum, char *buf,
        status = cli_pull(cli, fnum, offset, size, size,
                          cli_read_sink, &buf, &ret);
        if (!NT_STATUS_IS_OK(status)) {
-               cli_set_error(cli, status);
                return -1;
        }
        return ret;
 }
 
-/****************************************************************************
- Issue a single SMBwrite and don't wait for a reply.
-****************************************************************************/
-
-static bool cli_issue_write(struct cli_state *cli,
-                               uint16_t fnum,
-                               off_t offset,
-                               uint16 mode,
-                               const char *buf,
-                               size_t size)
-{
-       char *p;
-       bool large_writex = false;
-       /* We can only do direct writes if not signing and not encrypting. */
-       bool direct_writes = !client_is_signing_on(cli) && !cli_encryption_on(cli);
-
-       if (!direct_writes && size + 1 > cli->bufsize) {
-               cli->outbuf = (char *)SMB_REALLOC(cli->outbuf, size + 1024);
-               if (!cli->outbuf) {
-                       return False;
-               }
-               cli->inbuf = (char *)SMB_REALLOC(cli->inbuf, size + 1024);
-               if (cli->inbuf == NULL) {
-                       SAFE_FREE(cli->outbuf);
-                       return False;
-               }
-               cli->bufsize = size + 1024;
-       }
-
-       memset(cli->outbuf,'\0',smb_size);
-       memset(cli->inbuf,'\0',smb_size);
-
-       if (cli->capabilities & CAP_LARGE_FILES) {
-               large_writex = True;
-       }
-
-       if (large_writex) {
-               cli_set_message(cli->outbuf,14,0,True);
-       } else {
-               cli_set_message(cli->outbuf,12,0,True);
-       }
-
-       SCVAL(cli->outbuf,smb_com,SMBwriteX);
-       SSVAL(cli->outbuf,smb_tid,cli->cnum);
-       cli_setup_packet(cli);
-
-       SCVAL(cli->outbuf,smb_vwv0,0xFF);
-       SSVAL(cli->outbuf,smb_vwv2,fnum);
-
-       SIVAL(cli->outbuf,smb_vwv3,offset);
-       SIVAL(cli->outbuf,smb_vwv5,0);
-       SSVAL(cli->outbuf,smb_vwv7,mode);
-
-       SSVAL(cli->outbuf,smb_vwv8,(mode & 0x0008) ? size : 0);
-       /*
-        * According to CIFS-TR-1p00, this following field should only
-        * be set if CAP_LARGE_WRITEX is set. We should check this
-        * locally. However, this check might already have been
-        * done by our callers.
-        */
-       SSVAL(cli->outbuf,smb_vwv9,(size>>16));
-       SSVAL(cli->outbuf,smb_vwv10,size);
-       /* +1 is pad byte. */
-       SSVAL(cli->outbuf,smb_vwv11,
-             smb_buf(cli->outbuf) - smb_base(cli->outbuf) + 1);
-
-       if (large_writex) {
-               SIVAL(cli->outbuf,smb_vwv12,(((uint64_t)offset)>>32) & 0xffffffff);
-       }
-
-       p = smb_base(cli->outbuf) + SVAL(cli->outbuf,smb_vwv11) -1;
-       *p++ = '\0'; /* pad byte. */
-       if (!direct_writes) {
-               memcpy(p, buf, size);
-       }
-       if (size > 0x1FFFF) {
-               /* This is a POSIX 14 word large write. */
-               set_message_bcc(cli->outbuf, 0); /* Set bcc to zero. */
-               _smb_setlen_large(cli->outbuf,smb_size + 28 + 1 /* pad */ + size - 4);
-       } else {
-               cli_setup_bcc(cli, p+size);
-       }
-
-       show_msg(cli->outbuf);
-       if (direct_writes) {
-               /* For direct writes we now need to write the data
-                * directly out of buf. */
-               return cli_send_smb_direct_writeX(cli, buf, size);
-       } else {
-               return cli_send_smb(cli);
-       }
-}
-
-/****************************************************************************
-  write to a file
-  write_mode: 0x0001 disallow write cacheing
-              0x0002 return bytes remaining
-              0x0004 use raw named pipe protocol
-              0x0008 start of message mode named pipe protocol
-****************************************************************************/
-
-ssize_t cli_write(struct cli_state *cli,
-                uint16_t fnum, uint16 write_mode,
-                const char *buf, off_t offset, size_t size)
-{
-       ssize_t bwritten = 0;
-       unsigned int issued = 0;
-       unsigned int received = 0;
-       int mpx = 1;
-       size_t writesize;
-       int blocks;
-
-       if(cli->max_mux > 1) {
-               mpx = cli->max_mux-1;
-       } else {
-               mpx = 1;
-       }
-
-       writesize = cli_write_max_bufsize(cli, write_mode);
-
-       blocks = (size + (writesize-1)) / writesize;
-
-       while (received < blocks) {
-
-               while ((issued - received < mpx) && (issued < blocks)) {
-                       ssize_t bsent = issued * writesize;
-                       ssize_t size1 = MIN(writesize, size - bsent);
-
-                       if (!cli_issue_write(cli, fnum, offset + bsent,
-                                       write_mode,
-                                       buf + bsent,
-                                       size1))
-                               return -1;
-                       issued++;
-               }
-
-               if (!cli_receive_smb(cli)) {
-                       return bwritten;
-               }
-
-               received++;
-
-               if (cli_is_error(cli))
-                       break;
-
-               bwritten += SVAL(cli->inbuf, smb_vwv2);
-               if (writesize > 0xFFFF) {
-                       bwritten += (((int)(SVAL(cli->inbuf, smb_vwv4)))<<16);
-               }
-       }
-
-       while (received < issued && cli_receive_smb(cli)) {
-               received++;
-       }
-
-       return bwritten;
-}
-
 /****************************************************************************
   write to a file using a SMBwrite and not bypassing 0 byte writes
 ****************************************************************************/
@@ -882,7 +722,7 @@ NTSTATUS cli_smbwrite(struct cli_state *cli, uint16_t fnum, char *buf,
                SIVAL(vwv+2, 0, offset);
                SSVAL(vwv+4, 0, 0);
 
-               bytes = TALLOC_REALLOC_ARRAY(talloc_tos(), bytes, uint8_t,
+               bytes = talloc_realloc(talloc_tos(), bytes, uint8_t,
                                             size+3);
                if (bytes == NULL) {
                        return NT_STATUS_NO_MEMORY;
@@ -981,7 +821,7 @@ struct tevent_req *cli_write_andx_create(TALLOC_CTX *mem_ctx,
        state->pad = 0;
        state->iov[0].iov_base = (void *)&state->pad;
        state->iov[0].iov_len = 1;
-       state->iov[1].iov_base = CONST_DISCARD(void *, buf);
+       state->iov[1].iov_base = discard_const_p(void, buf);
        state->iov[1].iov_len = size;
 
        subreq = cli_smb_req_create(state, ev, cli, SMBwriteX, 0, wct, vwv,
@@ -1185,9 +1025,6 @@ NTSTATUS cli_writeall(struct cli_state *cli, uint16_t fnum, uint16_t mode,
        status = cli_writeall_recv(req, pwritten);
  fail:
        TALLOC_FREE(frame);
-       if (!NT_STATUS_IS_OK(status)) {
-               cli_set_error(cli, status);
-       }
        return status;
 }
 
@@ -1417,8 +1254,5 @@ NTSTATUS cli_push(struct cli_state *cli, uint16_t fnum, uint16_t mode,
        status = cli_push_recv(req);
  fail:
        TALLOC_FREE(frame);
-       if (!NT_STATUS_IS_OK(status)) {
-               cli_set_error(cli, status);
-       }
        return status;
 }