From: Amos Jeffries Date: Fri, 24 Jan 2014 01:57:15 +0000 (-0700) Subject: Enable -n command line option for non-Windows Squid builds X-Git-Tag: SQUID_3_5_0_1~400 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cf2155f28a0333dc57adb63c537c3ea30cbf0344;p=thirdparty%2Fsquid.git Enable -n command line option for non-Windows Squid builds This command line option is used on Windows to name the service instance of Squid being run and/or managed. At this point it still only has useful effect on Windows, but can now be used by components on other systems as well. Show the running instance service name in cacehmgr and -v output. Also remove _WIN_SQUID_DEFAULT_SERVICE_NAME macro which duplicated the APP_SHORTNAME macro. This changes the Windows service name from Squid to squid (lower case) on future Squid-3 for Windows. --- diff --git a/src/WinSvc.cc b/src/WinSvc.cc index 815812a004..976ee9a8ac 100644 --- a/src/WinSvc.cc +++ b/src/WinSvc.cc @@ -510,7 +510,7 @@ int WIN32_Subsystem_Init(int * argc, char *** argv) return 1; /* Register the service Handler function */ - svcHandle = RegisterServiceCtrlHandler(WIN32_Service_name, WIN32_svcHandler); + svcHandle = RegisterServiceCtrlHandler(service_name, WIN32_svcHandler); if (svcHandle == 0) return 1; @@ -671,12 +671,12 @@ WIN32_RemoveService() SC_HANDLE schService; SC_HANDLE schSCManager; - if (!WIN32_Service_name) - WIN32_Service_name = xstrdup(_WIN_SQUID_DEFAULT_SERVICE_NAME); + if (!service_name) + service_name = xstrdup(APP_SHORTNAME); - strcat(REGKEY, WIN32_Service_name); + strcat(REGKEY, service_name); - keys[4] = WIN32_Service_name; + keys[4] = service_name; schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */ NULL, /* database (NULL == default) */ @@ -686,7 +686,7 @@ WIN32_RemoveService() if (!schSCManager) fprintf(stderr, "OpenSCManager failed\n"); else { - schService = OpenService(schSCManager, WIN32_Service_name, SERVICE_ALL_ACCESS); + schService = OpenService(schSCManager, service_name, SERVICE_ALL_ACCESS); if (schService == NULL) fprintf(stderr, "OpenService failed\n"); @@ -711,8 +711,7 @@ WIN32_RemoveService() if (DeleteService(schService) == 0) fprintf(stderr, "DeleteService failed.\n"); else - printf("Service %s deleted successfully.\n", - WIN32_Service_name); + printf("Service %s deleted successfully.\n", service_name); CloseServiceHandle(schService); } @@ -724,12 +723,12 @@ WIN32_RemoveService() void WIN32_SetServiceCommandLine() { - if (!WIN32_Service_name) - WIN32_Service_name = xstrdup(_WIN_SQUID_DEFAULT_SERVICE_NAME); + if (!service_name) + service_name = xstrdup(APP_SHORTNAME); - strcat(REGKEY, WIN32_Service_name); + strcat(REGKEY, service_name); - keys[4] = WIN32_Service_name; + keys[4] = service_name; /* Now store the Service Command Line in the registry */ WIN32_StoreKey(COMMANDLINE, REG_SZ, (unsigned char *) WIN32_Command_Line, strlen(WIN32_Command_Line) + 1); @@ -744,19 +743,19 @@ WIN32_InstallService() char szPath[512]; int lenpath; - if (!WIN32_Service_name) - WIN32_Service_name = xstrdup(_WIN_SQUID_DEFAULT_SERVICE_NAME); + if (!service_name) + service_name = xstrdup(APP_SHORTNAME); - strcat(REGKEY, WIN32_Service_name); + strcat(REGKEY, service_name); - keys[4] = WIN32_Service_name; + keys[4] = service_name; if ((lenpath = GetModuleFileName(NULL, ServicePath, 512)) == 0) { fprintf(stderr, "Can't get executable path\n"); exit(1); } - snprintf(szPath, sizeof(szPath), "%s %s:%s", ServicePath, _WIN_SQUID_SERVICE_OPTION, WIN32_Service_name); + snprintf(szPath, sizeof(szPath), "%s %s:%s", ServicePath, _WIN_SQUID_SERVICE_OPTION, service_name); schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */ NULL, /* database (NULL == default) */ SC_MANAGER_ALL_ACCESS /* access required */ @@ -767,8 +766,8 @@ WIN32_InstallService() exit(1); } else { schService = CreateService(schSCManager, /* SCManager database */ - WIN32_Service_name, /* name of service */ - WIN32_Service_name, /* name to display */ + service_name, /* name of service */ + service_name, /* name to display */ SERVICE_ALL_ACCESS, /* desired access */ SERVICE_WIN32_OWN_PROCESS, /* service type */ SERVICE_AUTO_START, /* start type */ @@ -801,15 +800,9 @@ WIN32_InstallService() WIN32_StoreKey(CONFIGFILE, REG_SZ, (unsigned char *) ConfigFile, strlen(ConfigFile) + 1); - printf("Squid Cache version %s for %s\n", version_string, - CONFIG_HOST_TYPE); - - printf("installed successfully as %s Windows System Service.\n", - WIN32_Service_name); - - printf - ("To run, start it from the Services Applet of Control Panel.\n"); - + printf("Squid Cache version %s for %s\n", version_string, CONFIG_HOST_TYPE); + printf("installed successfully as %s Windows System Service.\n", service_name); + printf("To run, start it from the Services Applet of Control Panel.\n"); printf("Don't forget to edit squid.conf before starting it.\n\n"); } else { fprintf(stderr, "CreateService failed\n"); @@ -828,8 +821,8 @@ WIN32_sendSignal(int WIN32_signal) SC_HANDLE schService; SC_HANDLE schSCManager; - if (!WIN32_Service_name) - WIN32_Service_name = xstrdup(_WIN_SQUID_DEFAULT_SERVICE_NAME); + if (!service_name) + service_name = xstrdup(APP_SHORTNAME); schSCManager = OpenSCManager(NULL, /* machine (NULL == local) */ NULL, /* database (NULL == default) */ @@ -882,12 +875,11 @@ WIN32_sendSignal(int WIN32_signal) /* Open a handle to the service. */ schService = OpenService(schSCManager, /* SCManager database */ - WIN32_Service_name, /* name of service */ + service_name, /* name of service */ fdwAccess); /* specify access */ if (schService == NULL) { - fprintf(stderr, "%s: ERROR: Could not open Service %s\n", APP_SHORTNAME, - WIN32_Service_name); + fprintf(stderr, "%s: ERROR: Could not open Service %s\n", APP_SHORTNAME, service_name); exit(1); } else { /* Send a control value to the service. */ @@ -896,11 +888,11 @@ WIN32_sendSignal(int WIN32_signal) fdwControl, /* control value to send */ &ssStatus)) { /* address of status info */ fprintf(stderr, "%s: ERROR: Could not Control Service %s\n", - APP_SHORTNAME, WIN32_Service_name); + APP_SHORTNAME, service_name); exit(1); } else { /* Print the service status. */ - printf("\nStatus of %s Service:\n", WIN32_Service_name); + printf("\nStatus of %s Service:\n", service_name); printf(" Service Type: 0x%lx\n", ssStatus.dwServiceType); printf(" Current State: 0x%lx\n", ssStatus.dwCurrentState); printf(" Controls Accepted: 0x%lx\n", ssStatus.dwControlsAccepted); @@ -939,10 +931,10 @@ int main(int argc, char **argv) return 1; } - WIN32_Service_name = xstrdup(c+1); - DispatchTable[0].lpServiceName=WIN32_Service_name; - strcat(REGKEY, WIN32_Service_name); - keys[4] = WIN32_Service_name; + service_name = xstrdup(c+1); + DispatchTable[0].lpServiceName=service_name; + strcat(REGKEY, service_name); + keys[4] = service_name; if (!StartServiceCtrlDispatcher(DispatchTable)) { fprintf(stderr, "StartServiceCtrlDispatcher error = %ld\n", diff --git a/src/defines.h b/src/defines.h index 890c5c4680..d347e46471 100644 --- a/src/defines.h +++ b/src/defines.h @@ -247,7 +247,6 @@ #define _WIN_SQUID_SERVICE_CONTROL_RECONFIGURE 129 #define _WIN_SQUID_SERVICE_CONTROL_DEBUG 130 #define _WIN_SQUID_SERVICE_CONTROL_INTERRUPT 131 -#define _WIN_SQUID_DEFAULT_SERVICE_NAME "Squid" #define _WIN_SQUID_SERVICE_OPTION "--ntservice" #define _WIN_SQUID_RUN_MODE_INTERACTIVE 0 #define _WIN_SQUID_RUN_MODE_SERVICE 1 diff --git a/src/globals.h b/src/globals.h index c713470ee6..b4728d01d2 100644 --- a/src/globals.h +++ b/src/globals.h @@ -56,6 +56,7 @@ extern const char *null_string; /* "" */ extern const char *version_string; /* VERSION */ extern const char *appname_string; /* PACKAGE */ extern char const *visible_appname_string; /* NULL */ +extern char *service_name; /* xstrdup(APP_SHORTNAME) */ extern const char *fdTypeStr[]; extern const char *hier_strings[]; extern const char *memStatusStr[]; @@ -121,7 +122,6 @@ extern unsigned int WIN32_Socks_initialized; /* 0 */ #if _SQUID_WINDOWS_ extern unsigned int WIN32_OS_version; /* 0 */ extern char *WIN32_OS_string; /* NULL */ -extern char *WIN32_Service_name; /* NULL */ extern char *WIN32_Command_Line; /* NULL */ extern char *WIN32_Service_Command_Line; /* NULL */ extern unsigned int WIN32_run_mode; /* _WIN_SQUID_RUN_MODE_INTERACTIVE */ diff --git a/src/main.cc b/src/main.cc index 5b2852b091..2469b0bed0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -157,12 +157,12 @@ static int opt_install_service = FALSE; static int opt_remove_service = FALSE; -static int opt_signal_service = FALSE; static int opt_command_line = FALSE; void WIN32_svcstatusupdate(DWORD, DWORD); void WINAPI WIN32_svcHandler(DWORD); #endif +static int opt_signal_service = FALSE; static char *opt_syslog_facility = NULL; static int icpPortNumOverride = 1; /* Want to detect "-u 0" */ static int configured_once = 0; @@ -281,11 +281,11 @@ static void usage(void) { fprintf(stderr, + "Usage: %s [-cdhvzCFNRVYX] [-n name] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]" #if USE_WIN32_SERVICE - "Usage: %s [-cdhirvzCFNRVYX] [-s | -l facility] [-f config-file] [-[au] port] [-k signal] [-n name] [-O CommandLine]\n" -#else - "Usage: %s [-cdhvzCFNRVYX] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]\n" + "[-ir] [-O CommandLine]" #endif + "\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" @@ -297,9 +297,9 @@ usage(void) " -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" + " -n name Specify service name to use for service operations\n" + " default is: " APP_SHORTNAME ".\n" #if USE_WIN32_SERVICE - " -n name Specify Windows Service name to use for service operations\n" - " default is: " _WIN_SQUID_DEFAULT_SERVICE_NAME ".\n" " -r Removes a Windows Service (see -n option).\n" #endif " -s | -l facility\n" @@ -338,7 +338,7 @@ mainParseOptions(int argc, char *argv[]) #if USE_WIN32_SERVICE while ((c = getopt(argc, argv, "CDFNO:RSVYXa:d:f:hik:m::n:rsl:u:vz?")) != -1) #else - while ((c = getopt(argc, argv, "CDFNRSYXa:d:f:hk:m::sl:u:vz?")) != -1) + while ((c = getopt(argc, argv, "CDFNRSYXa:d:f:hk:m::n:sl:u:vz?")) != -1) #endif { @@ -508,20 +508,18 @@ mainParseOptions(int argc, char *argv[]) } break; -#if USE_WIN32_SERVICE - case 'n': /** \par n - * Set global option opt_signal_service (to TRUE). - * Stores the additional parameter given in global WIN32_Service_name */ - xfree(WIN32_Service_name); - - WIN32_Service_name = xstrdup(optarg); - - opt_signal_service = TRUE; - + * Set global option opt_signal_service (to true). + * Stores the additional parameter given in global service_name */ + // XXX: verify that the new name has ONLY alphanumeric characters + xfree(service_name); + service_name = xstrdup(optarg); + opt_signal_service = true; break; +#if USE_WIN32_SERVICE + case 'r': /** \par r * Set global option opt_remove_service (to TRUE) */ @@ -569,6 +567,7 @@ mainParseOptions(int argc, char *argv[]) /** \par v * Display squid version and build information. Then exit. */ printf("Squid Cache: Version %s\n" ,version_string); + printf("Service Name: %s\n", service_name); if (strlen(SQUID_BUILD_INFO)) printf("%s\n",SQUID_BUILD_INFO); printf( "configure options: %s\n", SQUID_CONFIGURE_OPTIONS); @@ -1011,10 +1010,10 @@ mainInitialize(void) #endif debugs(1, DBG_CRITICAL, "Starting Squid Cache version " << version_string << " for " << CONFIG_HOST_TYPE << "..."); + debugs(1, DBG_CRITICAL, "Service Name: " << service_name); #if _SQUID_WINDOWS_ if (WIN32_run_mode == _WIN_SQUID_RUN_MODE_SERVICE) { - debugs(1, DBG_CRITICAL, "Running as " << WIN32_Service_name << " Windows System Service on " << WIN32_OS_string); debugs(1, DBG_CRITICAL, "Service command line is: " << WIN32_Service_Command_Line); } else debugs(1, DBG_CRITICAL, "Running on " << WIN32_OS_string); diff --git a/src/stat.cc b/src/stat.cc index fdd35defce..27dc28b49b 100644 --- a/src/stat.cc +++ b/src/stat.cc @@ -675,10 +675,12 @@ DumpInfo(Mgr::InfoActionData& stats, StoreEntry* sentry) #if _SQUID_WINDOWS_ if (WIN32_run_mode == _WIN_SQUID_RUN_MODE_SERVICE) { storeAppendPrintf(sentry,"\nRunning as %s Windows System Service on %s\n", - WIN32_Service_name, WIN32_OS_string); + Service_name, WIN32_OS_string); storeAppendPrintf(sentry,"Service command line is: %s\n", WIN32_Service_Command_Line); } else storeAppendPrintf(sentry,"Running on %s\n",WIN32_OS_string); +#else + storeAppendPrintf(sentry,"Service Name: %s\n", service_name); #endif storeAppendPrintf(sentry, "Start Time:\t%s\n",