亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美mv日韩mv国产网站app| 国产亚洲精品aa| 久久久国产一区二区三区四区小说| 久久久久久99久久久精品网站| 国产日韩精品视频一区| 亚洲一区视频在线| 粉嫩aⅴ一区二区三区四区| 欧美人动与zoxxxx乱| 国产精品欧美久久久久无广告| 日本午夜一本久久久综合| 色哟哟一区二区| 中文在线资源观看网站视频免费不卡| 午夜精品久久久久久久99樱桃 | 久久尤物电影视频在线观看| 亚洲精品久久嫩草网站秘色| 国产成人精品免费在线| 欧美日韩一级大片网址| 亚洲乱码国产乱码精品精可以看| 国产一区二区三区久久悠悠色av| 91精品国产高清一区二区三区蜜臀 | 欧美国产综合色视频| 麻豆成人av在线| 制服丝袜中文字幕亚洲| 亚洲二区在线观看| 91免费在线视频观看| 成人欧美一区二区三区1314| 成人一级片网址| 国产欧美精品一区二区色综合| 久久99国产精品久久99| 欧美va亚洲va在线观看蝴蝶网| 性做久久久久久| 欧美午夜电影网| 丝袜亚洲另类欧美| 欧美精品色综合| 天堂精品中文字幕在线| 欧美人妇做爰xxxⅹ性高电影| 亚洲成人中文在线| 欧美精品黑人性xxxx| 青草国产精品久久久久久| 91麻豆精品国产综合久久久久久| 亚洲成人在线免费| 欧美一区二区三区人| 麻豆国产精品777777在线| 久久新电视剧免费观看| 成人综合婷婷国产精品久久免费| 国产女主播一区| 一本大道av伊人久久综合| 午夜影院在线观看欧美| 欧美一区2区视频在线观看| 国内精品免费**视频| 亚洲国产精品精华液2区45| 99国产欧美久久久精品| 亚洲一区二区三区不卡国产欧美| 欧美日韩免费一区二区三区| 视频在线观看一区二区三区| 欧美电影免费观看高清完整版在线 | 欧美精品一区在线观看| 丁香另类激情小说| 亚洲亚洲人成综合网络| 91精品国产一区二区三区| 国产一区福利在线| 亚洲黄网站在线观看| 884aa四虎影成人精品一区| 国产麻豆9l精品三级站| 一区二区在线观看视频| 日韩情涩欧美日韩视频| 91丨九色丨蝌蚪丨老版| 免费观看一级特黄欧美大片| 国产欧美一区二区精品忘忧草| 色av综合在线| 久草热8精品视频在线观看| 亚洲男人都懂的| 日韩欧美在线网站| 91在线一区二区| 精品一区二区三区久久久| 国产精品三级电影| 欧美一级欧美三级在线观看| 粉嫩久久99精品久久久久久夜| 亚洲高清在线视频| 久久久久久久久99精品| 精品视频在线免费观看| 国产成人在线影院| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品情趣视频| 日韩精品一区二区三区视频在线观看| a亚洲天堂av| 激情亚洲综合在线| 一区二区三区视频在线观看| 久久五月婷婷丁香社区| 69成人精品免费视频| 99re这里都是精品| 国产精品亚洲第一区在线暖暖韩国 | 国产精品乱码人人做人人爱| 欧美色综合天天久久综合精品| 国产成人aaaa| 激情综合五月天| 日韩av中文在线观看| 一区二区成人在线视频| 亚洲视频一二区| 日本一区二区不卡视频| 国产午夜亚洲精品不卡| 日韩欧美一级精品久久| 91精品国产综合久久久久久久| 色女孩综合影院| 色综合天天视频在线观看| 国产精品123区| 国产一区二区三区免费播放| 日韩精品国产欧美| 亚洲第一久久影院| 午夜视频在线观看一区二区| 亚洲伦理在线免费看| 亚洲人精品一区| 亚洲激情自拍偷拍| 亚洲久本草在线中文字幕| 成人免费在线播放视频| 成人欧美一区二区三区小说| 亚洲天堂av老司机| 亚洲精品中文字幕乱码三区| 亚洲黄一区二区三区| 亚洲成人免费电影| 日韩电影在线免费观看| 男人的天堂亚洲一区| 奇米精品一区二区三区在线观看 | 亚洲国产综合色| 亚洲成人一区在线| 日韩av高清在线观看| 毛片av中文字幕一区二区| 国产中文一区二区三区| 丁香亚洲综合激情啪啪综合| 成人性生交大片免费| 91啦中文在线观看| 欧美美女直播网站| 久久尤物电影视频在线观看| 欧美激情一区二区三区蜜桃视频| 综合色天天鬼久久鬼色| 香蕉久久夜色精品国产使用方法| 久久精品国产精品亚洲红杏| 丁香婷婷综合色啪| 欧美性一级生活| 欧美大尺度电影在线| 国产欧美一区二区精品忘忧草| 亚洲猫色日本管| 美女国产一区二区| 波多野洁衣一区| 欧美日韩国产大片| 久久精品在这里| 亚洲综合在线免费观看| 久草精品在线观看| 91欧美一区二区| 精品国产一区二区三区不卡 | 精品一区免费av| 99视频精品在线| 日韩网站在线看片你懂的| 国产精品视频线看| 蜜桃视频一区二区三区| 99视频热这里只有精品免费| 制服视频三区第一页精品| 欧美国产乱子伦| 日本在线观看不卡视频| 成人精品一区二区三区四区| 欧美日韩成人综合天天影院| 国产日韩欧美精品在线| 日韩福利视频导航| 91免费观看视频| 国产视频911| 视频一区欧美精品| 91色在线porny| 精品国产露脸精彩对白| 亚洲444eee在线观看| 成人av电影免费观看| 日韩午夜精品视频| 五月天婷婷综合| 色综合天天综合| 中文字幕第一区第二区| 久久精品国产亚洲一区二区三区| 色综合 综合色| 中文字幕日韩一区二区| 国产大陆精品国产| 精品91自产拍在线观看一区| 视频一区二区三区中文字幕| 91黄视频在线| 国产精品理伦片| 成人黄色小视频在线观看| 亚洲精品一区二区三区影院 | 欧美成人免费网站| 爽好多水快深点欧美视频| 欧美在线你懂的| 国产精品乱码妇女bbbb| 粉嫩aⅴ一区二区三区四区五区 | 欧美制服丝袜第一页| 国产精品久久看| 成人综合在线观看| 中日韩av电影| 国产福利电影一区二区三区| 精品日韩一区二区三区免费视频| 丝袜美腿亚洲一区| 欧美一区午夜视频在线观看| 天堂蜜桃91精品| 日韩欧美资源站| 狠狠色丁香婷综合久久|