📄 main.c
字号:
/* * $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 + -