ssize_t write_data(int fd, const char *buffer, size_t N) { struct iovec iov; iov.iov_base = discard_const_p(void, buffer); iov.iov_len = N; return write_data_iov(fd, &iov, 1); }
bool cli_send_smb_direct_writeX(struct cli_state *cli, const char *p, size_t extradata) { /* First length to send is the offset to the data. */ size_t len = SVAL(cli->outbuf,smb_vwv11) + 4; size_t nwritten=0; struct iovec iov[2]; /* fd == -1 causes segfaults -- Tom ([email protected]) */ if (cli->fd == -1) { return false; } if (client_is_signing_on(cli)) { DEBUG(0,("cli_send_smb_large: cannot send signed packet.\n")); return false; } iov[0].iov_base = (void *)cli->outbuf; iov[0].iov_len = len; iov[1].iov_base = CONST_DISCARD(void *, p); iov[1].iov_len = extradata; nwritten = write_data_iov(cli->fd, iov, 2); if (nwritten < (len + extradata)) { close(cli->fd); cli->fd = -1; cli->smb_rw_error = SMB_WRITE_ERROR; DEBUG(0,("Error writing %d bytes to client. (%s)\n", (int)(len+extradata), strerror(errno))); return false; } /* Increment the mid so we can tell between responses. */ cli->mid++; if (!cli->mid) cli->mid++; return true; }