|
|
@@ -0,0 +1,161 @@
|
|
|
+From 755be8bdb48d2536e39d2d7cf84e8a8f86b8776f Mon Sep 17 00:00:00 2001
|
|
|
+From: Robert McMahon <[email protected]>
|
|
|
+Date: Sat, 6 Oct 2018 13:36:52 -0700
|
|
|
+Subject: [PATCH] cleanup main startup, fix daemon mode per redirecting stdin,
|
|
|
+ stderr and stdout to /dev/null
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+--- a/src/main.cpp
|
|
|
++++ b/src/main.cpp
|
|
|
+@@ -167,67 +167,7 @@ int main( int argc, char **argv ) {
|
|
|
+ Settings_ParseCommandLine( argc, argv, ext_gSettings );
|
|
|
+
|
|
|
+ // Check for either having specified client or server
|
|
|
+- if ( ext_gSettings->mThreadMode == kMode_Client
|
|
|
+- || ext_gSettings->mThreadMode == kMode_Listener ) {
|
|
|
+-#ifdef WIN32
|
|
|
+- // Start the server as a daemon
|
|
|
+- if ( isDaemon( ext_gSettings )) {
|
|
|
+- if (ext_gSettings->mThreadMode == kMode_Listener) {
|
|
|
+- CmdInstallService(argc, argv);
|
|
|
+- } else {
|
|
|
+- fprintf(stderr, "Client cannot be run as a daemon\n");
|
|
|
+- }
|
|
|
+- return 0;
|
|
|
+- }
|
|
|
+-
|
|
|
+- // Remove the Windows service if requested
|
|
|
+- if ( isRemoveService( ext_gSettings ) ) {
|
|
|
+- // remove the service
|
|
|
+- if ( CmdRemoveService() ) {
|
|
|
+- fprintf(stderr, "IPerf Service is removed.\n");
|
|
|
+- return 0;
|
|
|
+- }
|
|
|
+- }
|
|
|
+-#else
|
|
|
+- if ( isDaemon( ext_gSettings ) ) {
|
|
|
+- if (ext_gSettings->mThreadMode != kMode_Listener) {
|
|
|
+- fprintf(stderr, "Iperf client cannot be run as a daemon\n");
|
|
|
+- return 0;
|
|
|
+- }
|
|
|
+- if (daemon(1, 1) < 0) {
|
|
|
+- perror("daemon");
|
|
|
+- }
|
|
|
+- fprintf( stderr, "Running Iperf Server as a daemon\n");
|
|
|
+- fprintf( stderr, "The Iperf daemon process ID : %d\n",((int)getpid()));
|
|
|
+- fclose(stdout);
|
|
|
+- fclose(stderr);
|
|
|
+- fclose(stdin);
|
|
|
+- }
|
|
|
+-#endif
|
|
|
+- // initialize client(s)
|
|
|
+- if ( ext_gSettings->mThreadMode == kMode_Client ) {
|
|
|
+- client_init( ext_gSettings );
|
|
|
+- }
|
|
|
+-
|
|
|
+-#ifdef HAVE_THREAD
|
|
|
+- // start up the reporter and client(s) or listener
|
|
|
+- {
|
|
|
+- thread_Settings *into = NULL;
|
|
|
+- // Create the settings structure for the reporter thread
|
|
|
+- Settings_Copy( ext_gSettings, &into );
|
|
|
+- into->mThreadMode = kMode_Reporter;
|
|
|
+-
|
|
|
+- // Have the reporter launch the client or listener
|
|
|
+- into->runNow = ext_gSettings;
|
|
|
+-
|
|
|
+- // Start all the threads that are ready to go
|
|
|
+- thread_start( into );
|
|
|
+- }
|
|
|
+-#else
|
|
|
+- // No need to make a reporter thread because we don't have threads
|
|
|
+- thread_start( ext_gSettings );
|
|
|
+-#endif
|
|
|
+- } else {
|
|
|
++ if ((ext_gSettings->mThreadMode != kMode_Client) && (ext_gSettings->mThreadMode != kMode_Listener)) {
|
|
|
+ // neither server nor client mode was specified
|
|
|
+ // print usage and exit
|
|
|
+
|
|
|
+@@ -236,20 +176,75 @@ int main( int argc, char **argv ) {
|
|
|
+ // Starting in 2.0 to restart a previously defined service
|
|
|
+ // you must call iperf with "iperf -D" or using the environment variable
|
|
|
+ SERVICE_TABLE_ENTRY dispatchTable[] =
|
|
|
+- {
|
|
|
+- { (LPSTR)TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main},
|
|
|
+- { NULL, NULL}
|
|
|
+- };
|
|
|
++ {
|
|
|
++ { (LPSTR)TEXT(SZSERVICENAME), (LPSERVICE_MAIN_FUNCTION)service_main},
|
|
|
++ { NULL, NULL}
|
|
|
++ };
|
|
|
+
|
|
|
+ // starting the service by SCM, there is no arguments will be passed in.
|
|
|
+ // the arguments will pass into Service_Main entry.
|
|
|
+ if (!StartServiceCtrlDispatcher(dispatchTable) )
|
|
|
+ // If the service failed to start then print usage
|
|
|
+ #endif
|
|
|
+- fprintf( stderr, usage_short, argv[0], argv[0] );
|
|
|
++ fprintf( stderr, usage_short, argv[0], argv[0] );
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++
|
|
|
++
|
|
|
++ switch (ext_gSettings->mThreadMode) {
|
|
|
++ case kMode_Client :
|
|
|
++ if ( isDaemon( ext_gSettings ) ) {
|
|
|
++ fprintf(stderr, "Iperf client cannot be run as a daemon\n");
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++ // initialize client(s)
|
|
|
++ client_init( ext_gSettings );
|
|
|
++ break;
|
|
|
++ case kMode_Listener :
|
|
|
++ if ( isDaemon( ext_gSettings ) ) {
|
|
|
++ fprintf( stderr, "Running Iperf Server as a daemon\n");
|
|
|
++ // Start the server as a daemon
|
|
|
++#ifdef WIN32
|
|
|
++ CmdInstallService(argc, argv);
|
|
|
++ // Remove the Windows service if requested
|
|
|
++ if ( isRemoveService( ext_gSettings ) ) {
|
|
|
++ // remove the service
|
|
|
++ if ( CmdRemoveService() ) {
|
|
|
++ fprintf(stderr, "IPerf Service is removed.\n");
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++ }
|
|
|
++#else
|
|
|
++ fflush(stderr);
|
|
|
++ // redirect stdin, stdout and sterr to /dev/null (see dameon and no close flag)
|
|
|
++ if (daemon(1, 0) < 0) {
|
|
|
++ perror("daemon");
|
|
|
++ }
|
|
|
++ }
|
|
|
++#endif
|
|
|
++ break;
|
|
|
++ default :
|
|
|
++ fprintf( stderr, "unknown mode");
|
|
|
++ break;
|
|
|
++ }
|
|
|
++#ifdef HAVE_THREAD
|
|
|
++ // start up the reporter and client(s) or listener
|
|
|
++ {
|
|
|
++ thread_Settings *into = NULL;
|
|
|
++ // Create the settings structure for the reporter thread
|
|
|
++ Settings_Copy( ext_gSettings, &into );
|
|
|
++ into->mThreadMode = kMode_Reporter;
|
|
|
++
|
|
|
++ // Have the reporter launch the client or listener
|
|
|
++ into->runNow = ext_gSettings;
|
|
|
+
|
|
|
+- return 0;
|
|
|
++ // Start all the threads that are ready to go
|
|
|
++ thread_start( into );
|
|
|
+ }
|
|
|
++#else
|
|
|
++ // No need to make a reporter thread because we don't have threads
|
|
|
++ thread_start( ext_gSettings );
|
|
|
++#endif
|
|
|
+
|
|
|
+ // wait for other (client, server) threads to complete
|
|
|
+ thread_joinall();
|