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

📄 mfile.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
	meta_file *m = meta_f;		for (i = 0; i<m->no_files; i++)	{	    xfree (m->files[i].path);	}	zebra_mutex_destroy (&meta_f->mutex);	meta_f = meta_f->next;	xfree (m);    }    xfree (ma);}void mf_reset(MFile_area ma){    meta_file *meta_f;    if (!ma)	return;    meta_f = ma->mfiles;    while (meta_f)    {	int i;	meta_file *m = meta_f;	assert (!m->open);	for (i = 0; i<m->no_files; i++)	{	    unlink (m->files[i].path);	    xfree (m->files[i].path);	}	meta_f = meta_f->next;	xfree (m);    }    ma->mfiles = 0;}/* * Open a metafile. * If !ma, Use MF_DEFAULT_AREA. */MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag){    meta_file *mnew;    int i;    char tmp[FILENAME_MAX+1];    mf_dir *dp;    logf(LOG_DEBUG, "mf_open(%s bs=%d, %s)", name, block_size,         wflag ? "RW" : "RDONLY");    assert (ma);    for (mnew = ma->mfiles; mnew; mnew = mnew->next)    	if (!strcmp(name, mnew->name))	{    	    if (mnew->open)    	        abort();	    else	        break;	}    if (!mnew)    {    	mnew = (meta_file *) xmalloc(sizeof(*mnew));    	strcpy(mnew->name, name);    	/* allocate one, empty file */	zebra_mutex_init (&mnew->mutex);    	mnew->no_files = 1;    	mnew->files[0].bytes = 0;	mnew->files[0].blocks = 0;    	mnew->files[0].top = -1;    	mnew->files[0].number = 0;    	mnew->files[0].fd = -1;        mnew->unlink_flag = 0;    	mnew->min_bytes_creat = MF_MIN_BLOCKS_CREAT * block_size;    	for (dp = ma->dirs; dp && dp->max_bytes >= 0 && dp->avail_bytes <	    mnew->min_bytes_creat; dp = dp->next);	if (!dp)	{	    logf (LOG_FATAL, "Insufficient space for new mfile.");	    return 0;	}	mnew->files[0].dir = dp;    	sprintf(tmp, "%s/%s-%d.mf", dp->name, mnew->name, 0);    	mnew->files[0].path = xstrdup(tmp);    	mnew->ma = ma;	mnew->next = ma->mfiles;	ma->mfiles = mnew;    }    else    {    	for (i = 0; i < mnew->no_files; i++)    	{	    if (mnew->files[i].bytes % block_size)	    	mnew->files[i].bytes += block_size - mnew->files[i].bytes %		    block_size;	    mnew->files[i].blocks = (int) (mnew->files[i].bytes / block_size);	}    	assert(!mnew->open);    }    mnew->blocksize = block_size;    mnew->min_bytes_creat = MF_MIN_BLOCKS_CREAT * block_size;    mnew->wr=wflag;    mnew->cur_file = 0;    mnew->open = 1;    for (i = 0; i < mnew->no_files; i++)    {    	mnew->files[i].blocks = (int)(mnew->files[i].bytes / mnew->blocksize);    	if (i == mnew->no_files - 1)	    mnew->files[i].top = -1;	else	    mnew->files[i].top =		i ? (mnew->files[i-1].top + mnew->files[i].blocks)	        : (mnew->files[i].blocks - 1);    }    return mnew;}/* * Close a metafile. */int mf_close(MFile mf){    int i;    logf (LOG_DEBUG, "mf_close(%s)", mf->name);    assert(mf->open);    for (i = 0; i < mf->no_files; i++)    {    	if (mf->files[i].fd >= 0)    	{#ifndef WIN32	    fsync(mf->files[i].fd);#endif    	    close(mf->files[i].fd);    	    mf->files[i].fd = -1;	}        if (mf->unlink_flag)            unlink(mf->files[i].path);    }    mf->open = 0;    return 0;}/* * Read one block from a metafile. Interface mirrors bfile. */int mf_read(MFile mf, int no, int offset, int nbytes, void *buf){    int rd, toread;    zebra_mutex_lock (&mf->mutex);    if ((rd = file_position(mf, no, offset)) < 0)    {        if (rd == -2)	{	    zebra_mutex_unlock (&mf->mutex);            return 0;	}        else        {            yaz_log (LOG_FATAL, "mf_read %s internal error", mf->name);            exit(1);        }    }    toread = nbytes ? nbytes : mf->blocksize;    if ((rd = read(mf->files[mf->cur_file].fd, buf, toread)) < 0)    {    	logf (LOG_FATAL|LOG_ERRNO, "mf_read: Read failed (%s)",              mf->files[mf->cur_file].path);    	exit(1);    }    zebra_mutex_unlock (&mf->mutex);    if (rd < toread)    	return 0;    else    	return 1;}/* * Write. */int mf_write(MFile mf, int no, int offset, int nbytes, const void *buf){    int ps, nblocks, towrite;    mf_dir *dp;    char tmp[FILENAME_MAX+1];    unsigned char dummych = '\xff';    zebra_mutex_lock (&mf->mutex);    if ((ps = file_position(mf, no, offset)) < 0)    {        yaz_log (LOG_FATAL, "mf_write %s internal error (1)", mf->name);	exit(1);    }    /* file needs to grow */    while (ps >= mf->files[mf->cur_file].blocks)    {        mfile_off_t needed = (ps - mf->files[mf->cur_file].blocks + 1) *                       mf->blocksize;    	/* file overflow - allocate new file */    	if (mf->files[mf->cur_file].dir->max_bytes >= 0 &&	    needed > mf->files[mf->cur_file].dir->avail_bytes)	{	    /* cap off file? */	    if ((nblocks = (int) (mf->files[mf->cur_file].dir->avail_bytes /		mf->blocksize)) > 0)	    {	    	logf (LOG_DEBUG, "Capping off file %s at pos %d",		    mf->files[mf->cur_file].path, nblocks);	    	if ((ps = file_position(mf,		    (mf->cur_file ? mf->files[mf->cur_file-1].top : 0) +		    mf->files[mf->cur_file].blocks + nblocks - 1, 0)) < 0)                {                    yaz_log (LOG_FATAL, "mf_write %s internal error (2)",				 mf->name);		    exit(1);                }		logf (LOG_DEBUG, "ps = %d", ps);		if (write(mf->files[mf->cur_file].fd, &dummych, 1) < 1)		{		    logf (LOG_ERRNO|LOG_FATAL, "mf_write %s internal error (3)",				      mf->name);		    exit(1);		}		mf->files[mf->cur_file].blocks += nblocks;		mf->files[mf->cur_file].bytes += nblocks * mf->blocksize;		mf->files[mf->cur_file].dir->avail_bytes -= nblocks *		    mf->blocksize;	    }	    /* get other bit */    	    logf (LOG_DEBUG, "Creating new file.");    	    for (dp = mf->ma->dirs; dp && dp->max_bytes >= 0 &&		dp->avail_bytes < needed; dp = dp->next);	    if (!dp)	    {	    	logf (LOG_FATAL, "Cannot allocate more space for %s",                      mf->name);	    	exit(1);	    }	    mf->files[mf->cur_file].top = (mf->cur_file ?	    	mf->files[mf->cur_file-1].top : -1) +		mf->files[mf->cur_file].blocks;	    mf->files[++(mf->cur_file)].top = -1;	    mf->files[mf->cur_file].dir = dp;	    mf->files[mf->cur_file].number =		mf->files[mf->cur_file-1].number + 1;	    mf->files[mf->cur_file].blocks = 0;	    mf->files[mf->cur_file].bytes = 0;	    mf->files[mf->cur_file].fd = -1;	    sprintf(tmp, "%s/%s-%d.mf", dp->name, mf->name,		mf->files[mf->cur_file].number);	    mf->files[mf->cur_file].path = xstrdup(tmp);	    mf->no_files++;	    /* open new file and position at beginning */	    if ((ps = file_position(mf, no, offset)) < 0)            {                yaz_log (LOG_FATAL, "mf_write %s internal error (4)",				 mf->name);	    	exit(1);            }		}	else	{	    nblocks = ps - mf->files[mf->cur_file].blocks + 1;	    mf->files[mf->cur_file].blocks += nblocks;	    mf->files[mf->cur_file].bytes += nblocks * mf->blocksize;	    if (mf->files[mf->cur_file].dir->max_bytes >= 0)		mf->files[mf->cur_file].dir->avail_bytes -=		nblocks * mf->blocksize;	}    }    towrite = nbytes ? nbytes : mf->blocksize;    if (write(mf->files[mf->cur_file].fd, buf, towrite) < towrite)    {    	logf (LOG_FATAL|LOG_ERRNO, "Write failed for file %s part %d",		mf->name, mf->cur_file);    	exit(1);    }    zebra_mutex_unlock (&mf->mutex);    return 0;}/* * Destroy a metafile, unlinking component files. File must be open. */int mf_unlink(MFile mf){    if (mf->open)        mf->unlink_flag = 1;    else    {        int i;        for (i = 0; i<mf->no_files; i++)            unlink(mf->files[i].path);    }    return 0;}/* * Unlink the file by name, rather than MFile-handle. File should be closed. */int mf_unlink_name(MFile_area ma, const char *name){    abort();    return 0;}

⌨️ 快捷键说明

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