From: Ronnie Sahlberg Date: Thu, 10 May 2007 19:40:11 +0000 (+1000) Subject: make ctdb_control catdb work again X-Git-Tag: tevent-0.9.20~348^2~2755^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=325713dfebf01759b711f22fed560857b441360c;p=thirdparty%2Fsamba.git make ctdb_control catdb work again (This used to be ctdb commit 40a8fb68c71be0b9f54ae88bf8aa39a4c71f3b5a) --- diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c index 9f2a1a24cd7..ff7528b1417 100644 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@ -1037,17 +1037,16 @@ int ctdb_ctrl_pulldb(struct ctdb_context *ctdb, uint32_t destnode, uint32_t dbid { int i, ret; TDB_DATA indata, outdata; + struct ctdb_control_pulldb pull; + struct ctdb_control_pulldb_reply *reply; + struct ctdb_rec_data *rec; int32_t res; - unsigned char *ptr; - DEBUG(0,("ronnie to fix!\n")); - return -1; + pull.db_id = dbid; + pull.lmaster = lmaster; - indata.dsize = 2*sizeof(uint32_t); - indata.dptr = (unsigned char *)talloc_array(mem_ctx, uint32_t, 2); - - ((uint32_t *)(&indata.dptr[0]))[0] = dbid; - ((uint32_t *)(&indata.dptr[0]))[1] = lmaster; + indata.dsize = sizeof(struct ctdb_control_pulldb); + indata.dptr = (unsigned char *)&pull; ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_PULL_DB, 0, indata, @@ -1058,45 +1057,34 @@ int ctdb_ctrl_pulldb(struct ctdb_context *ctdb, uint32_t destnode, uint32_t dbid } - keys->dbid = ((uint32_t *)(&outdata.dptr[0]))[0]; - keys->num = ((uint32_t *)(&outdata.dptr[0]))[1]; - keys->keys =talloc_array(mem_ctx, TDB_DATA, keys->num); - keys->headers=talloc_array(mem_ctx, struct ctdb_ltdb_header, keys->num); - keys->lmasters=talloc_array(mem_ctx, uint32_t, keys->num); - keys->data=talloc_array(mem_ctx, TDB_DATA, keys->num); - - /* loop over all key/data pairs */ - ptr=&outdata.dptr[8]; - for(i=0;inum;i++){ - TDB_DATA *key, *data; - - keys->lmasters[i] = *((uint32_t *)ptr); - ptr += 4; - - key = &keys->keys[i]; - key->dsize = *((uint32_t *)ptr); - key->dptr = talloc_size(mem_ctx, key->dsize); - ptr += 4; + reply = (struct ctdb_control_pulldb_reply *)outdata.dptr; + keys->dbid = reply->db_id; + keys->num = reply->count; + + keys->keys = talloc_array(mem_ctx, TDB_DATA, keys->num); + keys->headers = talloc_array(mem_ctx, struct ctdb_ltdb_header, keys->num); + keys->lmasters = talloc_array(mem_ctx, uint32_t, keys->num); + keys->data = talloc_array(mem_ctx, TDB_DATA, keys->num); - data = &keys->data[i]; - data->dsize = *((uint32_t *)ptr); - data->dptr = talloc_size(mem_ctx, data->dsize); - ptr += 4; + rec = (struct ctdb_rec_data *)&reply->data[0]; - ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1)); - memcpy(key->dptr, ptr, key->dsize); - ptr += key->dsize; + for (i=0;icount;i++) { + keys->keys[i].dptr = talloc_memdup(mem_ctx, &rec->data[0], rec->keylen); + keys->keys[i].dsize = rec->keylen; - ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1)); - memcpy(&keys->headers[i], ptr, sizeof(struct ctdb_ltdb_header)); - ptr += sizeof(struct ctdb_ltdb_header); + keys->data[i].dptr = talloc_memdup(mem_ctx, &rec->data[keys->keys[i].dsize], rec->datalen); + keys->data[i].dsize = rec->datalen; - ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1)); - memcpy(data->dptr, ptr, data->dsize); - ptr += data->dsize; + if (keys->data[i].dsize < sizeof(struct ctdb_ltdb_header)) { + DEBUG(0,(__location__ " bad ltdb record\n")); + return -1; + } + memcpy(&keys->headers[i], keys->data[i].dptr, sizeof(struct ctdb_ltdb_header)); + keys->data[i].dptr += sizeof(struct ctdb_ltdb_header); + keys->data[i].dsize -= sizeof(struct ctdb_ltdb_header); - ptr = outdata.dptr+(((ptr-outdata.dptr)+CTDB_DS_ALIGNMENT-1)& ~(CTDB_DS_ALIGNMENT-1)); - } + rec = (struct ctdb_rec_data *)(rec->length + (uint8_t *)rec); + } return 0; }