X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=bfile%2Fbfile.c;h=9ab0b9e90034e192fc9cbac2803fe435059c9506;hp=7fb6a8c81ec78c6168d85cbd6f421cb36491e3a6;hb=6d2a90b3e3802726c044e128d1a34f5f892f9f3f;hpb=91c31916bd40829afa20cd4e104ffc764ea116bf diff --git a/bfile/bfile.c b/bfile/bfile.c index 7fb6a8c..9ab0b9e 100644 --- a/bfile/bfile.c +++ b/bfile/bfile.c @@ -1,5 +1,5 @@ -/* $Id: bfile.c,v 1.51 2006-11-08 22:08:27 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: bfile.c,v 1.54 2007-01-15 15:10:13 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -55,7 +55,7 @@ struct BFile_struct struct BFiles_struct { MFile_area commit_area; - MFile_area_struct *register_area; + MFile_area register_area; char *base; char *cache_fname; }; @@ -68,7 +68,7 @@ BFiles bfs_create (const char *spec, const char *base) bfs->cache_fname = 0; if (base) bfs->base = xstrdup(base); - bfs->register_area = mf_init("register", spec, base); + bfs->register_area = mf_init("register", spec, base, 0); if (!bfs->register_area) { bfs_destroy(bfs); @@ -98,7 +98,8 @@ static FILE *open_cache(BFiles bfs, const char *flags) static void unlink_cache(BFiles bfs) { - unlink(bfs->cache_fname); + if (bfs->cache_fname) + unlink(bfs->cache_fname); } ZEBRA_RES bf_cache(BFiles bfs, const char *spec) @@ -107,7 +108,7 @@ ZEBRA_RES bf_cache(BFiles bfs, const char *spec) { yaz_log(YLOG_LOG, "enabling shadow spec=%s", spec); if (!bfs->commit_area) - bfs->commit_area = mf_init("shadow", spec, bfs->base); + bfs->commit_area = mf_init("shadow", spec, bfs->base, 1); if (bfs->commit_area) { bfs->cache_fname = xmalloc(strlen(bfs->commit_area->dirs->name)+ @@ -127,19 +128,35 @@ ZEBRA_RES bf_cache(BFiles bfs, const char *spec) return ZEBRA_OK; } -int bf_close(BFile bf) +int bf_close2(BFile bf) { + int ret = 0; zebra_lock_rdwr_destroy(&bf->rdwr_lock); if (bf->cf) - cf_close(bf->cf); + { + if (cf_close(bf->cf)) + ret = -1; + } if (bf->mf) - mf_close(bf->mf); + { + if (mf_close(bf->mf)) + ret = -1; + } xfree(bf->alloc_buf); xfree(bf->magic); xfree(bf); - return 0; + return ret; +} + +void bf_close(BFile bf) +{ + if (bf_close2(bf)) + { + zebra_exit("bf_close"); + } } + #define HEADER_SIZE 256 BFile bf_xopen(BFiles bfs, const char *name, int block_size, int wrflag, @@ -238,7 +255,7 @@ int bf_xclose(BFile bf, int version, const char *more_info) break; } } - return bf_close(bf); + return bf_close2(bf); } BFile bf_open(BFiles bfs, const char *name, int block_size, int wflag) @@ -305,7 +322,7 @@ int bf_read(BFile bf, zint no, int offset, int nbytes, void *buf) if (ret == -1) { - exit(1); + zebra_exit("bf_read"); } return ret; } @@ -332,7 +349,7 @@ int bf_write(BFile bf, zint no, int offset, int nbytes, const void *buf) if (ret == -1) { - exit(1); + zebra_exit("bf_write"); } return ret; } @@ -371,7 +388,7 @@ void bf_reset(BFiles bfs) unlink_cache(bfs); } -void bf_commitExec(BFiles bfs) +int bf_commitExec(BFiles bfs) { FILE *inf; int block_size; @@ -379,24 +396,40 @@ void bf_commitExec(BFiles bfs) MFile mf; CFile cf; int first_time; + int r = 0; assert(bfs->commit_area); if (!(inf = open_cache(bfs, "rb"))) { yaz_log(YLOG_LOG, "No commit file"); - return ; + return -1; } while (fscanf(inf, "%s %d", path, &block_size) == 2) { mf = mf_open(bfs->register_area, path, block_size, 1); + if (!mf) + { + r = -1; + break; + } cf = cf_open(mf, bfs->commit_area, path, block_size, 0, &first_time); + if (!cf) + { + mf_close(mf); + r = -1; + break; + } - cf_commit(cf); + r = cf_commit(cf); cf_close(cf); mf_close(mf); + + if (r) + break; } fclose(inf); + return r; } void bf_commitClean(BFiles bfs, const char *spec) @@ -432,11 +465,11 @@ int bf_alloc(BFile bf, int no, zint *blocks) memset(buf, '\0', sizeof(buf)); blocks[i] = bf->free_list; - if (!bf_read(bf, bf->free_list, 0, sizeof(buf), buf)) + if (bf_read(bf, bf->free_list, 0, sizeof(buf), buf) != 1) { yaz_log(YLOG_WARN, "Bad freelist entry " ZINT_FORMAT, bf->free_list); - exit(1); + return -1; } zebra_zint_decode(&cp, &bf->free_list); }