+* [Bug 702] ntpd service logic should use libopts to examine cmdline.
(4.2.7p7) 2009/12/30 Released by Harlan Stenn <stenn@ntp.org>
* [Bug 620] ntpdc getresponse() esize != *rsize s/b size != *rsize.
* [Bug 1446] 4.2.7p6 requires autogen, missing ntpd.1, *.texi, *.menu.
-#include "ntp_types.h"
-
-extern void getstartup (int, char **);
-extern void getCmdOpts (int, char **);
+extern void getCmdOpts(int, char **);
extern double stats_write_tolerance;
/* ntpd.c */
+extern void parse_cmdline_opts(int *, char ***);
extern volatile int debug; /* debugging flag */
extern int nofork; /* no-fork flag */
extern int initializing; /* initializing flag */
/*
- * getCmdOpts - get command line options
+ * getCmdOpts - apply most command line options
+ *
+ * A few options are examined earlier in ntpd.c ntpdmain() and
+ * ports/winnt/ntpd/ntservice.c main().
*/
void
getCmdOpts(
- int argc,
- char *argv[]
+ int argc,
+ char ** argv
)
{
extern const char *config_file;
static int is_sane_resolved_address(sockaddr_u *peeraddr, int hmode);
static int get_correct_host_mode(int hmode);
static void save_and_apply_config_tree(void);
-void getconfig(int argc,char *argv[]);
+void getconfig(int, char **);
#if !defined(SIM)
static sockaddr_u *get_next_address(struct address_node *addr);
#endif
*/
void
getconfig(
- int argc,
- char *argv[]
+ int argc,
+ char ** argv
)
{
char line[MAXLINE];
static void set_process_priority (void);
void init_logging (char const *, int);
void setup_logfile (void);
-static void process_commandline_opts(int *, char ***);
static void assertion_failed (const char *file, int line,
isc_assertiontype_t type, const char *cond);
}
-static void
-process_commandline_opts(
- int *pargc,
+void
+parse_cmdline_opts(
+ int * pargc,
char ***pargv
)
{
- int optct;
+ static int parsed;
+ static int optct;
+
+ if (!parsed)
+ optct = optionProcess(&ntpdOptions, *pargc, *pargv);
+
+ parsed = 1;
- optct = optionProcess(&ntpdOptions, *pargc, *pargv);
*pargc -= optct;
*pargv += optct;
}
char *argv[]
)
{
- process_commandline_opts(&argc, &argv);
+ parse_cmdline_opts(&argc, &argv);
return ntpsim(argc, argv);
}
progname = argv[0];
initializing = 1; /* mark that we are initializing */
- process_commandline_opts(&argc, &argv);
+ parse_cmdline_opts(&argc, &argv);
init_logging(progname, 1); /* Open the log file */
#ifdef HAVE_UMASK
}
#endif
- /* getstartup(argc, argv); / * startup configuration, may set debug */
-
#ifdef DEBUG
debug = DESC(DEBUG_LEVEL).optOccCt;
DPRINTF(1, ("%s\n", Version));
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ntservice.h,v 1.2 2002/08/03 01:31:48 mayer Exp $ */
-
#ifndef NTSERVICE_H
#define NTSERVICE_H
-#include <winsvc.h>
-
#define NTP_DISPLAY_NAME "NetworkTimeProtocol"
#define NTP_SERVICE_NAME "ntpd"
-void ntservice_init();
+void ntservice_init(void);
void UpdateSCM(DWORD);
void WINAPI ServiceControl(DWORD dwCtrlCode);
-void ntservice_shutdown();
-BOOL ntservice_isservice();
-BOOL ntservice_systemisshuttingdown();
+void ntservice_shutdown(void);
+BOOL ntservice_systemisshuttingdown(void);
BOOL WINAPI OnConsoleEvent(DWORD dwCtrlType);
-#endif
\ No newline at end of file
+#endif /* NTSERVICE_H */
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ntservice.c,v 1.3.2.1.10.3 2004/03/08 04:04:22 marka Exp $ */
-
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
-#include <ntp_cmdargs.h>
#include <ntp_stdlib.h>
#include "syslog.h"
+#include "ntpd.h"
#include "ntservice.h"
#include "clockstuff.h"
#include "ntp_iocompletionport.h"
+#include "ntpd-opts.h"
#include "isc/win32os.h"
#include <ssl_applink.c>
void wrap_dbg_free(void *p);
#endif
-void WINAPI service_main( DWORD argc, LPTSTR *argv )
+void WINAPI
+service_main(
+ DWORD argc,
+ LPTSTR *argv
+ )
{
- if ( argc > 1 )
- {
+ if (argc > 1) {
/*
* Let command line parameters from the Windows SCM GUI
* override the standard parameters from the ImagePath registry key.
glb_argv = argv;
}
- ntpdmain( glb_argc, glb_argv );
+ ntpdmain(glb_argc, glb_argv);
}
* We can call ntpdmain() explicitly or via StartServiceCtrlDispatcher()
* as we need to.
*/
-int main( int argc, char *argv[] )
+int main(
+ int argc,
+ char ** argv
+ )
{
- int rc;
- int i = 1;
-
+ int rc;
+ int argc_after_opts;
+ char ** argv_after_opts;
ssl_applink();
/* Under original Windows NT we must not discard the wildcard */
/* socket to workaround a bug in NT's getsockname(). */
- if ( isc_win32os_majorversion() <= 4 )
+ if (isc_win32os_majorversion() <= 4)
accept_wildcard_if_for_winnt = 1;
- /*
- * This is a hack in the Windows port of ntpd. Before the
- * portable ntpd libopts processing of the command line, we
- * need to know if we're "daemonizing" (attempting to start as
- * a service). There is undoubtedly a better way. Legitimate
- * option combinations are broken by this code , such as:
- * ntpd -nc debug.conf
- */
- while (argv[i]) {
- if (!_strnicmp(argv[i], "-d", 2)
- || !strcmp(argv[i], "--debug_level")
- || !strcmp(argv[i], "--set-debug_level")
- || !strcmp(argv[i], "-q")
- || !strcmp(argv[i], "--quit")
- || !strcmp(argv[i], "-?")
- || !strcmp(argv[i], "--help")
- || !_strnicmp(argv[i], "-n", 2)
- || !strcmp(argv[i], "--nofork")
- || !strcmp(argv[i], "--saveconfigquit")) {
- foreground = TRUE;
- break;
- }
- i++;
- }
+ argc_after_opts = argc;
+ argv_after_opts = argv;
+ parse_cmdline_opts(&argc_after_opts, &argv_after_opts);
+
+ if (HAVE_OPT(QUIT)
+ || HAVE_OPT(SAVECONFIGQUIT)
+ || HAVE_OPT(HELP)
+#ifdef DEBUG
+ || DESC(DEBUG_LEVEL).optOccCt != 0
+#endif
+ || HAVE_OPT(NOFORK))
+ foreground = TRUE;
if (foreground) /* run in console window */
rc = ntpdmain(argc, argv);
rc = 0;
else {
rc = GetLastError();
-#ifdef DEBUG
- fprintf(stderr, "%s: unable to start as service, rc: %i\n\n", argv[0], rc);
-#endif
- fprintf(stderr, "\nUse -d, -q, --help or -n to run from the command line.\n");
+ fprintf(stderr,
+ "%s: unable to start as service:\n"
+ "%s\n"
+ "Use -d, -q, -n, -?, --help or "
+ "--saveconfigquit to run "
+ "interactive.\n",
+ argv[0], ntp_strerror(rc));
}
}
return rc;
}
+
/*
* Initialize the Service by registering it.
*/
}
UpdateSCM(SERVICE_RUNNING);
} else {
- strcpy(ConsoleTitle, "NTP Version ");
- strcat(ConsoleTitle, Version);
+ snprintf(ConsoleTitle, sizeof(ConsoleTitle),
+ "NTP Version %s", Version);
+ ConsoleTitle[sizeof(ConsoleTitle) - 1] = '\0';
SetConsoleTitle(ConsoleTitle);
}
atexit( ntservice_exit );
}
-/*
- * Routine to check if this is a service or a foreground program
- */
-BOOL
-ntservice_isservice() {
- return(!foreground);
-}
/*
* Routine to check if the service is stopping
# PROP Ignore_Export_Lib 0\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /MD /W4 /GX /O2 /I "." /I "..\include" /I "..\..\..\include" /I "..\..\..\lib\isc\win32\include" /I "..\..\..\lib\isc\include" /I "$(OPENSSL_INC)" /I "..\..\..\libopts" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "__STDC__" /D "SYS_WINNT" /D "HAVE_CONFIG_H" /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 /D "_CRT_SECURE_NO_DEPRECATE" /FR /YX"windows.h" /FD /c\r
+# ADD CPP /nologo /MD /W4 /GX /O2 /I "." /I "..\..\..\ntpd" /I "..\include" /I "..\..\..\include" /I "..\..\..\lib\isc\win32\include" /I "..\..\..\lib\isc\include" /I "$(OPENSSL_INC)" /I "..\..\..\libopts" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "__STDC__" /D "SYS_WINNT" /D "HAVE_CONFIG_H" /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 /D "_CRT_SECURE_NO_DEPRECATE" /FR /YX"windows.h" /FD /c\r
# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
# ADD RSC /l 0x409 /d "NDEBUG"\r
BSC32=bscmake.exe\r
# PROP Ignore_Export_Lib 0\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "..\include" /I "..\..\..\include" /I "..\..\..\lib\isc\win32\include" /I "..\..\..\lib\isc\include" /I "$(OPENSSL_INC)" /I "..\..\..\libopts" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "__STDC__" /D "SYS_WINNT" /D "HAVE_CONFIG_H" /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 /D "_CRT_SECURE_NO_DEPRECATE" /FR /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "..\..\..\ntpd" /I "..\include" /I "..\..\..\include" /I "..\..\..\lib\isc\win32\include" /I "..\..\..\lib\isc\include" /I "$(OPENSSL_INC)" /I "..\..\..\libopts" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "__STDC__" /D "SYS_WINNT" /D "HAVE_CONFIG_H" /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1 /D "_CRT_SECURE_NO_DEPRECATE" /FR /FD /GZ /c\r
# SUBTRACT CPP /YX\r
# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
# ADD RSC /l 0x409 /d "_DEBUG"\r
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories=".,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
+ AdditionalIncludeDirectories=".,..\..\..\ntpd,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
PreprocessorDefinitions="NDEBUG;_CONSOLE;WIN32;__STDC__;SYS_WINNT;HAVE_CONFIG_H;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_CRT_SECURE_NO_DEPRECATE"
StringPooling="TRUE"
RuntimeLibrary="2"
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories=".,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
+ AdditionalIncludeDirectories=".,..\..\..\ntpd,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
PreprocessorDefinitions="_DEBUG;_CONSOLE;WIN32;__STDC__;SYS_WINNT;HAVE_CONFIG_H;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_CRT_SECURE_NO_DEPRECATE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories=".,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
+ AdditionalIncludeDirectories=".,..\..\..\ntpd,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
PreprocessorDefinitions="NDEBUG;_CONSOLE;WIN32;__STDC__;SYS_WINNT;HAVE_CONFIG_H;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_CRT_SECURE_NO_DEPRECATE"
StringPooling="true"
RuntimeLibrary="2"
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories=".,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
+ AdditionalIncludeDirectories=".,..\..\..\ntpd,..\include,..\..\..\include,..\..\..\lib\isc\win32\include,..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\libopts"
PreprocessorDefinitions="_DEBUG;_CONSOLE;WIN32;__STDC__;SYS_WINNT;HAVE_CONFIG_H;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_CRT_SECURE_NO_DEPRECATE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="..\..\ntpd,..\..\include,..\..\..\..\include,..\..\..\..\lib\isc\win32\include,..\..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\..\libopts"
+ AdditionalIncludeDirectories="..\..\ntpd,..\..\..\..\ntpd,..\..\include,..\..\..\..\include,..\..\..\..\lib\isc\win32\include,..\..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\..\libopts"
PreprocessorDefinitions="NDEBUG;_CONSOLE;WIN32;SYS_WINNT;HAVE_CONFIG_H"
StringPooling="true"
ExceptionHandling="0"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="false"
- AdditionalIncludeDirectories="..\..\ntpd,..\..\include,..\..\..\..\include,..\..\..\..\lib\isc\win32\include,..\..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\..\libopts"
+ AdditionalIncludeDirectories="..\..\ntpd,..\..\..\..\ntpd,..\..\include,..\..\..\..\include,..\..\..\..\lib\isc\win32\include,..\..\..\..\lib\isc\include,$(OPENSSL_INC),..\..\..\..\libopts"
PreprocessorDefinitions="_DEBUG;_CONSOLE;WIN32;SYS_WINNT;HAVE_CONFIG_H"
MinimalRebuild="true"
ExceptionHandling="0"