⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfile.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
/* $Id: bfile.c,v 1.35 2002/08/02 19:26:55 adam Exp $   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002   Index Data ApsThis file is part of the Zebra server.Zebra is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.Zebra is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public Licensealong with Zebra; see the file LICENSE.zebra.  If not, write to theFree Software Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#ifdef WIN32#include <io.h>#else#include <unistd.h>#endif#include <zebrautl.h>#include <bfile.h>#include "cfile.h"struct BFiles_struct {    MFile_area commit_area;    MFile_area_struct *register_area;    char *base;    char *cache_fname;};BFiles bfs_create (const char *spec, const char *base){    BFiles bfs = (BFiles) xmalloc (sizeof(*bfs));    bfs->commit_area = NULL;    bfs->base = 0;    bfs->cache_fname = 0;    if (base)        bfs->base = xstrdup (base);    bfs->register_area = mf_init("register", spec, base);    if (!bfs->register_area)    {        bfs_destroy(bfs);        return 0;    }    return bfs;}void bfs_destroy (BFiles bfs){    if (!bfs)        return;    xfree (bfs->cache_fname);    xfree (bfs->base);    mf_destroy (bfs->commit_area);    mf_destroy (bfs->register_area);    xfree (bfs);}static FILE *open_cache (BFiles bfs, const char *flags){    FILE *file;    file = fopen (bfs->cache_fname, flags);    return file;}static void unlink_cache (BFiles bfs){    unlink (bfs->cache_fname);}void bf_cache (BFiles bfs, const char *spec){    if (spec)    {        yaz_log (LOG_LOG, "enabling cache spec=%s", spec);        if (!bfs->commit_area)	    bfs->commit_area = mf_init ("shadow", spec, bfs->base);        if (bfs->commit_area)        {            bfs->cache_fname = xmalloc (strlen(bfs->commit_area->dirs->name)+                                       8);            strcpy (bfs->cache_fname, bfs->commit_area->dirs->name);            strcat (bfs->cache_fname, "/cache");            yaz_log (LOG_LOG, "cache_fname = %s", bfs->cache_fname);        }    }    else        bfs->commit_area = NULL;}int bf_close (BFile bf){    zebra_lock_rdwr_destroy (&bf->rdwr_lock);    if (bf->cf)        cf_close (bf->cf);    mf_close (bf->mf);    xfree (bf);    return 0;}BFile bf_open (BFiles bfs, const char *name, int block_size, int wflag){    BFile tmp = (BFile) xmalloc(sizeof(BFile_struct));    if (bfs->commit_area)    {        int first_time;        tmp->mf = mf_open (bfs->register_area, name, block_size, 0);        tmp->cf = cf_open (tmp->mf, bfs->commit_area, name, block_size,                           wflag, &first_time);        if (first_time)        {            FILE *outf;            outf = open_cache (bfs, "ab");            if (!outf)            {                logf (LOG_FATAL|LOG_ERRNO, "open %s", bfs->cache_fname);                exit (1);            }            fprintf (outf, "%s %d\n", name, block_size);            fclose (outf);        }    }    else    {        tmp->mf = mf_open(bfs->register_area, name, block_size, wflag);        tmp->cf = NULL;    }    if (!tmp->mf)    {        logf (LOG_FATAL, "mf_open failed for %s", name);        xfree (tmp);        return 0;    }    zebra_lock_rdwr_init (&tmp->rdwr_lock);    return(tmp);}int bf_read (BFile bf, int no, int offset, int nbytes, void *buf){    int r;    zebra_lock_rdwr_rlock (&bf->rdwr_lock);    if (bf->cf)    {	if ((r = cf_read (bf->cf, no, offset, nbytes, buf)) == -1)	    r = mf_read (bf->mf, no, offset, nbytes, buf);    }    else 	r = mf_read (bf->mf, no, offset, nbytes, buf);    zebra_lock_rdwr_runlock (&bf->rdwr_lock);    return r;}int bf_write (BFile bf, int no, int offset, int nbytes, const void *buf){    int r;    zebra_lock_rdwr_wlock (&bf->rdwr_lock);    if (bf->cf)        r = cf_write (bf->cf, no, offset, nbytes, buf);    else	r = mf_write (bf->mf, no, offset, nbytes, buf);    zebra_lock_rdwr_wunlock (&bf->rdwr_lock);    return r;}int bf_commitExists (BFiles bfs){    FILE *inf;    inf = open_cache (bfs, "rb");    if (inf)    {        fclose (inf);        return 1;    }    return 0;}void bf_reset (BFiles bfs){    if (!bfs)	return;    mf_reset (bfs->commit_area);    mf_reset (bfs->register_area);}void bf_commitExec (BFiles bfs){    FILE *inf;    int block_size;    char path[256];    MFile mf;    CFile cf;    int first_time;    assert (bfs->commit_area);    if (!(inf = open_cache (bfs, "rb")))    {        logf (LOG_LOG, "No commit file");        return ;    }    while (fscanf (inf, "%s %d", path, &block_size) == 2)    {        mf = mf_open (bfs->register_area, path, block_size, 1);        cf = cf_open (mf, bfs->commit_area, path, block_size, 0, &first_time);        cf_commit (cf);        cf_close (cf);        mf_close (mf);    }    fclose (inf);}void bf_commitClean (BFiles bfs, const char *spec){    FILE *inf;    int block_size;    char path[256];    MFile mf;    CFile cf;    int mustDisable = 0;    int firstTime;    if (!bfs->commit_area)    {        bf_cache (bfs, spec);        mustDisable = 1;    }    if (!(inf = open_cache (bfs, "rb")))        return ;    while (fscanf (inf, "%s %d", path, &block_size) == 2)    {        mf = mf_open (bfs->register_area, path, block_size, 0);        cf = cf_open (mf, bfs->commit_area, path, block_size, 1, &firstTime);        cf_unlink (cf);        cf_close (cf);        mf_close (mf);    }    fclose (inf);    unlink_cache (bfs);    if (mustDisable)        bf_cache (bfs, 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -