X-Git-Url: http://git.samba.org/?p=samba.git;a=blobdiff_plain;f=lib%2Ftdb%2Fcommon%2Ffreelist.c;fp=lib%2Ftdb%2Fcommon%2Ffreelist.c;h=69b3c66ab83ce1b71f409c71dd1fefe95af91546;hp=41986b9284eccd8f5eb6bebd8851717c6069d06c;hb=117807cd2dbb7cf2276b84e2b20f858cd6ec30e9;hpb=66f3330be82a382898bb22c3f9563cc873c75488 diff --git a/lib/tdb/common/freelist.c b/lib/tdb/common/freelist.c index 41986b9284e..69b3c66ab83 100644 --- a/lib/tdb/common/freelist.c +++ b/lib/tdb/common/freelist.c @@ -190,6 +190,56 @@ static int merge_with_left_record(struct tdb_context *tdb, return 0; } +/** + * Check whether the record left of a given freelist record is + * also a freelist record, and if so, merge the two records. + * + * Return code: + * -1 upon error + * 0 if left was not a free record + * 1 if left was free and successfully merged. + * + * The currend record is handed in with pointer and fully read record. + * + * The left record pointer and struct can be retrieved as result + * in lp and lr; + */ +static int check_merge_with_left_record(struct tdb_context *tdb, + tdb_off_t rec_ptr, + struct tdb_record *rec, + tdb_off_t *lp, + struct tdb_record *lr) +{ + tdb_off_t left_ptr; + struct tdb_record left_rec; + int ret; + + ret = read_record_on_left(tdb, rec_ptr, &left_ptr, &left_rec); + if (ret != 0) { + return 0; + } + + if (left_rec.magic != TDB_FREE_MAGIC) { + return 0; + } + + /* It's free - expand to include it. */ + ret = merge_with_left_record(tdb, left_ptr, &left_rec, rec); + if (ret != 0) { + return -1; + } + + if (lp != NULL) { + *lp = left_ptr; + } + + if (lr != NULL) { + *lr = left_rec; + } + + return 1; +} + /** * Add an element into the freelist. *