[dvblast-devel] [PATCH 8/9] dvblastctl: Add --timeout/-t option and set default to 15 seconds.

Georgi Chorbadzhiyski gf at unixsol.org
Sat Jan 20 13:42:56 CET 2018


It is possible that 'dvblast' does not answer on the command socket
and in this case 'dvblastctl' just hangs waiting forever.

This commit introduces timeout for send/receive operations in dvblastctl.
The timeout is set in seconds and the default value is 15 seconds.
---
 NEWS         |  1 +
 dvblastctl.c | 21 ++++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index 3d30ba0..9b175fa 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,7 @@ Changes between 3.2 and -next
   * Add support for getting EIT schedule for chosen service in dvblastctl
   * Switch default string charset to UTF-8//IGNORE
   * Add --system-charset/-j option to dvblastctl
+  * Add --timeout/-t option to dvblastctl and set default to 15 seconds
 
 Changes between 3.1 and 3.2:
 ----------------------------
diff --git a/dvblastctl.c b/dvblastctl.c
index cf88027..37d96e8 100644
--- a/dvblastctl.c
+++ b/dvblastctl.c
@@ -51,6 +51,7 @@
 
 int i_verbose = 3;
 int i_syslog = 0;
+unsigned int i_timeout_seconds = 15;
 
 print_type_t i_print_type = PRINT_TEXT;
 mtime_t now;
@@ -358,6 +359,7 @@ void usage()
     printf("Usage: dvblastctl -r <remote socket> [-x <text|xml>] [cmd]\n");
     printf("Options:\n");
     printf("  -r --remote-socket <name>       Set socket name to <name>.\n" );
+    printf("  -t --timeout <seconds>          Set socket read/write timeout in seconds (default 15).\n" );
     printf("  -j --system-charset <name>      Character set used for output (default UTF-8//IGNORE)\n" );
     printf("  -x --print <text|xml>           Choose output format for info commands.\n" );
     printf("Control commands:\n");
@@ -409,13 +411,14 @@ int main( int i_argc, char **ppsz_argv )
         static const struct option long_options[] =
         {
             {"remote-socket", required_argument, NULL, 'r'},
+            {"timeout", required_argument, NULL, 't'},
             {"system-charset", required_argument, NULL, 'j'},
             {"print", required_argument, NULL, 'x'},
             {"help", no_argument, NULL, 'h'},
             {0, 0, 0, 0}
         };
 
-        if ( (c = getopt_long(i_argc, ppsz_argv, "r:x:j:h", long_options, NULL)) == -1 )
+        if ( (c = getopt_long(i_argc, ppsz_argv, "r:t:x:j:h", long_options, NULL)) == -1 )
             break;
 
         switch ( c )
@@ -424,6 +427,10 @@ int main( int i_argc, char **ppsz_argv )
             psz_srv_socket = optarg;
             break;
 
+        case 't':
+            i_timeout_seconds = (unsigned int)strtoul(optarg, NULL, 10);
+            break;
+
         case 'j':
             psz_native_charset = optarg;
             break;
@@ -606,6 +613,18 @@ int main( int i_argc, char **ppsz_argv )
         return_error( "Unhandled option (%d)", opt.cmd );
     }
 
+    if ( i_timeout_seconds > 0 ) {
+        struct timeval tv_timeout = {
+            .tv_sec  = i_timeout_seconds,
+            .tv_usec = 0,
+        };
+        if ( setsockopt( i_fd, SOL_SOCKET, SO_SNDTIMEO, &tv_timeout, sizeof( tv_timeout ) ) != 0 )
+            return_error( "Cannot set SO_SNDTIMEO (%s)", strerror(errno) );
+
+        if ( setsockopt( i_fd, SOL_SOCKET, SO_RCVTIMEO, &tv_timeout, sizeof( tv_timeout ) ) != 0 )
+            return_error( "Cannot set SO_RCVTIMEO (%s)", strerror(errno) );
+    }
+
     /* Send command and receive answer */
     if ( sendto( i_fd, p_buffer, i_size, 0, (struct sockaddr *)&sun_server,
                  SUN_LEN(&sun_server) ) < 0 )
-- 
2.14.1



More information about the dvblast-devel mailing list