]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 702] ntpd service logic should use libopts to examine cmdline.
authorDave Hart <hart@ntp.org>
Wed, 30 Dec 2009 21:55:52 +0000 (21:55 +0000)
committerDave Hart <hart@ntp.org>
Wed, 30 Dec 2009 21:55:52 +0000 (21:55 +0000)
bk: 4b3bcc68Y2usiso76vdzIQqosrspBQ

12 files changed:
ChangeLog
include/ntp_cmdargs.h
include/ntpd.h
ntpd/cmd_args.c
ntpd/ntp_config.c
ntpd/ntpd.c
ports/winnt/include/ntservice.h
ports/winnt/ntpd/ntservice.c
ports/winnt/vc6/ntpd.dsp
ports/winnt/vs2003/ntpd.vcproj
ports/winnt/vs2005/ntpd.vcproj
ports/winnt/vs2008/ntpd/ntpd.vcproj

index 25377673756661f3ab6f6dfded4f8cbaadae7cf3..a8f0e091889c58a25129c9a335e9b8eec7aa0cd2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* [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.
index ee41b4a56c33cff655e5fe732d062a15c20d2ff9..de45d8d5e5fa6891c7df2610cad8aa242732cead 100644 (file)
@@ -1,4 +1 @@
-#include "ntp_types.h"
-
-extern void    getstartup      (int, char **);
-extern void    getCmdOpts      (int, char **);
+extern void    getCmdOpts(int, char **);
index 14cf0add2c9ae433ab4ac3ebe969de610aff9679..10fb7d057aba65272e7423a5d2f5c10779692fc9 100644 (file)
@@ -475,6 +475,7 @@ extern int  stats_write_period;     /* # of seconds between writes. */
 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 */
index 49a9b465269ef56718088fd6954ed632824b61ce..98236f9444237b1b7eeb1aa244868dbb40aa8fdc 100644 (file)
@@ -23,12 +23,15 @@ extern int  check_netinfo;
 
 
 /*
- * 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;
index 9426e0a0fa5d0615b76acae2b8619f94043dab2f..aedffd86c53c1fdf9c835cc47ce9e6b7e837465a 100644 (file)
@@ -252,7 +252,7 @@ void destroy_restrict_node(struct restrict_node *my_node);
 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
@@ -3761,8 +3761,8 @@ config_remotely(
  */
 void
 getconfig(
-       int argc,
-       char *argv[]
+       int     argc,
+       char ** argv
        )
 {
        char line[MAXLINE];
index 62e4f98052e511372b1caff85cb6f11abfe39d65..040a48a0dbafe2d60cbc56875b0a2b46a8c6506f 100644 (file)
@@ -222,7 +222,6 @@ int         ntpdmain                (int, char **);
 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);
@@ -316,15 +315,20 @@ setup_logfile(
 }
 
 
-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;
 }
@@ -337,7 +341,7 @@ main(
        char *argv[]
        )
 {
-       process_commandline_opts(&argc, &argv);
+       parse_cmdline_opts(&argc, &argv);
 
        return ntpsim(argc, argv);
 }
@@ -496,7 +500,7 @@ ntpdmain(
 
        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
@@ -524,8 +528,6 @@ ntpdmain(
        }
 #endif
 
-       /* getstartup(argc, argv); / * startup configuration, may set debug */
-
 #ifdef DEBUG
        debug = DESC(DEBUG_LEVEL).optOccCt;
        DPRINTF(1, ("%s\n", Version));
index c5e5f42c3e3fcb5249dc7011e3b7e1c16833a576..f44335fdb3b9e1dabe2eef1e14ebde821cae3838 100644 (file)
  * 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 */
index cf184381dad5ef70b9bcee3294e96a3592203cd7..906e8825380138d0d3fab78e304bab516988b611 100644 (file)
  * 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>
 
@@ -59,10 +58,13 @@ void *wrap_dbg_realloc(void *p, size_t s, const char *f, int l);
 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.
@@ -71,7 +73,7 @@ void WINAPI service_main( DWORD argc, LPTSTR *argv )
                glb_argv = argv;
        }
 
-       ntpdmain( glb_argc, glb_argv );
+       ntpdmain(glb_argc, glb_argv);
 }
 
 
@@ -80,11 +82,14 @@ void WINAPI service_main( DWORD argc, LPTSTR *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();
 
@@ -94,33 +99,21 @@ int main( int argc, char *argv[] )
 
        /* 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);
@@ -137,15 +130,19 @@ int main( int argc, char *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.
  */
@@ -164,8 +161,9 @@ ntservice_init() {
                }
                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);
        }
 
@@ -194,13 +192,6 @@ ntservice_init() {
        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
index 0328732785afa0ff74e99154ee8f736e5f2d4732..57a5520af1474cce3a980134244f363ab1ca38b7 100644 (file)
@@ -42,7 +42,7 @@ RSC=rc.exe
 # 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
@@ -66,7 +66,7 @@ LINK32=link.exe
 # 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
index 5ca9f61dd1ee9c8026f5eb6b4642c9cb0fe6bbfb..975297aa30772ddf3c4f07e849ec7622f612f367 100644 (file)
@@ -22,7 +22,7 @@
                                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"
@@ -84,7 +84,7 @@
                        <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"
index 19e0ef2f21c717bd5a101522829b2b71b99176a6..f1f3abeb2ef6f06ebebe5fceba8383758cac8123 100644 (file)
@@ -44,7 +44,7 @@
                                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"
index b04ebfd47c47a2f49e1a0e3e006198acdacecfd9..8c3f0c5e75f38275aa2f73bf0193508df08ee9c0 100644 (file)
@@ -50,7 +50,7 @@
                                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"