[SCM] Samba Shared Repository - branch master updated

Martin Schwenke martins at samba.org
Tue May 3 06:09:04 UTC 2016


The branch, master has been updated
       via  a7cfb92 docs: Fix an outdated remark, tdbsam is default
       via  10dbedd ctdb-protocol: Return required buffer size in push functions
       via  f288ce8 ctdb-client: Drop unnecessary discard_const
       via  1fcedeb ctdb-protocol: Use consistent names for function arguments
       via  bf9b0b9 ctdb-protocol: Drop buffer allocation from protocol push functions
       via  0885872 ctdb-tests: Make sure the packet length matches the allocated size
       via  2717427 ctdb-protocol: Check arguments in ctdb_allocate_pkt
       via  0eca31b ctdb-protocol: Expose function to allocate a packet
       via  e834e0a ctdb-protocol: Fix marshalling of ctdb_reply_control
       via  75363b9 ctdb-protocol: Use length routines for protocol elements
       via  8a20c11 ctdb-protocol: Add length routines for protocol elements
       via  6ec25c7 ctdb-protocol: Use ctdb_req_header marshalling
       via  79d1507 ctdb-protocol: Fix marshalling of ctdb_req_header
       via  2e14d4e ctdb-protocol: Use TDB_DATA marshalling
       via  c64435f ctdb-protocol: Fix marshalling of TDB_DATA
       via  324ae75 ctdb-protocol: Use ctdb_string marshalling
       via  fcb2ab7 ctdb-protocol: Fix marshalling of ctdb_string
       via  ddfbd74 ctdb-doc: Fix example NFS Ganesha recovery directory maintenance logic
      from  685e813 Add build option for default smbpasswd location

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a7cfb9232ca219957672c8e359af0a9c700f8edc
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 2 10:58:12 2016 +0200

    docs: Fix an outdated remark, tdbsam is default
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    
    Autobuild-User(master): Martin Schwenke <martins at samba.org>
    Autobuild-Date(master): Tue May  3 08:08:31 CEST 2016 on sn-devel-144

commit 10dbeddab5237b401c1eb42a50a27dde19a580c9
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Sun May 1 22:13:35 2016 +1000

    ctdb-protocol: Return required buffer size in push functions
    
    If the buffer size provided is not sufficient, then return the required
    buffer length.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit f288ce84281c62cd8e0026caf3dd9c89acc2a2ef
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 22 01:27:50 2016 +1000

    ctdb-client: Drop unnecessary discard_const
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 1fcedeb99bd1d2340dbecdf6f8d7e7efc4601736
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 22 01:25:06 2016 +1000

    ctdb-protocol: Use consistent names for function arguments
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit bf9b0b992a4e4e6307899c3f1cf05f393d3a8e16
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 22 01:08:11 2016 +1000

    ctdb-protocol: Drop buffer allocation from protocol push functions
    
    This means that the packet allocation will happen just before push
    functions are called.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 088587259e2cbfd6878b0680f24db00090e606b5
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Mon May 2 12:16:04 2016 +1000

    ctdb-tests: Make sure the packet length matches the allocated size
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 2717427e69861a0f8d3c08458ea0e1bf182b2028
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Apr 28 18:27:11 2016 +1000

    ctdb-protocol: Check arguments in ctdb_allocate_pkt
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 0eca31baf79d509528e126b3ff268163e6414136
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Apr 28 18:12:36 2016 +1000

    ctdb-protocol: Expose function to allocate a packet
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit e834e0a2c0aa1c7861a0f19704951d3ccdd3489a
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 29 15:57:44 2016 +1000

    ctdb-protocol: Fix marshalling of ctdb_reply_control
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 75363b9954371867a2e295e686276b2f3680a7f0
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 29 15:35:12 2016 +1000

    ctdb-protocol: Use length routines for protocol elements
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 8a20c116fdf835936f99858f170ed72b637ec05d
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 22 00:45:01 2016 +1000

    ctdb-protocol: Add length routines for protocol elements
    
    This follows the convention used for marshalling routines for ctdb data types.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 6ec25c7529bdb59469c9103f49381915c75bd510
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 22 00:19:49 2016 +1000

    ctdb-protocol: Use ctdb_req_header marshalling
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 79d1507c16b872e18987cbf9d3a4ed8994d282db
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Apr 22 00:12:16 2016 +1000

    ctdb-protocol: Fix marshalling of ctdb_req_header
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 2e14d4e4e3fb627d2ad276b3c9a812382ad0b44b
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Apr 21 23:50:01 2016 +1000

    ctdb-protocol: Use TDB_DATA marshalling
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit c64435f22e977cd5e3406d018e069e5c7d9b709e
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Apr 21 23:56:13 2016 +1000

    ctdb-protocol: Fix marshalling of TDB_DATA
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit 324ae757c37c45974e5188080ad9d03798aad043
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Apr 21 23:49:33 2016 +1000

    ctdb-protocol: Use ctdb_string marshalling
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit fcb2ab7641f69413738714fff096b20488b63d03
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Thu Apr 21 23:48:52 2016 +1000

    ctdb-protocol: Fix marshalling of ctdb_string
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit ddfbd7460733f6b1243a3796237932629dedc6c6
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Apr 28 12:02:47 2016 +1000

    ctdb-doc: Fix example NFS Ganesha recovery directory maintenance logic
    
    This currently fails exactly when it is needed: when there is a
    dangling link pointing into an unmounted filesystem.  This happens
    because [ -e <dangling-link> ] returns false.  The solution is simply
    to remove that check.
    
    Now the first condition in the "if" statement catches the backward
    compatibility case where $GANRECDIR used to be a directory.  It will
    also catch other problems, such as if a file has been created in this
    location.  If nothing exists then it will silently succeed (due to
    -f).
    
    The second case catches a symlink pointing to the wrong place (e.g. in
    an unmounted filesystem).
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

