X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb1_io.c;h=f3d139d0434a97fc7c9dbb6a4deea6cb6d2cd43e;hp=fe07c4ad2e0e6fb5b790e5d6d32cb737d67e7e6c;hb=5c559e7df1d31b4c0ddf26451fac972dc8a0c2c9;hpb=bbeb528e74c0e234e1f724ac8d54be404cfc6f9a diff --git a/ccan/tdb2/tdb1_io.c b/ccan/tdb2/tdb1_io.c index fe07c4ad..f3d139d0 100644 --- a/ccan/tdb2/tdb1_io.c +++ b/ccan/tdb2/tdb1_io.c @@ -307,6 +307,7 @@ static int tdb1_expand_file(struct tdb_context *tdb, tdb1_off_t size, tdb1_off_t addition -= written; size += written; } + tdb->stats.expands++; return 0; } @@ -369,6 +370,9 @@ int tdb1_expand(struct tdb_context *tdb, tdb1_off_t size) char *new_map_ptr = (char *)realloc(tdb->file->map_ptr, tdb->file->map_size); if (!new_map_ptr) { + tdb->last_error = tdb_logerr(tdb, TDB_ERR_OOM, + TDB_LOG_ERROR, + "tdb1_expand: no memory"); tdb->file->map_size -= size; goto fail; } @@ -435,15 +439,15 @@ unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_ } /* Give a piece of tdb data to a parser */ - -int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, - tdb1_off_t offset, tdb1_len_t len, - int (*parser)(TDB_DATA key, TDB_DATA data, - void *private_data), - void *private_data) +enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, + tdb1_off_t offset, tdb1_len_t len, + enum TDB_ERROR (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data) { TDB_DATA data; - int result; + enum TDB_ERROR result; data.dsize = len; @@ -453,14 +457,14 @@ int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, * parser directly at the mmap area. */ if (tdb->tdb1.io->tdb1_oob(tdb, offset+len, 0) != 0) { - return -1; + return tdb->last_error; } data.dptr = offset + (unsigned char *)tdb->file->map_ptr; return parser(key, data, private_data); } if (!(data.dptr = tdb1_alloc_read(tdb, offset, len))) { - return -1; + return tdb->last_error; } result = parser(key, data, private_data); @@ -503,3 +507,10 @@ void tdb1_io_init(struct tdb_context *tdb) { tdb->tdb1.io = &io1_methods; } + +enum TDB_ERROR tdb1_probe_length(struct tdb_context *tdb) +{ + tdb->last_error = TDB_SUCCESS; + tdb->tdb1.io->tdb1_oob(tdb, tdb->file->map_size + 1, true); + return tdb->last_error; +}