aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch')
-rw-r--r--package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch161
1 files changed, 161 insertions, 0 deletions
diff --git a/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch b/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch
new file mode 100644
index 0000000000..c8655c9142
--- /dev/null
+++ b/package/network/utils/iperf/patches/0002-cleanup-main-startup-fix-daemon-mode-per-redirecting.patch
@@ -0,0 +1,161 @@
+From 755be8bdb48d2536e39d2d7cf84e8a8f86b8776f Mon Sep 17 00:00:00 2001
+From: Robert McMahon <rjmcmahon@rjmcmahon.com>
+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();