-----------------------------------------------------------------------

Summary of changes:
 ctdb/client/client_call.c             |  11 +-
 ctdb/client/client_connect.c          |   2 +-
 ctdb/client/client_control.c          |  11 +-
 ctdb/client/client_message.c          |  11 +-
 ctdb/doc/examples/nfs-ganesha-callout |  16 +-
 ctdb/protocol/protocol_api.h          |  85 +++++---
 ctdb/protocol/protocol_call.c         | 389 ++++++++++++++++------------------
 ctdb/protocol/protocol_control.c      | 158 +++++++-------
 ctdb/protocol/protocol_header.c       |  16 +-
 ctdb/protocol/protocol_message.c      | 129 ++++++-----
 ctdb/protocol/protocol_packet.c       |  10 +-
 ctdb/protocol/protocol_private.h      |   3 -
 ctdb/protocol/protocol_types.c        |   5 +-
 ctdb/tests/src/protocol_client_test.c | 131 +++++++++---
 ctdb/web/samba.html                   |   2 +-
 15 files changed, 545 insertions(+), 434 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/client/client_call.c b/ctdb/client/client_call.c
index aa8a05b..088ba67 100644
--- a/ctdb/client/client_call.c
+++ b/ctdb/client/client_call.c
@@ -63,7 +63,7 @@ struct tevent_req *ctdb_client_call_send(TALLOC_CTX *mem_ctx,
 	struct ctdb_client_call_state *state;
 	uint32_t reqid;
 	uint8_t *buf;
-	size_t buflen;
+	size_t datalen, buflen;
 	int ret;
 
 	req = tevent_req_create(mem_ctx, &state,
@@ -91,7 +91,14 @@ struct tevent_req *ctdb_client_call_send(TALLOC_CTX *mem_ctx,
 	ctdb_req_header_fill(&h, 0, CTDB_REQ_CALL, CTDB_CURRENT_NODE,
 			     client->pnn, reqid);
 
-	ret = ctdb_req_call_push(&h, request, state, &buf, &buflen);
+	datalen = ctdb_req_call_len(&h, request);
+	ret = ctdb_allocate_pkt(state, datalen, &buf, &buflen);
+	if (ret != 0) {
+		tevent_req_error(req, ret);
+		return tevent_req_post(req, ev);
+	}
+
+	ret = ctdb_req_call_push(&h, request, buf, &buflen);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
 		return tevent_req_post(req, ev);
diff --git a/ctdb/client/client_connect.c b/ctdb/client/client_connect.c
index f2fe673..3cfcd16 100644
--- a/ctdb/client/client_connect.c
+++ b/ctdb/client/client_connect.c
@@ -166,7 +166,7 @@ static void client_read_handler(uint8_t *buf, size_t buflen,
 	struct ctdb_req_header hdr;
 	int ret;
 
-	ret = ctdb_req_header_pull(discard_const(buf), buflen, &hdr);
+	ret = ctdb_req_header_pull(buf, buflen, &hdr);
 	if (ret != 0) {
 		DEBUG(DEBUG_WARNING, ("invalid header, ret=%d\n", ret));
 		return;
diff --git a/ctdb/client/client_control.c b/ctdb/client/client_control.c
index 5c47c9a..1755ecc 100644
--- a/ctdb/client/client_control.c
+++ b/ctdb/client/client_control.c
@@ -67,7 +67,7 @@ struct tevent_req *ctdb_client_control_send(TALLOC_CTX *mem_ctx,
 	struct ctdb_client_control_state *state;
 	uint32_t reqid;
 	uint8_t *buf;
-	size_t buflen;
+	size_t datalen, buflen;
 	int ret;
 
 	req = tevent_req_create(mem_ctx, &state,
@@ -98,7 +98,14 @@ struct tevent_req *ctdb_client_control_send(TALLOC_CTX *mem_ctx,
 	ctdb_req_header_fill(&h, 0, CTDB_REQ_CONTROL, destnode,
 			     client->pnn, reqid);
 
-	ret = ctdb_req_control_push(&h, request, state, &buf, &buflen);
+	datalen = ctdb_req_control_len(&h, request);
+	ret = ctdb_allocate_pkt(state, datalen, &buf, &buflen);
+	if (ret != 0) {
+		tevent_req_error(req, ret);
+		return tevent_req_post(req, ev);
+	}
+
+	ret = ctdb_req_control_push(&h, request, buf, &buflen);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
 		return tevent_req_post(req, ev);
diff --git a/ctdb/client/client_message.c b/ctdb/client/client_message.c
index 4b378a5..03fcfc6 100644
--- a/ctdb/client/client_message.c
+++ b/ctdb/client/client_message.c
@@ -62,7 +62,7 @@ struct tevent_req *ctdb_client_message_send(TALLOC_CTX *mem_ctx,
 	struct ctdb_req_header h;
 	uint32_t reqid;
 	uint8_t *buf;
-	size_t buflen;
+	size_t datalen, buflen;
 	int ret;
 
 	req = tevent_req_create(mem_ctx, &state,
@@ -85,7 +85,14 @@ struct tevent_req *ctdb_client_message_send(TALLOC_CTX *mem_ctx,
 	ctdb_req_header_fill(&h, 0, CTDB_REQ_MESSAGE, destnode,
 			     client->pnn, reqid);
 
-	ret = ctdb_req_message_push(&h, message, state, &buf, &buflen);
+	datalen = ctdb_req_message_len(&h, message);
+	ret = ctdb_allocate_pkt(state, datalen, &buf, &buflen);
+	if (ret != 0) {
+		tevent_req_error(req, ret);
+		return tevent_req_post(req, ev);
+	}
+
+	ret = ctdb_req_message_push(&h, message, buf, &buflen);
 	if (ret != 0) {
 		tevent_req_error(req, ret);
 		return tevent_req_post(req, ev);
diff --git a/ctdb/doc/examples/nfs-ganesha-callout b/ctdb/doc/examples/nfs-ganesha-callout
index 3f0a016..a3d0471 100755
--- a/ctdb/doc/examples/nfs-ganesha-callout
+++ b/ctdb/doc/examples/nfs-ganesha-callout
@@ -145,15 +145,13 @@ create_ganesha_recdirs ()
     _mntpt=$(echo "$_mounts" | sort | awk 'NR == 1 {print $3}')
     _link_dst="${_mntpt}/${CTDB_GANESHA_REC_SUBDIR}"
     mkdir -vp "$_link_dst"
-    if [ -e "$GANRECDIR" ]; then
-        if [ ! -L "$GANRECDIR" ] ; then
-            rm -vrf "$GANRECDIR"
-	else
-	    _t=$(readlink "$GANRECDIR")
-	    if [ "$_t" != "$_link_dst" ] ; then
-		rm -v "$GANRECDIR"
-	    fi
-        fi
+    if [ ! -L "$GANRECDIR" ] ; then
+        rm -vrf "$GANRECDIR"
+    else
+	_t=$(readlink "$GANRECDIR")
+	if [ "$_t" != "$_link_dst" ] ; then
+	    rm -v "$GANRECDIR"
+	fi
     fi
     # This is not an "else".  It also re-creates the link if it was
     # removed above!
diff --git a/ctdb/protocol/protocol_api.h b/ctdb/protocol/protocol_api.h
index eb1baaf..0f781cc 100644
--- a/ctdb/protocol/protocol_api.h
+++ b/ctdb/protocol/protocol_api.h
@@ -76,81 +76,97 @@ void ctdb_req_header_fill(struct ctdb_req_header *h, uint32_t generation,
 			  uint32_t operation, uint32_t destnode,
 			  uint32_t srcnode, uint32_t reqid);
 
-int ctdb_req_header_pull(uint8_t *pkt, size_t pkt_len,
+size_t ctdb_req_header_len(struct ctdb_req_header *h);
+void ctdb_req_header_push(struct ctdb_req_header *h, uint8_t *buf);
+int ctdb_req_header_pull(uint8_t *buf, size_t buflen,
 			 struct ctdb_req_header *h);
 
 int ctdb_req_header_verify(struct ctdb_req_header *h, uint32_t operation);
 
 /* From protocol/protocol_call.c */
 
+size_t ctdb_req_call_len(struct ctdb_req_header *h,
+			 struct ctdb_req_call *c);
+
 int ctdb_req_call_push(struct ctdb_req_header *h,
 		       struct ctdb_req_call *c,
-		       TALLOC_CTX *mem_ctx,
-		       uint8_t **pkt, size_t *pkt_len);
+		       uint8_t *buf, size_t *buflen);
 
-int ctdb_req_call_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_req_call_pull(uint8_t *buf, size_t buflen,
 		       struct ctdb_req_header *h,
 		       TALLOC_CTX *mem_ctx,
 		       struct ctdb_req_call *c);
 
+size_t ctdb_reply_call_len(struct ctdb_req_header *h,
+			   struct ctdb_reply_call *c);
+
 int ctdb_reply_call_push(struct ctdb_req_header *h,
 			 struct ctdb_reply_call *c,
-			 TALLOC_CTX *mem_ctx,
-			 uint8_t **pkt, size_t *pkt_len);
+			 uint8_t *buf, size_t *buflen);
 
-int ctdb_reply_call_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_reply_call_pull(uint8_t *buf, size_t buflen,
 			 struct ctdb_req_header *h,
 			 TALLOC_CTX *mem_ctx,
 			 struct ctdb_reply_call *c);
 
+size_t ctdb_reply_error_len(struct ctdb_req_header *h,
+			    struct ctdb_reply_error *c);
+
 int ctdb_reply_error_push(struct ctdb_req_header *h,
 			  struct ctdb_reply_error *c,
-			  TALLOC_CTX *mem_ctx,
-			  uint8_t **pkt, size_t *pkt_len);
+			  uint8_t *buf, size_t *buflen);
 
-int ctdb_reply_error_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_reply_error_pull(uint8_t *buf, size_t buflen,
 			  struct ctdb_req_header *h,
 			  TALLOC_CTX *mem_ctx,
 			  struct ctdb_reply_error *c);
 
+size_t ctdb_req_dmaster_len(struct ctdb_req_header *h,
+			    struct ctdb_req_dmaster *c);
+
 int ctdb_req_dmaster_push(struct ctdb_req_header *h,
 			  struct ctdb_req_dmaster *c,
-			  TALLOC_CTX *mem_ctx,
-			  uint8_t **pkt, size_t *pkt_len);
+			  uint8_t *buf, size_t *buflen);
 
-int ctdb_req_dmaster_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_req_dmaster_pull(uint8_t *buf, size_t buflen,
 			  struct ctdb_req_header *h,
 			  TALLOC_CTX *mem_ctx,
 			  struct ctdb_req_dmaster *c);
 
+size_t ctdb_reply_dmaster_len(struct ctdb_req_header *h,
+			      struct ctdb_reply_dmaster *c);
+
 int ctdb_reply_dmaster_push(struct ctdb_req_header *h,
 			    struct ctdb_reply_dmaster *c,
-			    TALLOC_CTX *mem_ctx,
-			    uint8_t **pkt, size_t *pkt_len);
+			    uint8_t *buf, size_t *buflen);
 
-int ctdb_reply_dmaster_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_reply_dmaster_pull(uint8_t *buf, size_t buflen,
 			    struct ctdb_req_header *h,
 			    TALLOC_CTX *mem_ctx,
 			    struct ctdb_reply_dmaster *c);
 
 /* From protocol/protocol_control.c */
 
+size_t ctdb_req_control_len(struct ctdb_req_header *h,
+			    struct ctdb_req_control *c);
+
 int ctdb_req_control_push(struct ctdb_req_header *h,
 			  struct ctdb_req_control *c,
-			  TALLOC_CTX *mem_ctx,
-			  uint8_t **pkt, size_t *pkt_len);
+			  uint8_t *buf, size_t *buflen);
 
-int ctdb_req_control_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
 			  struct ctdb_req_header *h,
 			  TALLOC_CTX *mem_ctx,
 			  struct ctdb_req_control *c);
 
+size_t ctdb_reply_control_len(struct ctdb_req_header *h,
+			      struct ctdb_reply_control *c);
+
 int ctdb_reply_control_push(struct ctdb_req_header *h,
 			    struct ctdb_reply_control *c,
-			    TALLOC_CTX *mem_ctx,
-			    uint8_t **pkt, size_t *pkt_len);
+			    uint8_t *buf, size_t *buflen);
 
-int ctdb_reply_control_pull(uint8_t *pkt, size_t pkt_len, uint32_t opcode,
+int ctdb_reply_control_pull(uint8_t *buf, size_t buflen, uint32_t opcode,
 			    struct ctdb_req_header *h,
 			    TALLOC_CTX *mem_ctx,
 			    struct ctdb_reply_control *c);
@@ -633,25 +649,34 @@ void ctdb_packet_print(uint8_t *buf, size_t buflen, FILE *fp);
 
 /* From protocol/protocol_message.c */
 
+size_t ctdb_req_message_len(struct ctdb_req_header *h,
+			    struct ctdb_req_message *c);
+
 int ctdb_req_message_push(struct ctdb_req_header *h,
 			  struct ctdb_req_message *c,
-			  TALLOC_CTX *mem_ctx,
-			  uint8_t **pkt, size_t *pkt_len);
+			  uint8_t *buf, size_t *buflen);
 
-int ctdb_req_message_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_req_message_pull(uint8_t *buf, size_t buflen,
 			  struct ctdb_req_header *h,
 			  TALLOC_CTX *mem_ctx,
 			  struct ctdb_req_message *c);
 
+size_t ctdb_req_message_data_len(struct ctdb_req_header *h,
+				 struct ctdb_req_message_data *c);
+
 int ctdb_req_message_data_push(struct ctdb_req_header *h,
-			       struct ctdb_req_message_data *message,
-			       TALLOC_CTX *mem_ctx,
-			       uint8_t **pkt, size_t *pkt_len);
+			       struct ctdb_req_message_data *c,
+			       uint8_t *buf, size_t *buflen);
 
-int ctdb_req_message_data_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_req_message_data_pull(uint8_t *buf, size_t buflen,
 			       struct ctdb_req_header *h,
 			       TALLOC_CTX *mem_ctx,
-			       struct ctdb_req_message_data *message);
+			       struct ctdb_req_message_data *c);
+
+/* From protocol/protocol_packet.c */
+
+int ctdb_allocate_pkt(TALLOC_CTX *mem_ctx, size_t datalen,
+		      uint8_t **buf, size_t *buflen);
 
 /* From protocol/protocol_util.c */
 
diff --git a/ctdb/protocol/protocol_call.c b/ctdb/protocol/protocol_call.c
index 660be0c..a2b24cf 100644
--- a/ctdb/protocol/protocol_call.c
+++ b/ctdb/protocol/protocol_call.c
@@ -71,385 +71,366 @@ struct ctdb_reply_dmaster_wire {
 	uint8_t  data[1];
 };
 
+size_t ctdb_req_call_len(struct ctdb_req_header *h, struct ctdb_req_call *c)
+{
+	return offsetof(struct ctdb_req_call_wire, data) +
+		ctdb_tdb_data_len(c->key) + ctdb_tdb_data_len(c->calldata);
+}
+
 int ctdb_req_call_push(struct ctdb_req_header *h, struct ctdb_req_call *c,
-		       TALLOC_CTX *mem_ctx, uint8_t **pkt, size_t *pkt_len)
+		       uint8_t *buf, size_t *buflen)
 {
-	struct ctdb_req_call_wire *wire;
-	uint8_t *buf;
-	size_t length, buflen;
-	int ret;
+	struct ctdb_req_call_wire *wire =
+		(struct ctdb_req_call_wire *)buf;
+	size_t length;
 
 	if (c->key.dsize == 0) {
 		return EINVAL;
 	}
 
-	length = offsetof(struct ctdb_req_call_wire, data) +
-		 c->key.dsize + c->calldata.dsize;
-
-	ret = allocate_pkt(mem_ctx, length, &buf, &buflen);
-	if (ret != 0) {
-		return ret;
+	length = ctdb_req_call_len(h, c);
+	if (*buflen < length) {
+		*buflen = length;
+		return EMSGSIZE;
 	}
 
-	wire = (struct ctdb_req_call_wire *)buf;
-
-	h->length = buflen;
-	memcpy(&wire->hdr, h, sizeof(struct ctdb_req_header));
+	h->length = *buflen;
+	ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
 
 	wire->flags = c->flags;
 	wire->db_id = c->db_id;
 	wire->callid = c->callid;
 	wire->hopcount = c->hopcount;
-	wire->keylen = c->key.dsize;
-	wire->calldatalen = c->calldata.dsize;
-	memcpy(wire->data, c->key.dptr, c->key.dsize);
-	if (c->calldata.dsize > 0) {
-		memcpy(wire->data + c->key.dsize, c->calldata.dptr,
-		       c->calldata.dsize);
-	}
+	wire->keylen = ctdb_tdb_data_len(c->key);
+	wire->calldatalen = ctdb_tdb_data_len(c->calldata);
+	ctdb_tdb_data_push(c->key, wire->data);
+	ctdb_tdb_data_push(c->calldata, wire->data + wire->keylen);
 
-	*pkt = buf;
-	*pkt_len = buflen;
 	return 0;
 }
 
-int ctdb_req_call_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_req_call_pull(uint8_t *buf, size_t buflen,
 		       struct ctdb_req_header *h,
 		       TALLOC_CTX *mem_ctx,
 		       struct ctdb_req_call *c)
 {
-	struct ctdb_req_call_wire *wire;
+	struct ctdb_req_call_wire *wire =
+		(struct ctdb_req_call_wire *)buf;
 	size_t length;
+	int ret;
 
 	length = offsetof(struct ctdb_req_call_wire, data);
-	if (pkt_len < length) {
+	if (buflen < length) {
 		return EMSGSIZE;
 	}
-
-	wire = (struct ctdb_req_call_wire *)pkt;
-
-	if (pkt_len < length + wire->keylen + wire->calldatalen) {
+	if (buflen < length + wire->keylen + wire->calldatalen) {
 		return EMSGSIZE;
 	}
 
 	if (h != NULL) {
-		memcpy(h, &wire->hdr, sizeof(struct ctdb_req_header));
+		ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h);
+		if (ret != 0) {
+			return ret;
+		}
 	}
 
 	c->flags = wire->flags;
 	c->db_id = wire->db_id;
 	c->callid = wire->callid;
 	c->hopcount = wire->hopcount;
-	c->key.dsize = wire->keylen;
-	c->key.dptr = talloc_memdup(mem_ctx, wire->data, wire->keylen);
-	if (c->key.dptr == NULL) {
-		return ENOMEM;
+
+	ret = ctdb_tdb_data_pull(wire->data, wire->keylen, mem_ctx, &c->key);
+	if (ret != 0) {
+		return ret;
 	}
-	c->calldata.dsize = wire->calldatalen;
-	if (wire->calldatalen > 0) {
-		c->calldata.dptr = talloc_memdup(mem_ctx,
-						 wire->data + wire->keylen,
-						 wire->calldatalen);
-		if (c->calldata.dptr == NULL) {
-			talloc_free(c->key.dptr);
-			return ENOMEM;
-		}
+
+	ret = ctdb_tdb_data_pull(wire->data + wire->keylen, wire->calldatalen,
+				 mem_ctx, &c->calldata);
+	if (ret != 0) {
+		return ret;
 	}
 
 	return 0;
 }
 
-int ctdb_reply_call_push(struct ctdb_req_header *h, struct ctdb_reply_call *c,
-			 TALLOC_CTX *mem_ctx, uint8_t **pkt, size_t *pkt_len)
+size_t ctdb_reply_call_len(struct ctdb_req_header *h,
+			   struct ctdb_reply_call *c)
 {
-	struct ctdb_reply_call_wire *wire;
-	uint8_t *buf;
-	size_t length, buflen;
-	int ret;
+	return offsetof(struct ctdb_reply_call_wire, data) +
+		ctdb_tdb_data_len(c->data);
+}
 
-	length = offsetof(struct ctdb_reply_call_wire, data) + c->data.dsize;
+int ctdb_reply_call_push(struct ctdb_req_header *h, struct ctdb_reply_call *c,
+			 uint8_t *buf, size_t *buflen)
+{
+	struct ctdb_reply_call_wire *wire =
+		(struct ctdb_reply_call_wire *)buf;
+	size_t length;
 
-	ret = allocate_pkt(mem_ctx, length, &buf, &buflen);
-	if (ret != 0) {
-		return ret;
+	length = ctdb_reply_call_len(h, c);
+	if (*buflen < length) {
+		*buflen = length;
+		return EMSGSIZE;
 	}
 
-	wire = (struct ctdb_reply_call_wire *)buf;
-
-	h->length = buflen;
-	memcpy(&wire->hdr, h, sizeof(struct ctdb_req_header));
+	h->length = *buflen;
+	ctdb_req_header_push(h, (uint8_t *)&wire->hdr);
 
 	wire->status = c->status;
-	wire->datalen = c->data.dsize;
-	if (c->data.dsize > 0) {
-		memcpy(wire->data, c->data.dptr, c->data.dsize);
-	}
+	wire->datalen = ctdb_tdb_data_len(c->data);
+	ctdb_tdb_data_push(c->data, wire->data);
 
-	*pkt = buf;
-	*pkt_len = buflen;
 	return 0;
 }
 
-int ctdb_reply_call_pull(uint8_t *pkt, size_t pkt_len,
+int ctdb_reply_call_pull(uint8_t *buf, size_t buflen,
 			 struct ctdb_req_header *h,
 			 TALLOC_CTX *mem_ctx,
 			 struct ctdb_reply_call *c)
 {
-	struct ctdb_reply_call_wire *wire;
+	struct ctdb_reply_call_wire *wire =
+		(struct ctdb_reply_call_wire *)buf;
 	size_t length;
+	int ret;
 
 	length = offsetof(struct ctdb_reply_call_wire, data);
-	if (pkt_len < length) {
+	if (buflen < length) {
 		return EMSGSIZE;
 	}
-
-	wire = (struct ctdb_reply_call_wire *)pkt;
-
-	if (pkt_len < length + wire->datalen) {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list