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

📄 main.c

📁 -
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * $Id: main.c,v 1.290.2.2 1999/05/10 16:30:37 wessels Exp $ * * DEBUG: section 1     Startup and Main Loop * AUTHOR: Harvest Derived * * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/ * ---------------------------------------------------------- * *  Squid is the result of efforts by numerous individuals from the *  Internet community.  Development is led by Duane Wessels of the *  National Laboratory for Applied Network Research and funded by the *  National Science Foundation.  Squid is Copyrighted (C) 1998 by *  Duane Wessels and the University of California San Diego.  Please *  see the COPYRIGHT file for full details.  Squid incorporates *  software developed and/or copyrighted by other sources.  Please 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"/* for error reporting from xmalloc and friends */extern void (*failure_notify) (const char *);static int opt_send_signal = -1;static int opt_no_daemon = 0;static int opt_parse_cfg_only = 0;static int httpPortNumOverride = 1;static int icpPortNumOverride = 1;	/* Want to detect "-u 0" */static int configured_once = 0;#if MALLOC_DBGstatic int malloc_debug_level = 0;#endifstatic volatile int do_reconfigure = 0;static volatile int do_rotate = 0;static volatile int do_shutdown = 0;static void mainRotate(void);static void mainReconfigure(void);static SIGHDLR rotate_logs;static SIGHDLR reconfigure;#if ALARM_UPDATES_TIMEstatic SIGHDLR time_tick;#endifstatic void mainInitialize(void);static void usage(void);static void mainParseOptions(int, char **);static void sendSignal(void);static void serverConnectionsOpen(void);static void watch_child(char **);static void setEffectiveUser(void);#if MEM_GEN_TRACEextern void log_trace_done();extern void log_trace_init(char *);#endifstatic EVH SquidShutdown;static void mainSetCwd(void);static voidusage(void){    fprintf(stderr,	"Usage: %s [-dhsvzCDFNRVYX] [-f config-file] [-[au] port] [-k signal]\n"	"       -a port   Specify HTTP port number (default: %d).\n"	"       -d level  Write debugging to stderr also.\n"	"       -f file   Use given config-file instead of\n"	"                 %s\n"	"       -h        Print help message.\n"	"       -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse\n"	"                 Parse configuration file, then send signal to \n"	"                 running copy (except -k parse) and exit.\n"	"       -s        Enable logging to syslog.\n"	"       -u port   Specify ICP port number (default: %d), disable with 0.\n"	"       -v        Print version.\n"	"       -z        Create swap directories\n"	"       -C        Do not catch fatal signals.\n"	"       -D        Disable initial DNS tests.\n"	"       -F        Foreground fast store rebuild.\n"	"       -N        No daemon mode.\n"	"       -R        Do not set REUSEADDR on port.\n"	"       -V        Virtual host httpd-accelerator.\n"	"       -X        Force full debugging.\n"	"       -Y        Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.\n",	appname, CACHE_HTTP_PORT, DefaultConfigFile, CACHE_ICP_PORT);    exit(1);}static voidmainParseOptions(int argc, char *argv[]){    extern char *optarg;    int c;    while ((c = getopt(argc, argv, "CDFNRSVYXa:d:f:hk:m::su:vz?")) != -1) {	switch (c) {	case 'C':	    opt_catch_signals = 0;	    break;	case 'D':	    opt_dns_tests = 0;	    break;	case 'F':	    opt_foreground_rebuild = 1;	    break;	case 'N':	    opt_no_daemon = 1;	    break;	case 'R':	    opt_reuseaddr = 0;	    break;	case 'S':	    opt_store_doublecheck = 1;	    break;	case 'V':	    vhost_mode = 1;	    break;	case 'X':	    /* force full debugging */	    sigusr2_handle(SIGUSR2);	    break;	case 'Y':	    opt_reload_hit_only = 1;	    break;	case 'a':	    httpPortNumOverride = atoi(optarg);	    break;	case 'd':	    opt_debug_stderr = atoi(optarg);	    break;	case 'f':	    xfree(ConfigFile);	    ConfigFile = xstrdup(optarg);	    break;	case 'h':	    usage();	    break;	case 'k':	    if ((int) strlen(optarg) < 1)		usage();	    if (!strncmp(optarg, "reconfigure", strlen(optarg)))		opt_send_signal = SIGHUP;	    else if (!strncmp(optarg, "rotate", strlen(optarg)))#ifdef _SQUID_LINUX_THREADS_		opt_send_signal = SIGQUIT;#else		opt_send_signal = SIGUSR1;#endif	    else if (!strncmp(optarg, "debug", strlen(optarg)))#ifdef _SQUID_LINUX_THREADS_		opt_send_signal = SIGTRAP;#else		opt_send_signal = SIGUSR2;#endif	    else if (!strncmp(optarg, "shutdown", strlen(optarg)))		opt_send_signal = SIGTERM;	    else if (!strncmp(optarg, "interrupt", strlen(optarg)))		opt_send_signal = SIGINT;	    else if (!strncmp(optarg, "kill", strlen(optarg)))		opt_send_signal = SIGKILL;	    else if (!strncmp(optarg, "check", strlen(optarg)))		opt_send_signal = 0;	/* SIGNULL */	    else if (!strncmp(optarg, "parse", strlen(optarg)))		opt_parse_cfg_only = 1;		/* parse cfg file only */	    else		usage();	    break;	case 'm':	    if (optarg) {#if MALLOC_DBG		malloc_debug_level = atoi(optarg);		/* NOTREACHED */		break;#else		fatal("Need to add -DMALLOC_DBG when compiling to use -mX option");		/* NOTREACHED */#endif	    } else {#if XMALLOC_TRACE		xmalloc_trace = !xmalloc_trace;#else		fatal("Need to configure --enable-xmalloc-debug-trace to use -m option");#endif	    }	case 's':	    opt_syslog_enable = 1;	    break;	case 'u':	    icpPortNumOverride = atoi(optarg);	    if (icpPortNumOverride < 0)		icpPortNumOverride = 0;	    break;	case 'v':	    printf("Squid Cache: Version %s\n", version_string);	    exit(0);	    /* NOTREACHED */	case 'z':	    opt_create_swap_dirs = 1;	    break;	case '?':	default:	    usage();	    break;	}    }}/* ARGSUSED */static voidrotate_logs(int sig){    do_rotate = 1;#if !HAVE_SIGACTION    signal(sig, rotate_logs);#endif}#if ALARM_UPDATES_TIMEstatic voidtime_tick(int sig){    getCurrentTime();    alarm(1);#if !HAVE_SIGACTION    signal(sig, time_tick);#endif}#endif/* ARGSUSED */static voidreconfigure(int sig){    do_reconfigure = 1;#if !HAVE_SIGACTION    signal(sig, reconfigure);#endif}voidshut_down(int sig){    do_shutdown = sig == SIGINT ? -1 : 1;#ifdef KILL_PARENT_OPT    if (getppid() > 1) {	debug(1, 1) ("Killing RunCache, pid %d\n", getppid());	kill(getppid(), sig);    }#endif#if SA_RESETHAND == 0    signal(SIGTERM, SIG_DFL);    signal(SIGINT, SIG_DFL);#endif}static voidserverConnectionsOpen(void){    clientHttpConnectionsOpen();    icpConnectionsOpen();#if USE_HTCP    htcpInit();#endif#ifdef SQUID_SNMP    snmpConnectionOpen();#endif    clientdbInit();    icmpOpen();    netdbInit();    asnInit();    peerSelectInit();#if USE_CARP    carpInit();#endif}voidserverConnectionsClose(void){    assert(shutting_down || reconfiguring);    clientHttpConnectionsClose();    icpConnectionShutdown();#if USE_HTCP    htcpSocketShutdown();#endif    icmpClose();#ifdef SQUID_SNMP    snmpConnectionShutdown();#endif    asnFreeMemory();}static voidmainReconfigure(void){    debug(1, 1) ("Restarting Squid Cache (version %s)...\n", version_string);    reconfiguring = 1;    /* Already called serverConnectionsClose and ipcacheShutdownServers() */    serverConnectionsClose();    icpConnectionClose();#if USE_HTCP    htcpSocketClose();#endif#ifdef SQUID_SNMP    snmpConnectionClose();#endif    dnsShutdown();    redirectShutdown();    authenticateShutdown();    storeDirCloseSwapLogs();    errorClean();    parseConfigFile(ConfigFile);    _db_init(Config.Log.log, Config.debugOptions);    ipcache_restart();		/* clear stuck entries */    fqdncache_restart();	/* sigh, fqdncache too */    errorInitialize();		/* reload error pages */    dnsInit();    redirectInit();    authenticateInit();    serverConnectionsOpen();    if (theOutIcpConnection >= 0) {	if (!Config2.Accel.on || Config.onoff.accel_with_proxy)	    neighbors_open(theOutIcpConnection);	else	    debug(1, 1) ("ICP port disabled in httpd_accelerator mode\n");    }    storeDirOpenSwapLogs();    writePidFile();		/* write PID file */    debug(1, 1) ("Ready to serve requests.\n");    reconfiguring = 0;}static voidmainRotate(void){    icmpClose();    _db_rotate_log();		/* cache.log */    storeDirWriteCleanLogs(1);    storeLogRotate();		/* store.log */    accessLogRotate();		/* access.log */    useragentRotateLog();	/* useragent.log */    icmpOpen();}static voidsetEffectiveUser(void){    leave_suid();		/* Run as non privilegied user */#ifdef _SQUID_OS2_    return;#endif    if (geteuid() == 0) {	debug(0, 0) ("Squid is not safe to run as root!  If you must\n");	debug(0, 0) ("start Squid as root, then you must configure\n");	debug(0, 0) ("it to run as a non-priveledged user with the\n");	debug(0, 0) ("'cache_effective_user' option in the config file.\n");	fatal("Don't run Squid as root, set 'cache_effective_user'!");    }}static voidmainSetCwd(void){    if (Config.coredump_dir) {	if (!chdir(Config.coredump_dir)) {	    debug(0, 1) ("Set Current Directory to %s\n", Config.coredump_dir);	    return;	} else {	    debug(50, 0) ("chdir: %s: %s\n", Config.coredump_dir, xstrerror());	}    }    if (!Config.effectiveUser) {	char *p = getcwd(NULL, 0);	debug(0, 1) ("Current Directory is %s\n", p);	xfree(p);	return;    }    /* we were probably started as root, so cd to a swap     * directory in case we dump core */    if (!chdir(storeSwapDir(0))) {	debug(0, 1) ("Set Current Directory to %s\n", storeSwapDir(0));	return;    } else {	debug(50, 0) ("%s: %s\n", storeSwapDir(0), xstrerror());	fatal_dump("Cannot cd to swap directory?");    }}static voidmainInitialize(void){    if (opt_catch_signals) {	squid_signal(SIGSEGV, death, SA_NODEFER | SA_RESETHAND);	squid_signal(SIGBUS, death, SA_NODEFER | SA_RESETHAND);    }    squid_signal(SIGPIPE, SIG_IGN, SA_RESTART);    squid_signal(SIGCHLD, sig_child, SA_NODEFER | SA_RESTART);

⌨️ 快捷键说明

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