1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

g_lock: add "struct g_lock" without talloc

Enable handing the g_lock.tdb content without having to talloc

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
Volker Lendecke 2017-06-28 13:36:53 +02:00 committed by Ralph Boehme
parent 2b6015f1e8
commit 8f2a5f1418

View File

@ -56,6 +56,95 @@ static void g_lock_rec_get(struct g_lock_rec *rec,
server_id_get(&rec->pid, buf+1);
}
#if 0
struct g_lock {
uint8_t *recsbuf;
size_t num_recs;
uint8_t *data;
size_t datalen;
};
static bool g_lock_parse(uint8_t *buf, size_t buflen, struct g_lock *lck)
{
size_t found_recs, data_ofs;
if (buflen < sizeof(uint32_t)) {
*lck = (struct g_lock) {0};
return true;
}
found_recs = IVAL(buf, 0);
if (found_recs > buflen/G_LOCK_REC_LENGTH) {
return false;
}
buf += sizeof(uint32_t);
buflen -= sizeof(uint32_t);
data_ofs = found_recs * G_LOCK_REC_LENGTH;
*lck = (struct g_lock) {
.recsbuf = buf, .num_recs = found_recs,
.data = buf+data_ofs, .datalen = buflen-data_ofs
};
return true;
}
static void g_lock_get_rec(struct g_lock *lck, size_t i,
struct g_lock_rec *rec)
{
if (i >= lck->num_recs) {
abort();
}
g_lock_rec_get(rec, lck->recsbuf + i*G_LOCK_REC_LENGTH);
}
static void g_lock_rec_del(struct g_lock *lck, size_t i)
{
if (i >= lck->num_recs) {
abort();
}
lck->num_recs -= 1;
if (i < lck->num_recs) {
uint8_t *recptr = lck->recsbuf + i*G_LOCK_REC_LENGTH;
memcpy(recptr, lck->recsbuf + lck->num_recs*G_LOCK_REC_LENGTH,
G_LOCK_REC_LENGTH);
}
}
static NTSTATUS g_lock_store(struct db_record *rec, struct g_lock *lck,
struct g_lock_rec *add)
{
uint8_t sizebuf[4];
uint8_t addbuf[G_LOCK_REC_LENGTH];
struct TDB_DATA dbufs[] = {
{ .dptr = sizebuf, .dsize = sizeof(sizebuf) },
{ .dptr = lck->recsbuf,
.dsize = lck->num_recs * G_LOCK_REC_LENGTH },
{ 0 },
{ .dptr = lck->data, .dsize = lck->datalen }
};
if (add != NULL) {
g_lock_rec_put(addbuf, *add);
dbufs[2] = (TDB_DATA) {
.dptr = addbuf, .dsize = G_LOCK_REC_LENGTH
};
lck->num_recs += 1;
}
SIVAL(sizebuf, 0, lck->num_recs);
return dbwrap_record_storev(rec, dbufs, ARRAY_SIZE(dbufs), 0);
}
#endif
static ssize_t g_lock_put(uint8_t *buf, size_t buflen,
const struct g_lock_rec *locks,
size_t num_locks,