X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=bfile%2Fmfile.c;h=794d529c2e43fb2482a4b885ea2beae24b81326d;hb=2b1851bd5565e3d21f9cf9a37661a584c063b75f;hp=684d6b063ef250a050b2af653b3851c4db92ebd0;hpb=eb2b742588ce07fb4516bbca22c93b938b13e433;p=idzebra-moved-to-github.git diff --git a/bfile/mfile.c b/bfile/mfile.c index 684d6b0..794d529 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -4,7 +4,25 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: mfile.c,v $ - * Revision 1.37 2000-03-15 15:00:30 adam + * Revision 1.42 2002-04-04 14:14:13 adam + * Multiple registers (alpha early) + * + * Revision 1.41 2000/11/29 14:24:01 adam + * Script configure uses yaz pthreads options. Added locking for + * zebra_register_{lock,unlock}. + * + * Revision 1.40 2000/10/17 12:37:09 adam + * Fixed notification of live-updates. Fixed minor problem with mf_init + * where it didn't handle shadow area file names correctly. + * + * Revision 1.39 2000/05/05 13:48:03 adam + * Fixed locking for metafiles. + * + * Revision 1.38 2000/03/20 19:08:35 adam + * Added remote record import using Z39.50 extended services and Segment + * Requests. + * + * Revision 1.37 2000/03/15 15:00:30 adam * First work on threaded version. * * Revision 1.36 1999/12/08 15:03:11 adam @@ -144,7 +162,7 @@ #include #include -static int scan_areadef(MFile_area ma, const char *name, const char *ad) +static int scan_areadef(MFile_area ma, const char *ad, const char *base) { /* * If no definition is given, use current directory, unlimited. @@ -153,7 +171,7 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad) mf_dir **dp = &ma->dirs, *dir = *dp; if (!ad) - ad = ".:-1b"; + ad = ".:-1b"; for (;;) { const char *ad0 = ad; @@ -164,6 +182,12 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad) ad++; if (!*ad) break; + if (!zebra_is_abspath(ad) && base) + { + strcpy (dirname, base); + i = strlen(dirname); + dirname[i++] = '/'; + } while (*ad) { if (*ad == ':' && strchr ("+-0123456789", ad[1])) @@ -268,7 +292,7 @@ static int cmp_part_file(const void *p1, const void *p2) * Create a new area, cotaining metafiles in directories. * Find the part-files in each directory, and inventory the existing metafiles. */ -MFile_area mf_init(const char *name, const char *spec) +MFile_area mf_init(const char *name, const char *spec, const char *base) { MFile_area ma = (MFile_area) xmalloc(sizeof(*ma)); mf_dir *dirp; @@ -283,7 +307,7 @@ MFile_area mf_init(const char *name, const char *spec) strcpy(ma->name, name); ma->mfiles = 0; ma->dirs = 0; - if (scan_areadef(ma, name, spec) < 0) + if (scan_areadef(ma, spec, base) < 0) { logf (LOG_WARN, "Failed to access description of '%s'", name); return 0; @@ -300,13 +324,16 @@ MFile_area mf_init(const char *name, const char *spec) /* look at each file */ while ((dent = readdir(dd))) { - if (*dent->d_name == '.') - continue; - if (sscanf(dent->d_name, "%[^-]-%d.mf", metaname, &number) != 2) - { - logf (LOG_DEBUG, "bf: %s is not a part-file.", dent->d_name); - continue; - } + int len = strlen(dent->d_name); + const char *cp = strrchr (dent->d_name, '-'); + if (strchr (".-", *dent->d_name)) + continue; + if (len < 5 || !cp || strcmp (dent->d_name + len - 3, ".mf")) + continue; + number = atoi(cp+1); + memcpy (metaname, dent->d_name, cp - dent->d_name); + metaname[ cp - dent->d_name] = '\0'; + for (meta_f = ma->mfiles; meta_f; meta_f = meta_f->next) { /* known metafile */ @@ -320,6 +347,7 @@ MFile_area mf_init(const char *name, const char *spec) if (!meta_f) { meta_f = (meta_file *) xmalloc(sizeof(*meta_f)); + zebra_mutex_init (&meta_f->mutex); meta_f->ma = ma; meta_f->next = ma->mfiles; meta_f->open = 0; @@ -527,7 +555,10 @@ int mf_read(MFile mf, int no, int offset, int nbytes, void *buf) if ((rd = file_position(mf, no, offset)) < 0) { if (rd == -2) + { + zebra_mutex_unlock (&mf->mutex); return 0; + } else exit(1); }