int ctdbd_conn_get_fd(struct ctdbd_connection *conn);
-NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
- uint32_t dst_vnn, uint64_t dst_srvid,
- const uint8_t *buf, size_t buflen);
+NTSTATUS ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
+ uint32_t dst_vnn, uint64_t dst_srvid,
+ const struct iovec *iov, int iovlen);
bool ctdbd_process_exists(struct ctdbd_connection *conn, uint32_t vnn,
pid_t pid);
return NT_STATUS_NOT_IMPLEMENTED;
}
-NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
- uint32_t dst_vnn, uint64_t dst_srvid,
- const uint8_t *buf, size_t buflen)
+NTSTATUS ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
+ uint32_t dst_vnn, uint64_t dst_srvid,
+ const struct iovec *iov, int iovlen)
{
return NT_STATUS_NOT_IMPLEMENTED;
}
#include "ctdbd_conn.h"
#include "system/select.h"
#include "lib/sys_rw_data.h"
+#include "lib/util/iov_buf.h"
#include "messages.h"
return NT_STATUS_OK;
}
-NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
- uint32_t dst_vnn, uint64_t dst_srvid,
- const uint8_t *buf, size_t buflen)
+NTSTATUS ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
+ uint32_t dst_vnn, uint64_t dst_srvid,
+ const struct iovec *iov, int iovlen)
{
struct ctdb_req_message r;
- struct iovec iov[2];
+ struct iovec iov2[iovlen+1];
+ size_t buflen = iov_buflen(iov, iovlen);
ssize_t nwritten;
r.hdr.length = offsetof(struct ctdb_req_message, data) + buflen;
DEBUG(10, ("ctdbd_messaging_send: Sending ctdb packet\n"));
ctdb_packet_dump(&r.hdr);
- iov[0].iov_base = &r;
- iov[0].iov_len = offsetof(struct ctdb_req_message, data);
- iov[1].iov_base = discard_const_p(uint8_t, buf);
- iov[1].iov_len = buflen;
+ iov2[0].iov_base = &r;
+ iov2[0].iov_len = offsetof(struct ctdb_req_message, data);
+ memcpy(&iov2[1], iov, iovlen * sizeof(struct iovec));
- nwritten = write_data_iov(conn->fd, iov, ARRAY_SIZE(iov));
+ nwritten = write_data_iov(conn->fd, iov2, iovlen+1);
if (nwritten == -1) {
DEBUG(3, ("write_data_iov failed: %s\n", strerror(errno)));
cluster_fatal("cluster dispatch daemon msg write error\n");
uint8_t *buf;
ssize_t buflen;
DATA_BLOB blob;
+ struct iovec iov2;
NTSTATUS status;
enum ndr_err_code ndr_err;
return ndr_map_error2errno(ndr_err);
}
- status = ctdbd_messaging_send_blob(ctx->conn, pid.vnn, pid.pid,
- blob.data, blob.length);
+ iov2 = (struct iovec) { .iov_base = blob.data,
+ .iov_len = blob.length };
+
+ status = ctdbd_messaging_send_iov(ctx->conn, pid.vnn, pid.pid,
+ &iov2, 1);
TALLOC_FREE(buf);
if (NT_STATUS_IS_OK(status)) {
uint32_t last_vnn;
uint8_t *remote_blob = NULL;
size_t remote_blob_len = 0;
+ struct iovec iov;
char *path, *to_free;
char tmpbuf[PATH_MAX];
ssize_t len;
goto done;
}
+ iov = (struct iovec) { .iov_base = remote_blob,
+ .iov_len = remote_blob_len };
+
for (i=0; i<num_vnns; i++) {
uint32_t vnn = idx_state.vnns[i];
NTSTATUS status;
continue;
}
- status = ctdbd_messaging_send_blob(
+ status = ctdbd_messaging_send_iov(
ctdbd_conn, vnn, CTDB_SRVID_SAMBA_NOTIFY_PROXY,
- remote_blob, remote_blob_len);
+ &iov, 1);
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(10, ("ctdbd_messaging_send_blob to vnn %d "
+ DEBUG(10, ("ctdbd_messaging_send_iov to vnn %d "
"returned %s, ignoring\n", (int)vnn,
nt_errstr(status)));
}