summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2012-03-30 11:10:47 +0200
committerVolker Lendecke <vl@samba.org>2012-04-17 10:21:01 +0200
commit05ff425c1749452179d79b96721c8ac18d886fba (patch)
treeaeb0f3ef497400bb538ec2f32d4a93c920ac6417
parent74baae782f09fd8f22af133b820680e37049f5b0 (diff)
downloadsamba-05ff425c1749452179d79b96721c8ac18d886fba.tar.gz
samba-05ff425c1749452179d79b96721c8ac18d886fba.tar.bz2
samba-05ff425c1749452179d79b96721c8ac18d886fba.zip
s3: Introduce ctdb_messaging_send_blob
Send a raw blob without the messaging.idl wrap
-rw-r--r--source3/include/ctdbd_conn.h3
-rw-r--r--source3/lib/ctdbd_conn.c40
2 files changed, 23 insertions, 20 deletions
diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index 2035e8ddfc..b1a58cbe5b 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -40,6 +40,9 @@ int ctdbd_conn_get_fd(struct ctdbd_connection *conn);
NTSTATUS ctdbd_messaging_send(struct ctdbd_connection *conn,
uint32 dst_vnn, uint64 dst_srvid,
struct messaging_rec *msg);
+NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
+ uint32 dst_vnn, uint64 dst_srvid,
+ const uint8_t *buf, size_t buflen);
bool ctdbd_process_exists(struct ctdbd_connection *conn, uint32 vnn,
pid_t pid);
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 096616038e..de9920ae26 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -743,29 +743,34 @@ NTSTATUS ctdbd_messaging_send(struct ctdbd_connection *conn,
uint32 dst_vnn, uint64 dst_srvid,
struct messaging_rec *msg)
{
- struct ctdb_req_message r;
- TALLOC_CTX *mem_ctx;
DATA_BLOB blob;
NTSTATUS status;
enum ndr_err_code ndr_err;
- if (!(mem_ctx = talloc_init("ctdbd_messaging_send"))) {
- DEBUG(0, ("talloc failed\n"));
- return NT_STATUS_NO_MEMORY;
- }
-
ndr_err = ndr_push_struct_blob(
- &blob, mem_ctx, msg,
+ &blob, talloc_tos(), msg,
(ndr_push_flags_fn_t)ndr_push_messaging_rec);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
DEBUG(0, ("ndr_push_struct_blob failed: %s\n",
ndr_errstr(ndr_err)));
- status = ndr_map_error2ntstatus(ndr_err);
- goto fail;
+ return ndr_map_error2ntstatus(ndr_err);
}
- r.hdr.length = offsetof(struct ctdb_req_message, data) + blob.length;
+ status = ctdbd_messaging_send_blob(conn, dst_vnn, dst_srvid,
+ blob.data, blob.length);
+ TALLOC_FREE(blob.data);
+ return NT_STATUS_OK;
+}
+
+NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
+ uint32 dst_vnn, uint64 dst_srvid,
+ const uint8_t *buf, size_t buflen)
+{
+ struct ctdb_req_message r;
+ NTSTATUS status;
+
+ r.hdr.length = offsetof(struct ctdb_req_message, data) + buflen;
r.hdr.ctdb_magic = CTDB_MAGIC;
r.hdr.ctdb_version = CTDB_VERSION;
r.hdr.generation = 1;
@@ -774,7 +779,7 @@ NTSTATUS ctdbd_messaging_send(struct ctdbd_connection *conn,
r.hdr.srcnode = conn->our_vnn;
r.hdr.reqid = 0;
r.srvid = dst_srvid;
- r.datalen = blob.length;
+ r.datalen = buflen;
DEBUG(10, ("ctdbd_messaging_send: Sending ctdb packet\n"));
ctdb_packet_dump(&r.hdr);
@@ -782,24 +787,19 @@ NTSTATUS ctdbd_messaging_send(struct ctdbd_connection *conn,
status = ctdb_packet_send(
conn->pkt, 2,
data_blob_const(&r, offsetof(struct ctdb_req_message, data)),
- blob);
+ data_blob_const(buf, buflen));
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("ctdb_packet_send failed: %s\n", nt_errstr(status)));
- goto fail;
+ return status;
}
status = ctdb_packet_flush(conn->pkt);
-
if (!NT_STATUS_IS_OK(status)) {
DEBUG(3, ("write to ctdbd failed: %s\n", nt_errstr(status)));
cluster_fatal("cluster dispatch daemon msg write error\n");
}
-
- status = NT_STATUS_OK;
- fail:
- TALLOC_FREE(mem_ctx);
- return status;
+ return NT_STATUS_OK;
}
/*