X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=bfile%2Fmfile.c;h=794d529c2e43fb2482a4b885ea2beae24b81326d;hb=2b1851bd5565e3d21f9cf9a37661a584c063b75f;hp=6942bbdbcc8fe2231a572f0c0ed7cb2215a1afe4;hpb=c41c84a497ae744aa825a90f144c85b54f1cd4bb;p=idzebra-moved-to-github.git diff --git a/bfile/mfile.c b/bfile/mfile.c index 6942bbd..794d529 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -4,7 +4,21 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: mfile.c,v $ - * Revision 1.38 2000-03-20 19:08:35 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. * @@ -148,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. @@ -157,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; @@ -168,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])) @@ -272,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; @@ -287,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; @@ -304,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 */ @@ -324,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;