亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? store_dir_ufs.c

?? 代理服務器 squid-2.6.STABLE16
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * $Id: store_dir_ufs.c,v 1.63.2.1 2007/03/03 13:34:52 hno Exp $ * * DEBUG: section 47    Store Directory Routines * AUTHOR: Duane Wessels * * SQUID Web Proxy Cache          http://www.squid-cache.org/ * ---------------------------------------------------------- * *  Squid is the result of efforts by numerous individuals from *  the Internet community; see the CONTRIBUTORS file for full *  details.   Many organizations have provided support for Squid's *  development; see the SPONSORS file for full details.  Squid is *  Copyrighted (C) 2001 by the Regents of the University of *  California; see the COPYRIGHT file for full details.  Squid *  incorporates software developed and/or copyrighted by other *  sources; see the CREDITS file for full details. * *  This program 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 Software Foundation; either version 2 of the License, or *  (at your option) any later version. *   *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. *   *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * */#include "squid.h"#include "store_ufs.h"#define DefaultLevelOneDirs     16#define DefaultLevelTwoDirs     256#define STORE_META_BUFSZ 4096typedef struct _RebuildState RebuildState;struct _RebuildState {    SwapDir *sd;    int n_read;    FILE *log;    int speed;    int curlvl1;    int curlvl2;    struct {	unsigned int clean:1;	unsigned int init:1;    } flags;    int done;    int in_dir;    int fn;    struct dirent *entry;    DIR *td;    char fullpath[SQUID_MAXPATHLEN];    char fullfilename[SQUID_MAXPATHLEN];    struct _store_rebuild_data counts;};static int n_ufs_dirs = 0;static int *ufs_dir_index = NULL;MemPool *ufs_state_pool = NULL;static int ufs_initialised = 0;static char *storeUfsDirSwapSubDir(SwapDir *, int subdirn);static int storeUfsDirCreateDirectory(const char *path, int);static int storeUfsDirVerifyCacheDirs(SwapDir *);static int storeUfsDirVerifyDirectory(const char *path);static void storeUfsDirCreateSwapSubDirs(SwapDir *);static char *storeUfsDirSwapLogFile(SwapDir *, const char *);static EVH storeUfsDirRebuildFromDirectory;static EVH storeUfsDirRebuildFromSwapLog;static int storeUfsDirGetNextFile(RebuildState *, sfileno *, int *size);static StoreEntry *storeUfsDirAddDiskRestore(SwapDir * SD, const cache_key * key,    int file_number,    squid_file_sz swap_file_sz,    time_t expires,    time_t timestamp,    time_t lastref,    time_t lastmod,    u_num32 refcount,    u_short flags,    int clean);static void storeUfsDirRebuild(SwapDir * sd);static void storeUfsDirCloseTmpSwapLog(SwapDir * sd);static FILE *storeUfsDirOpenTmpSwapLog(SwapDir *, int *, int *);static STLOGOPEN storeUfsDirOpenSwapLog;static STINIT storeUfsDirInit;static STFREE storeUfsDirFree;static STLOGCLEANSTART storeUfsDirWriteCleanStart;static STLOGCLEANNEXTENTRY storeUfsDirCleanLogNextEntry;static STLOGCLEANWRITE storeUfsDirWriteCleanEntry;static STLOGCLEANDONE storeUfsDirWriteCleanDone;static STLOGCLOSE storeUfsDirCloseSwapLog;static STLOGWRITE storeUfsDirSwapLog;static STNEWFS storeUfsDirNewfs;static STDUMP storeUfsDirDump;static STMAINTAINFS storeUfsDirMaintain;static STCHECKOBJ storeUfsDirCheckObj;static STCHECKLOADAV storeUfsDirCheckLoadAv;static STREFOBJ storeUfsDirRefObj;static STUNREFOBJ storeUfsDirUnrefObj;static QS rev_int_sort;static int storeUfsDirClean(int swap_index);static EVH storeUfsDirCleanEvent;static int storeUfsDirIs(SwapDir * sd);static int storeUfsFilenoBelongsHere(int fn, int F0, int F1, int F2);static int storeUfsCleanupDoubleCheck(SwapDir *, StoreEntry *);static void storeUfsDirStats(SwapDir *, StoreEntry *);static void storeUfsDirInitBitmap(SwapDir *);static int storeUfsDirValidFileno(SwapDir *, sfileno, int);STSETUP storeFsSetup_ufs;/* * These functions were ripped straight out of the heart of store_dir.c. * They assume that the given filenum is on a ufs partiton, which may or * may not be true..  * XXX this evilness should be tidied up at a later date! */static intstoreUfsDirMapBitTest(SwapDir * SD, sfileno filn){    ufsinfo_t *ufsinfo;    ufsinfo = (ufsinfo_t *) SD->fsdata;    return file_map_bit_test(ufsinfo->map, filn);}static voidstoreUfsDirMapBitSet(SwapDir * SD, int fn){    sfileno filn = fn;    ufsinfo_t *ufsinfo;    ufsinfo = (ufsinfo_t *) SD->fsdata;    file_map_bit_set(ufsinfo->map, filn);}voidstoreUfsDirMapBitReset(SwapDir * SD, int fn){    sfileno filn = fn;    ufsinfo_t *ufsinfo;    ufsinfo = (ufsinfo_t *) SD->fsdata;    /*     * We have to test the bit before calling file_map_bit_reset.     * file_map_bit_reset doesn't do bounds checking.  It assumes     * filn is a valid file number, but it might not be because     * the map is dynamic in size.  Also clearing an already clear     * bit puts the map counter of-of-whack.     */    if (file_map_bit_test(ufsinfo->map, filn))	file_map_bit_reset(ufsinfo->map, filn);}intstoreUfsDirMapBitAllocate(SwapDir * SD){    ufsinfo_t *ufsinfo = (ufsinfo_t *) SD->fsdata;    int fn;    fn = file_map_allocate(ufsinfo->map, ufsinfo->suggest);    file_map_bit_set(ufsinfo->map, fn);    ufsinfo->suggest = fn + 1;    return fn;}/* * Initialise the ufs bitmap * * If there already is a bitmap, and the numobjects is larger than currently * configured, we allocate a new bitmap and 'grow' the old one into it. */static voidstoreUfsDirInitBitmap(SwapDir * sd){    ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata;    if (ufsinfo->map == NULL) {	/* First time */	ufsinfo->map = file_map_create();    } else if (ufsinfo->map->max_n_files) {	/* it grew, need to expand */	/* XXX We don't need it anymore .. */    }    /* else it shrunk, and we leave the old one in place */}static char *storeUfsDirSwapSubDir(SwapDir * sd, int subdirn){    ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata;    LOCAL_ARRAY(char, fullfilename, SQUID_MAXPATHLEN);    assert(0 <= subdirn && subdirn < ufsinfo->l1);    snprintf(fullfilename, SQUID_MAXPATHLEN, "%s/%02X", sd->path, subdirn);    return fullfilename;}static intstoreUfsDirCreateDirectory(const char *path, int should_exist){    int created = 0;    struct stat st;    getCurrentTime();    if (0 == stat(path, &st)) {	if (S_ISDIR(st.st_mode)) {	    debug(47, should_exist ? 3 : 1) ("%s exists\n", path);	} else {	    fatalf("Swap directory %s is not a directory.", path);	}#ifdef _SQUID_MSWIN_    } else if (0 == mkdir(path)) {#else    } else if (0 == mkdir(path, 0755)) {#endif	debug(47, should_exist ? 1 : 3) ("%s created\n", path);	created = 1;    } else {	fatalf("Failed to make swap directory %s: %s",	    path, xstrerror());    }    return created;}static intstoreUfsDirVerifyDirectory(const char *path){    struct stat sb;    if (stat(path, &sb) < 0) {	debug(47, 0) ("%s: %s\n", path, xstrerror());	return -1;    }    if (S_ISDIR(sb.st_mode) == 0) {	debug(47, 0) ("%s is not a directory\n", path);	return -1;    }    return 0;}/* * This function is called by storeUfsDirInit().  If this returns < 0, * then Squid exits, complains about swap directories not * existing, and instructs the admin to run 'squid -z' */static intstoreUfsDirVerifyCacheDirs(SwapDir * sd){    ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata;    int j;    const char *path = sd->path;    if (storeUfsDirVerifyDirectory(path) < 0)	return -1;    for (j = 0; j < ufsinfo->l1; j++) {	path = storeUfsDirSwapSubDir(sd, j);	if (storeUfsDirVerifyDirectory(path) < 0)	    return -1;    }    return 0;}static voidstoreUfsDirCreateSwapSubDirs(SwapDir * sd){    ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata;    int i, k;    int should_exist;    LOCAL_ARRAY(char, name, MAXPATHLEN);    for (i = 0; i < ufsinfo->l1; i++) {	snprintf(name, MAXPATHLEN, "%s/%02X", sd->path, i);	if (storeUfsDirCreateDirectory(name, 0))	    should_exist = 0;	else	    should_exist = 1;	debug(47, 1) ("Making directories in %s\n", name);	for (k = 0; k < ufsinfo->l2; k++) {	    snprintf(name, MAXPATHLEN, "%s/%02X/%02X", sd->path, i, k);	    storeUfsDirCreateDirectory(name, should_exist);	}    }}static char *storeUfsDirSwapLogFile(SwapDir * sd, const char *ext){    LOCAL_ARRAY(char, path, SQUID_MAXPATHLEN);    LOCAL_ARRAY(char, pathtmp, SQUID_MAXPATHLEN);    LOCAL_ARRAY(char, digit, 32);    char *pathtmp2;    if (Config.Log.swap) {	xstrncpy(pathtmp, sd->path, SQUID_MAXPATHLEN - 64);	pathtmp2 = pathtmp;	while ((pathtmp2 = strchr(pathtmp2, '/')) != NULL)	    *pathtmp2 = '.';	while (strlen(pathtmp) && pathtmp[strlen(pathtmp) - 1] == '.')	    pathtmp[strlen(pathtmp) - 1] = '\0';	for (pathtmp2 = pathtmp; *pathtmp2 == '.'; pathtmp2++);	snprintf(path, SQUID_MAXPATHLEN - 64, Config.Log.swap, pathtmp2);	if (strncmp(path, Config.Log.swap, SQUID_MAXPATHLEN - 64) == 0) {	    strcat(path, ".");	    snprintf(digit, 32, "%02d", sd->index);	    strncat(path, digit, 3);	}    } else {	xstrncpy(path, sd->path, SQUID_MAXPATHLEN - 64);	strcat(path, "/swap.state");    }    if (ext)	strncat(path, ext, 16);    return path;}static voidstoreUfsDirOpenSwapLog(SwapDir * sd){    ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata;    char *path;    int fd;    path = storeUfsDirSwapLogFile(sd, NULL);    if (ufsinfo->swaplog_fd >= 0) {	debug(50, 1) ("storeUfsDirOpenSwapLog: %s already open\n", path);	return;    }    fd = file_open(path, O_WRONLY | O_CREAT | O_BINARY);    if (fd < 0) {	debug(50, 1) ("%s: %s\n", path, xstrerror());	fatal("storeUfsDirOpenSwapLog: Failed to open swap log.");    }    debug(50, 3) ("Cache Dir #%d log opened on FD %d\n", sd->index, fd);    ufsinfo->swaplog_fd = fd;    if (0 == n_ufs_dirs)	assert(NULL == ufs_dir_index);    n_ufs_dirs++;    assert(n_ufs_dirs <= Config.cacheSwap.n_configured);}static voidstoreUfsDirCloseSwapLog(SwapDir * sd){    ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata;    if (ufsinfo->swaplog_fd < 0)	/* not open */	return;    file_close(ufsinfo->swaplog_fd);    debug(47, 3) ("Cache Dir #%d log closed on FD %d\n",	sd->index, ufsinfo->swaplog_fd);    ufsinfo->swaplog_fd = -1;    n_ufs_dirs--;    assert(n_ufs_dirs >= 0);    if (0 == n_ufs_dirs)	safe_free(ufs_dir_index);}static voidstoreUfsCheckConfig(SwapDir * sd){    if (!opt_create_swap_dirs)	requirePathnameExists("cache_dir", sd->path);}static voidstoreUfsDirInit(SwapDir * sd){    static int started_clean_event = 0;    static const char *errmsg =    "\tFailed to verify one of the swap directories, Check cache.log\n"    "\tfor details.  Run 'squid -z' to create swap directories\n"    "\tif needed, or if running Squid for the first time.";    storeUfsDirInitBitmap(sd);    if (storeUfsDirVerifyCacheDirs(sd) < 0)	fatal(errmsg);    storeUfsDirOpenSwapLog(sd);    storeUfsDirRebuild(sd);    if (!started_clean_event) {	eventAdd("storeDirClean", storeUfsDirCleanEvent, NULL, 15.0, 1);	started_clean_event = 1;    }    (void) storeDirGetBlkSize(sd->path, &sd->fs.blksize);}static voidstoreUfsDirRebuildComplete(RebuildState * rb){    if (rb->log) {	debug(47, 1) ("Done reading %s swaplog (%d entries)\n",	    rb->sd->path, rb->n_read);	fclose(rb->log);	rb->log = NULL;    } else {	debug(47, 1) ("Done scanning %s (%d entries)\n",	    rb->sd->path, rb->counts.scancount);    }    store_dirs_rebuilding--;    storeUfsDirCloseTmpSwapLog(rb->sd);    storeRebuildComplete(&rb->counts);    cbdataFree(rb);}static voidstoreUfsDirRebuildFromDirectory(void *data){    RebuildState *rb = data;    SwapDir *SD = rb->sd;    LOCAL_ARRAY(char, hdr_buf, SM_PAGE_SIZE);    StoreEntry *e = NULL;    StoreEntry tmpe;    cache_key key[MD5_DIGEST_CHARS];    sfileno filn = 0;    int count;    int size;    struct stat sb;    int swap_hdr_len;    int fd = -1;    tlv *tlv_list;    tlv *t;    assert(rb != NULL);    debug(47, 3) ("storeUfsDirRebuildFromDirectory: DIR #%d\n", rb->sd->index);    for (count = 0; count < rb->speed; count++) {	assert(fd == -1);	fd = storeUfsDirGetNextFile(rb, &filn, &size);	if (fd == -2) {	    storeUfsDirRebuildComplete(rb);	    return;	} else if (fd < 0) {	    continue;	}	assert(fd > -1);	/* lets get file stats here */	if (fstat(fd, &sb) < 0) {	    debug(47, 1) ("storeUfsDirRebuildFromDirectory: fstat(FD %d): %s\n",		fd, xstrerror());	    file_close(fd);	    store_open_disk_fd--;	    fd = -1;	    continue;	}	if ((++rb->counts.scancount & 0xFFFF) == 0)	    debug(47, 3) ("  %s %7d files opened so far.\n",		rb->sd->path, rb->counts.scancount);	debug(47, 9) ("file_in: fd=%d %08X\n", fd, filn);	statCounter.syscalls.disk.reads++;	if (FD_READ_METHOD(fd, hdr_buf, SM_PAGE_SIZE) < 0) {	    debug(47, 1) ("storeUfsDirRebuildFromDirectory: read(FD %d): %s\n",		fd, xstrerror());	    file_close(fd);	    store_open_disk_fd--;	    fd = -1;	    continue;	}	file_close(fd);	store_open_disk_fd--;	fd = -1;	swap_hdr_len = 0;#if USE_TRUNCATE	if (sb.st_size == 0)	    continue;#endif	tlv_list = storeSwapMetaUnpack(hdr_buf, &swap_hdr_len);	if (tlv_list == NULL) {	    debug(47, 1) ("storeUfsDirRebuildFromDirectory: failed to get meta data\n");	    /* XXX shouldn't this be a call to storeUfsUnlink ? */	    storeUfsDirUnlinkFile(SD, filn);	    continue;	}	debug(47, 3) ("storeUfsDirRebuildFromDirectory: successful swap meta unpacking\n");	memset(key, '\0', MD5_DIGEST_CHARS);	memset(&tmpe, '\0', sizeof(StoreEntry));	for (t = tlv_list; t; t = t->next) {	    switch (t->type) {	    case STORE_META_KEY:		assert(t->length == MD5_DIGEST_CHARS);		xmemcpy(key, t->value, MD5_DIGEST_CHARS);		break;#if SIZEOF_SQUID_FILE_SZ == SIZEOF_SIZE_T	    case STORE_META_STD:		assert(t->length == STORE_HDR_METASIZE);		xmemcpy(&tmpe.timestamp, t->value, STORE_HDR_METASIZE);		break;#else	    case STORE_META_STD_LFS:		assert(t->length == STORE_HDR_METASIZE);		xmemcpy(&tmpe.timestamp, t->value, STORE_HDR_METASIZE);		break;	    case STORE_META_STD:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品久久一线不卡| 国产成人免费高清| 国产精品1区2区3区在线观看| 日本韩国精品一区二区在线观看| 欧美一区中文字幕| 一区二区成人在线视频 | 亚洲女与黑人做爰| 蜜臀av在线播放一区二区三区| 99久久综合精品| 久久网这里都是精品| 性欧美疯狂xxxxbbbb| 91丝袜高跟美女视频| 欧美高清在线视频| 九色|91porny| 日韩欧美一区电影| 亚洲va国产va欧美va观看| 国产jizzjizz一区二区| 日韩三级高清在线| 日精品一区二区三区| 在线观看免费一区| 一区二区三区**美女毛片| 成人av网站在线| 中文字幕第一页久久| 国产美女久久久久| 精品入口麻豆88视频| 美腿丝袜亚洲三区| 欧美一级片免费看| 日本午夜精品视频在线观看 | 一区二区三区在线看| 成人av网站在线| 一色桃子久久精品亚洲| 成人毛片视频在线观看| 欧美激情一区二区三区蜜桃视频 | 色久优优欧美色久优优| 自拍偷在线精品自拍偷无码专区 | 夜夜嗨av一区二区三区| 欧美中文字幕一区| 同产精品九九九| 欧美一卡二卡在线| 老色鬼精品视频在线观看播放| 日韩精品自拍偷拍| 国产一区二区在线视频| 国产亚洲午夜高清国产拍精品| 国产麻豆一精品一av一免费| 久久久综合网站| www.激情成人| 一区二区三区精密机械公司| 色噜噜夜夜夜综合网| 午夜欧美视频在线观看| 欧美tk—视频vk| 成人性生交大片免费看视频在线| 国产精品毛片久久久久久久| 色吧成人激情小说| 免费人成精品欧美精品| 久久精品一区蜜桃臀影院| 99久精品国产| 日韩精品午夜视频| 久久久久国产精品厨房| 色婷婷综合久久久久中文一区二区| 亚洲国产精品视频| 久久久久成人黄色影片| 色噜噜狠狠成人网p站| 美日韩一级片在线观看| 国产欧美在线观看一区| 在线观看视频91| 国产一区二区三区四| 一二三四社区欧美黄| 精品欧美乱码久久久久久| av一本久道久久综合久久鬼色| 午夜私人影院久久久久| 久久久99精品免费观看| 在线免费观看日本一区| 久久精品噜噜噜成人av农村| 亚洲日本在线观看| 欧美大片拔萝卜| 色综合夜色一区| 精油按摩中文字幕久久| 亚洲欧美福利一区二区| 精品国产伦一区二区三区观看体验| 色婷婷亚洲精品| 国产一区二区看久久| 亚洲成人资源在线| 中文字幕一区二区三区蜜月| 欧美电影免费观看高清完整版 | 天天综合天天做天天综合| 欧美激情一区在线观看| 日韩欧美不卡一区| 欧美午夜电影一区| 99国产欧美另类久久久精品| 国产一区二区三区在线观看免费| 亚洲成年人影院| 亚洲柠檬福利资源导航| 国产三级欧美三级| 欧美成人精精品一区二区频| 欧美群妇大交群中文字幕| 91在线精品秘密一区二区| 国产精品538一区二区在线| 日韩avvvv在线播放| 一级精品视频在线观看宜春院| 国产欧美久久久精品影院| 精品人伦一区二区色婷婷| 在线播放/欧美激情| 日本丰满少妇一区二区三区| 99国内精品久久| 成人av集中营| 成人免费视频国产在线观看| 国内外成人在线视频| 久久99精品久久久久久| 免费精品视频在线| 日本成人中文字幕在线视频| 偷拍日韩校园综合在线| 午夜精品福利一区二区蜜股av | 在线不卡的av| 欧美日韩一区二区在线观看| 在线观看欧美精品| 欧美体内she精高潮| 欧美三级资源在线| 欧美日韩国产bt| 91精品欧美久久久久久动漫| 欧美精品乱人伦久久久久久| 3d动漫精品啪啪| 欧美一区二区三区视频在线观看 | 国产一区二区视频在线| 国产精品一二三区| 风流少妇一区二区| 91在线小视频| 欧美日韩中文另类| 欧美一区二区三区在线观看视频 | 欧美一区二区免费观在线| 777奇米成人网| 欧美成人乱码一区二区三区| 国产亚洲一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 亚洲综合小说图片| 日本免费新一区视频| 国产一二精品视频| 99久久er热在这里只有精品15| 欧美午夜电影在线播放| 欧美电影免费观看高清完整版在线 | 久久综合狠狠综合久久综合88| 日本一区二区三区免费乱视频| 亚洲免费在线看| 免费观看久久久4p| www.性欧美| 在线成人高清不卡| 国产日韩欧美高清在线| 一区二区三区精品视频| 麻豆91在线播放| 91免费精品国自产拍在线不卡| 91麻豆精品国产91久久久资源速度 | 久久五月婷婷丁香社区| 亚洲靠逼com| 玖玖九九国产精品| 色综合久久久久综合| 日韩欧美国产午夜精品| 亚洲欧洲另类国产综合| 青青草精品视频| 色综合久久久久网| 久久久久久夜精品精品免费| 亚洲一级二级三级| 豆国产96在线|亚洲| 欧美日韩不卡一区二区| 国产精品美女久久福利网站| 毛片不卡一区二区| 欧美影院一区二区| 国产亚洲成年网址在线观看| 五月激情综合网| eeuss鲁片一区二区三区 | 中文字幕中文字幕在线一区 | 亚洲一区二区三区三| 成人精品亚洲人成在线| 日韩一区二区三区视频| 亚洲一级二级三级在线免费观看| 成人手机电影网| 日韩精品一区二区三区在线 | 99免费精品在线观看| 精品日韩欧美在线| 五月开心婷婷久久| 色综合夜色一区| 国产精品福利一区| 国内精品伊人久久久久影院对白| 欧美日本一区二区| 亚洲在线视频免费观看| 一本大道综合伊人精品热热| 国产精品视频一二三区 | 精一区二区三区| 7777精品伊人久久久大香线蕉 | 国产精品99久久久久久久vr| 欧美sm美女调教| 六月丁香综合在线视频| 欧美一级电影网站| 亚洲成人777| 在线不卡免费av| 蜜臀久久99精品久久久久宅男| 欧美日本在线视频| 亚洲成av人片一区二区三区| 欧美午夜精品一区| 亚洲成人av福利| 日韩三区在线观看| 久88久久88久久久|