X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=bfile%2Fbfile.c;h=33f856b152094ba56a8f34f5e518c86e0575ecbf;hp=7fb6a8c81ec78c6168d85cbd6f421cb36491e3a6;hb=1d5d4f08cb84516d75fcb5e6ed4199b6454cccd6;hpb=91c31916bd40829afa20cd4e104ffc764ea116bf diff --git a/bfile/bfile.c b/bfile/bfile.c index 7fb6a8c..33f856b 100644 --- a/bfile/bfile.c +++ b/bfile/bfile.c @@ -1,8 +1,5 @@ -/* $Id: bfile.c,v 1.51 2006-11-08 22:08:27 adam Exp $ - Copyright (C) 1995-2006 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 2004-2013 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -20,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -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, @@ -160,7 +177,7 @@ BFile bf_xopen(BFiles bfs, const char *name, int block_size, int wrflag, bf->alloc_buf_size = HEADER_SIZE; else bf->alloc_buf_size = bf->block_size; - + hbuf = bf->alloc_buf = xmalloc(bf->alloc_buf_size); /* fill-in default values */ @@ -226,7 +243,7 @@ int bf_xclose(BFile bf, int version, const char *more_info) zint pos = 0; assert(bf->alloc_buf); assert(bf->magic); - sprintf(bf->alloc_buf, "%s %d " ZINT_FORMAT " " ZINT_FORMAT " ", + sprintf(bf->alloc_buf, "%s %d " ZINT_FORMAT " " ZINT_FORMAT " ", bf->magic, version, bf->last_block, bf->free_list); if (more_info) strcat(bf->alloc_buf, more_info); @@ -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; } @@ -320,7 +337,7 @@ int bf_read2(BFile bf, zint no, int offset, int nbytes, void *buf) if ((ret = cf_read(bf->cf, no, offset, nbytes, buf)) == 0) ret = mf_read(bf->mf, no, offset, nbytes, buf); } - else + else ret = mf_read(bf->mf, no, offset, nbytes, buf); zebra_lock_rdwr_runlock(&bf->rdwr_lock); 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); } @@ -480,6 +513,7 @@ int bfs_shadow_directory_stat(BFiles bfs, int no, const char **directory, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab