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

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

?? store_dir_diskd.c

?? 代理服務器 squid-2.6.STABLE16
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* * $Id: store_dir_diskd.c,v 1.87.2.1 2007/03/03 13:34:51 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 <sys/ipc.h>#include <sys/msg.h>#include <sys/shm.h>#include "store_diskd.h"#define DefaultLevelOneDirs     16#define DefaultLevelTwoDirs     256#define STORE_META_BDISKDZ 4096diskd_stats_t diskd_stats;typedef 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_diskd_dirs = 0;static int *diskd_dir_index = NULL;MemPool *diskd_state_pool = NULL;static int diskd_initialised = 0;static char *storeDiskdDirSwapSubDir(SwapDir *, int subdirn);static int storeDiskdDirCreateDirectory(const char *path, int);static int storeDiskdDirVerifyCacheDirs(SwapDir *);static int storeDiskdDirVerifyDirectory(const char *path);static void storeDiskdDirCreateSwapSubDirs(SwapDir *);static char *storeDiskdDirSwapLogFile(SwapDir *, const char *);static EVH storeDiskdDirRebuildFromDirectory;static EVH storeDiskdDirRebuildFromSwapLog;static int storeDiskdDirGetNextFile(RebuildState *, sfileno *, int *size);static StoreEntry *storeDiskdDirAddDiskRestore(SwapDir * SD, const cache_key * key,    sfileno 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 storeDiskdDirRebuild(SwapDir * sd);static void storeDiskdDirCloseTmpSwapLog(SwapDir * sd);static FILE *storeDiskdDirOpenTmpSwapLog(SwapDir *, int *, int *);static STLOGOPEN storeDiskdDirOpenSwapLog;static STINIT storeDiskdDirInit;static STCHECKCONFIG storeDiskdCheckConfig;static STFREE storeDiskdDirFree;static STLOGCLEANSTART storeDiskdDirWriteCleanStart;static STLOGCLEANNEXTENTRY storeDiskdDirCleanLogNextEntry;static STLOGCLEANWRITE storeDiskdDirWriteCleanEntry;static STLOGCLEANDONE storeDiskdDirWriteCleanDone;static STLOGCLOSE storeDiskdDirCloseSwapLog;static STLOGWRITE storeDiskdDirSwapLog;static STNEWFS storeDiskdDirNewfs;static STDUMP storeDiskdDirDump;static STMAINTAINFS storeDiskdDirMaintain;static STCHECKOBJ storeDiskdDirCheckObj;static STCHECKLOADAV storeDiskdDirCheckLoadAv;static STREFOBJ storeDiskdDirRefObj;static STUNREFOBJ storeDiskdDirUnrefObj;static QS rev_int_sort;static int storeDiskdDirClean(int swap_index);static EVH storeDiskdDirCleanEvent;static int storeDiskdDirIs(SwapDir * sd);static int storeDiskdFilenoBelongsHere(int fn, int F0, int F1, int F2);static int storeDiskdCleanupDoubleCheck(SwapDir *, StoreEntry *);static void storeDiskdDirStats(SwapDir *, StoreEntry *);static void storeDiskdDirInitBitmap(SwapDir *);static int storeDiskdDirValidFileno(SwapDir *, sfileno, int);static void storeDiskdStats(StoreEntry * sentry);static void storeDiskdDirSync(SwapDir *);/* The only externally visible interface */STSETUP storeFsSetup_diskd;/* * These functions were ripped straight out of the heart of store_dir.c. * They assume that the given filenum is on a diskd partiton, which may or * may not be true..  * XXX this evilness should be tidied up at a later date! */static intstoreDiskdDirMapBitTest(SwapDir * SD, sfileno filn){    diskdinfo_t *diskdinfo;    diskdinfo = SD->fsdata;    return file_map_bit_test(diskdinfo->map, filn);}static voidstoreDiskdDirMapBitSet(SwapDir * SD, sfileno filn){    diskdinfo_t *diskdinfo;    diskdinfo = SD->fsdata;    file_map_bit_set(diskdinfo->map, filn);}voidstoreDiskdDirMapBitReset(SwapDir * SD, sfileno filn){    diskdinfo_t *diskdinfo;    diskdinfo = 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(diskdinfo->map, filn))	file_map_bit_reset(diskdinfo->map, filn);}intstoreDiskdDirMapBitAllocate(SwapDir * SD){    diskdinfo_t *diskdinfo = SD->fsdata;    int fn;    fn = file_map_allocate(diskdinfo->map, diskdinfo->suggest);    file_map_bit_set(diskdinfo->map, fn);    diskdinfo->suggest = fn + 1;    return fn;}/* * Initialise the diskd 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 voidstoreDiskdDirInitBitmap(SwapDir * sd){    diskdinfo_t *diskdinfo = sd->fsdata;    if (diskdinfo->map == NULL) {	/* First time */	diskdinfo->map = file_map_create();    } else if (diskdinfo->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 *storeDiskdDirSwapSubDir(SwapDir * sd, int subdirn){    diskdinfo_t *diskdinfo = sd->fsdata;    LOCAL_ARRAY(char, fullfilename, SQUID_MAXPATHLEN);    assert(0 <= subdirn && subdirn < diskdinfo->l1);    snprintf(fullfilename, SQUID_MAXPATHLEN, "%s/%02X", sd->path, subdirn);    return fullfilename;}static intstoreDiskdDirCreateDirectory(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(20, should_exist ? 3 : 1) ("%s exists\n", path);	} else {	    fatalf("Swap directory %s is not a directory.", path);	}    } else if (0 == mkdir(path, 0755)) {	debug(20, should_exist ? 1 : 3) ("%s created\n", path);	created = 1;    } else {	fatalf("Failed to make swap directory %s: %s",	    path, xstrerror());    }    return created;}static intstoreDiskdDirVerifyDirectory(const char *path){    struct stat sb;    if (stat(path, &sb) < 0) {	debug(20, 0) ("%s: %s\n", path, xstrerror());	return -1;    }    if (S_ISDIR(sb.st_mode) == 0) {	debug(20, 0) ("%s is not a directory\n", path);	return -1;    }    return 0;}/* * This function is called by storeDiskdDirInit().  If this returns < 0, * then Squid exits, complains about swap directories not * existing, and instructs the admin to run 'squid -z' */static intstoreDiskdDirVerifyCacheDirs(SwapDir * sd){    diskdinfo_t *diskdinfo = sd->fsdata;    int j;    const char *path = sd->path;    if (storeDiskdDirVerifyDirectory(path) < 0)	return -1;    for (j = 0; j < diskdinfo->l1; j++) {	path = storeDiskdDirSwapSubDir(sd, j);	if (storeDiskdDirVerifyDirectory(path) < 0)	    return -1;    }    return 0;}static voidstoreDiskdDirCreateSwapSubDirs(SwapDir * sd){    diskdinfo_t *diskdinfo = sd->fsdata;    int i, k;    int should_exist;    LOCAL_ARRAY(char, name, MAXPATHLEN);    for (i = 0; i < diskdinfo->l1; i++) {	snprintf(name, MAXPATHLEN, "%s/%02X", sd->path, i);	if (storeDiskdDirCreateDirectory(name, 0))	    should_exist = 0;	else	    should_exist = 1;	debug(47, 1) ("Making directories in %s\n", name);	for (k = 0; k < diskdinfo->l2; k++) {	    snprintf(name, MAXPATHLEN, "%s/%02X/%02X", sd->path, i, k);	    storeDiskdDirCreateDirectory(name, should_exist);	}    }}static char *storeDiskdDirSwapLogFile(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 voidstoreDiskdDirOpenSwapLog(SwapDir * sd){    diskdinfo_t *diskdinfo = sd->fsdata;    char *path;    int fd;    path = storeDiskdDirSwapLogFile(sd, NULL);    fd = file_open(path, O_WRONLY | O_CREAT | O_BINARY);    if (fd < 0) {	debug(50, 1) ("%s: %s\n", path, xstrerror());	fatal("storeDiskdDirOpenSwapLog: Failed to open swap log.");    }    debug(47, 3) ("Cache Dir #%d log opened on FD %d\n", sd->index, fd);    diskdinfo->swaplog_fd = fd;    if (0 == n_diskd_dirs)	assert(NULL == diskd_dir_index);    n_diskd_dirs++;    assert(n_diskd_dirs <= Config.cacheSwap.n_configured);}static voidstoreDiskdDirCloseSwapLog(SwapDir * sd){    diskdinfo_t *diskdinfo = sd->fsdata;    if (diskdinfo->swaplog_fd < 0)	/* not open */	return;    file_close(diskdinfo->swaplog_fd);    debug(47, 3) ("Cache Dir #%d log closed on FD %d\n",	sd->index, diskdinfo->swaplog_fd);    diskdinfo->swaplog_fd = -1;    n_diskd_dirs--;    assert(n_diskd_dirs >= 0);    if (0 == n_diskd_dirs)	safe_free(diskd_dir_index);}static voidstoreDiskdCheckConfig(SwapDir * sd){    requirePathnameExists("diskd_program", Config.Program.diskd);    if (!opt_create_swap_dirs)	requirePathnameExists("cache_dir", sd->path);}static voiddiskdExited(int fd, void *unused){    fatal("diskd exited unexpectedly");}static voidstoreDiskdDirInit(SwapDir * sd){    static int started_clean_event = 0;    pid_t pid;    int i;    int ikey;    const char *args[5];    char skey1[32];    char skey2[32];    char skey3[32];    diskdinfo_t *diskdinfo = sd->fsdata;    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.";    ikey = (getpid() << 10) + (sd->index << 2);    ikey &= 0x7fffffff;    diskdinfo->smsgid = msgget((key_t) ikey, 0700 | IPC_CREAT);    if (diskdinfo->smsgid < 0) {	debug(50, 0) ("storeDiskdInit: msgget: %s\n", xstrerror());	fatal("msgget failed");    }    diskdinfo->rmsgid = msgget((key_t) (ikey + 1), 0700 | IPC_CREAT);    if (diskdinfo->rmsgid < 0) {	debug(50, 0) ("storeDiskdInit: msgget: %s\n", xstrerror());	fatal("msgget failed");    }    diskdinfo->shm.nbufs = diskdinfo->magic2 * 1.3;    diskdinfo->shm.id = shmget((key_t) (ikey + 2),	diskdinfo->shm.nbufs * SHMBUF_BLKSZ, 0600 | IPC_CREAT);    if (diskdinfo->shm.id < 0) {	debug(50, 0) ("storeDiskdInit: shmget: %s\n", xstrerror());	fatal("shmget failed");    }    diskdinfo->shm.buf = shmat(diskdinfo->shm.id, NULL, 0);    if (diskdinfo->shm.buf == (void *) -1) {	debug(50, 0) ("storeDiskdInit: shmat: %s\n", xstrerror());	fatal("shmat failed");    }    diskdinfo->shm.inuse_map = xcalloc((diskdinfo->shm.nbufs + 7) / 8, 1);    diskd_stats.shmbuf_count += diskdinfo->shm.nbufs;    for (i = 0; i < diskdinfo->shm.nbufs; i++) {	CBIT_SET(diskdinfo->shm.inuse_map, i);	storeDiskdShmPut(sd, i * SHMBUF_BLKSZ);    }    snprintf(skey1, 32, "%d", ikey);    snprintf(skey2, 32, "%d", ikey + 1);    snprintf(skey3, 32, "%d", ikey + 2);    args[0] = "diskd";    args[1] = skey1;    args[2] = skey2;    args[3] = skey3;    args[4] = NULL;    pid = ipcCreate(IPC_STREAM,	Config.Program.diskd,	args,	"diskd",	&diskdinfo->rfd,	&diskdinfo->wfd,	&diskdinfo->hIpc);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区四区五区中文 | 成人免费毛片嘿嘿连载视频| 婷婷综合五月天| 亚洲一二三区在线观看| 亚洲日本韩国一区| 亚洲免费观看在线视频| 亚洲视频一区二区免费在线观看| 国产精品久久久久久久蜜臀| 亚洲国产精品成人综合| 国产精品你懂的在线欣赏| 国产精品色哟哟网站| 亚洲精品视频一区| 亚洲成人在线网站| 日韩高清欧美激情| 久久99久久99| 99久久免费精品| 欧美亚洲日本国产| 欧美xxxxx牲另类人与| 久久品道一品道久久精品| 中文字幕中文字幕在线一区| 亚洲黄色免费电影| 美女性感视频久久| eeuss国产一区二区三区| 91久久精品午夜一区二区| 在线91免费看| 国产精品免费看片| 亚洲国产日韩a在线播放性色| 蜜臀av一区二区在线观看| 国产精品系列在线观看| 日本久久电影网| 久久网这里都是精品| 亚洲综合清纯丝袜自拍| 狠狠色综合日日| 欧洲视频一区二区| 久久久777精品电影网影网 | 欧美一区二区视频免费观看| 国产亚洲自拍一区| 亚洲一区二区三区四区的| 国产精品亚洲专一区二区三区| 91污在线观看| 久久久久久久久伊人| 日韩激情视频在线观看| 92精品国产成人观看免费| 欧美电影免费观看高清完整版在线 | 亚洲韩国精品一区| 国产91精品欧美| 日韩欧美国产一区二区在线播放| 亚洲视频在线一区二区| 国产美女一区二区| 日韩一区二区三区视频在线| 亚洲精品伦理在线| 不卡视频一二三四| 2021久久国产精品不只是精品| 亚洲国产色一区| 色噜噜偷拍精品综合在线| 中文久久乱码一区二区| 美脚の诱脚舐め脚责91 | 美脚の诱脚舐め脚责91| 欧美在线小视频| 亚洲天堂av老司机| 成人福利电影精品一区二区在线观看| 欧美二区乱c少妇| 午夜精品久久久久久久| 色老头久久综合| 亚洲激情图片一区| 91极品美女在线| 樱花草国产18久久久久| 色综合久久久久网| 亚洲视频中文字幕| 欧洲一区在线观看| 亚洲电影一级黄| 欧美日韩久久一区二区| 亚洲高清一区二区三区| 欧美日韩视频专区在线播放| 亚洲国产aⅴ成人精品无吗| 日本高清免费不卡视频| 一区二区三区四区视频精品免费 | 亚洲与欧洲av电影| 日本韩国欧美一区二区三区| 一区二区三区中文字幕电影| 欧美午夜一区二区| 日韩精品一级二级| 久久影音资源网| 99视频精品在线| 亚洲一区二区精品视频| 91精品国产一区二区三区蜜臀| 蜜桃传媒麻豆第一区在线观看| 精品99一区二区三区| 国产传媒欧美日韩成人| 亚洲国产精品黑人久久久| 色天使色偷偷av一区二区| 日韩二区三区四区| 久久久久国产精品麻豆ai换脸| 成人黄色777网| 亚洲成人在线免费| 欧美精品一区二区三区视频| 99视频国产精品| 日韩不卡一区二区三区| 久久久精品欧美丰满| 色成年激情久久综合| 麻豆国产精品777777在线| 国产天堂亚洲国产碰碰| 欧美吻胸吃奶大尺度电影| 精品无人区卡一卡二卡三乱码免费卡 | 奇米精品一区二区三区四区| 欧美本精品男人aⅴ天堂| 97久久精品人人澡人人爽| 日本午夜一区二区| 中文字幕一区二| 日韩欧美国产系列| 色婷婷久久99综合精品jk白丝| 精品一区二区三区影院在线午夜| 国产精品狼人久久影院观看方式| 欧美日韩国产在线播放网站| 国产成人av一区| 日韩黄色免费电影| 亚洲精品国产精品乱码不99| 精品国产一二三| 色欧美乱欧美15图片| 国产精品性做久久久久久| 视频一区二区国产| 亚洲欧洲日韩一区二区三区| 26uuu国产在线精品一区二区| 91丨九色丨国产丨porny| 精品中文字幕一区二区| 舔着乳尖日韩一区| 亚洲欧美日韩国产成人精品影院 | 精品国产乱子伦一区| 欧美视频日韩视频在线观看| 粉嫩aⅴ一区二区三区四区| 日韩专区中文字幕一区二区| 亚洲欧美日韩国产另类专区| 久久精品一二三| 精品免费国产二区三区| 欧美精品乱人伦久久久久久| 91毛片在线观看| av在线不卡观看免费观看| 国产一区二区三区综合| 久久精品国产77777蜜臀| 婷婷国产在线综合| 一区二区三区欧美亚洲| 一区精品在线播放| 国产精品乱码一区二区三区软件| 26uuu成人网一区二区三区| 欧美一区二区二区| 日韩三级视频中文字幕| 日韩欧美在线综合网| 日韩一区二区三区免费观看| 91精品国产综合久久久蜜臀图片| 欧美午夜免费电影| 欧美日韩精品一二三区| 欧美影片第一页| 欧美日韩一区三区四区| 欧美在线制服丝袜| 欧美一区在线视频| 日韩久久久精品| 久久欧美中文字幕| 国产精品国产自产拍高清av| 中文字幕五月欧美| 亚洲黄色免费电影| 日韩影院在线观看| 久久99国产精品麻豆| 国产精品自拍av| 成人白浆超碰人人人人| 一本色道久久综合亚洲aⅴ蜜桃| 色老头久久综合| 日韩午夜激情免费电影| 久久久久青草大香线综合精品| 国产人成一区二区三区影院| 亚洲日本在线天堂| 五月天亚洲精品| 国产精一区二区三区| 欧美日本乱大交xxxxx| 欧美一级夜夜爽| 国产精品久久三| 午夜av一区二区三区| 国内精品伊人久久久久av一坑| 成人小视频免费观看| 色欧美片视频在线观看在线视频| 制服丝袜激情欧洲亚洲| 国产亚洲人成网站| 亚洲国产aⅴ成人精品无吗| 韩国三级中文字幕hd久久精品| 91碰在线视频| 日韩欧美一级在线播放| 国产精品国产三级国产普通话三级| 亚洲高清不卡在线| 国产iv一区二区三区| 欧美久久婷婷综合色| 中文字幕乱码一区二区免费| 婷婷丁香久久五月婷婷| kk眼镜猥琐国模调教系列一区二区 | 99精品视频在线播放观看| 日韩一区二区免费高清| 日韩一区日韩二区| 国产一区二区三区四区五区入口| 91亚洲精品一区二区乱码| 精品久久久久久最新网址| 亚洲最大的成人av| 成人午夜大片免费观看|