r20901: - not all compiler like uint8_t data[0] elements!
authorStefan Metzmacher <metze@samba.org>
Fri, 19 Jan 2007 12:22:30 +0000 (12:22 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:43:49 +0000 (14:43 -0500)
- this fix looks really ugly but I don't know a better solution...

if we would use uint8_t *data; then we would send the pointer value
also in the network packet and we would need to initialize

s->data = ((void *)(&s->data) + 1;

to make the memcpy statements work as they're currently,
so we use uint8_t data[1] in the struct definition ...

tridge: please review careful!

hopefully fix the build on solaris and HPUX

metze

source/cluster/ctdb/common/ctdb_call.c
source/cluster/ctdb/include/ctdb_private.h

index 2c11354ed516fde73631102ba833c831df5c0846..24924de902ca8bc1326a77dbdfac95c46a8e3074 100644 (file)
@@ -135,9 +135,9 @@ static void ctdb_send_error(struct ctdb_context *ctdb,
        va_end(ap);
 
        len = strlen(msg)+1;
-       r = ctdb->methods->allocate_pkt(ctdb, sizeof(*r) + len);
+       r = ctdb->methods->allocate_pkt(ctdb, sizeof(*r) - 1 + len);
        CTDB_NO_MEMORY_FATAL(ctdb, r);
-       r->hdr.length = sizeof(*r) + len;
+       r->hdr.length = sizeof(*r) - 1 + len;
        r->hdr.operation = CTDB_REPLY_ERROR;
        r->hdr.destnode  = hdr->srcnode;
        r->hdr.srcnode   = ctdb->vnn;
@@ -192,7 +192,7 @@ static void ctdb_call_send_dmaster(struct ctdb_context *ctdb,
        struct ctdb_req_dmaster *r;
        int len;
        
-       len = sizeof(*r) + key->dsize + data->dsize;
+       len = sizeof(*r) - 1 + key->dsize + data->dsize;
        r = ctdb->methods->allocate_pkt(ctdb, len);
        CTDB_NO_MEMORY_FATAL(ctdb, r);
        r->hdr.length    = len;
@@ -281,9 +281,9 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
        }
 
        /* send the CTDB_REPLY_DMASTER */
-       r = ctdb->methods->allocate_pkt(ctdb, sizeof(*r) + data.dsize);
+       r = ctdb->methods->allocate_pkt(ctdb, sizeof(*r) - 1 + data.dsize);
        CTDB_NO_MEMORY_FATAL(ctdb, r);
-       r->hdr.length = sizeof(*r) + data.dsize;
+       r->hdr.length = sizeof(*r) - 1 + data.dsize;
        r->hdr.operation = CTDB_REPLY_DMASTER;
        r->hdr.destnode  = c->dmaster;
        r->hdr.srcnode   = ctdb->vnn;
@@ -358,9 +358,9 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
                        call_data.dsize?&call_data:NULL,
                        &reply_data, c->hdr.srcnode);
 
-       r = ctdb->methods->allocate_pkt(ctdb, sizeof(*r) + reply_data.dsize);
+       r = ctdb->methods->allocate_pkt(ctdb, sizeof(*r) - 1 + reply_data.dsize);
        CTDB_NO_MEMORY_FATAL(ctdb, r);
-       r->hdr.length = sizeof(*r) + reply_data.dsize;
+       r->hdr.length = sizeof(*r) - 1 + reply_data.dsize;
        r->hdr.operation = CTDB_REPLY_CALL;
        r->hdr.destnode  = hdr->srcnode;
        r->hdr.srcnode   = hdr->destnode;
@@ -580,7 +580,7 @@ struct ctdb_call_state *ctdb_call_send(struct ctdb_context *ctdb,
        state = talloc_zero(ctdb, struct ctdb_call_state);
        CTDB_NO_MEMORY_NULL(ctdb, state);
 
-       len = sizeof(*state->c) + key.dsize + (call_data?call_data->dsize:0);
+       len = sizeof(*state->c) - 1 + key.dsize + (call_data?call_data->dsize:0);
        state->c = ctdb->methods->allocate_pkt(ctdb, len);
        CTDB_NO_MEMORY_NULL(ctdb, state->c);
 
index 68e82fd6053da9bc37eaaf6a9e5a468078d99e3e..bace97afe7befe7145332aa5a4a67496e0f3dae7 100644 (file)
@@ -157,20 +157,20 @@ struct ctdb_req_call {
        uint32_t callid;
        uint32_t keylen;
        uint32_t calldatalen;
-       uint8_t data[0]; /* key[] followed by calldata[] */
+       uint8_t data[1]; /* key[] followed by calldata[] */
 };
 
 struct ctdb_reply_call {
        struct ctdb_req_header hdr;
        uint32_t datalen;
-       uint8_t  data[0];
+       uint8_t  data[1];
 };
 
 struct ctdb_reply_error {
        struct ctdb_req_header hdr;
        uint32_t status;
        uint32_t msglen;
-       uint8_t  msg[0];
+       uint8_t  msg[1];
 };
 
 struct ctdb_reply_redirect {
@@ -183,13 +183,13 @@ struct ctdb_req_dmaster {
        uint32_t dmaster;
        uint32_t keylen;
        uint32_t datalen;
-       uint8_t  data[0];
+       uint8_t  data[1];
 };
 
 struct ctdb_reply_dmaster {
        struct ctdb_req_header hdr;
        uint32_t datalen;
-       uint8_t  data[0];
+       uint8_t  data[1];
 };
 
 /* internal prototypes */