From 755be8bdb48d2536e39d2d7cf84e8a8f86b8776f Mon Sep 17 00:00:00 2001 From: Robert McMahon 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();