tools: hv: introduce -n/--no-daemon option
authorVitaly Kuznetsov <vkuznets@redhat.com>
Wed, 22 Oct 2014 16:07:11 +0000 (18:07 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Nov 2014 18:21:44 +0000 (10:21 -0800)
All tools/hv daemons do mandatory daemon() on startup. However, no pidfile
is created, this make it difficult for an init system to track such daemons.
Modern linux distros use systemd as their init system. It can handle the
daemonizing by itself, however, it requires a daemon to stay in foreground
for that. Some distros already carry distro-specific patch for hv tools
which switches off daemon().

Introduce -n/--no-daemon option for all 3 daemons in hv/tools. Parse options
with getopt() to make this part easily expandable.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
tools/hv/hv_fcopy_daemon.c
tools/hv/hv_kvp_daemon.c
tools/hv/hv_vss_daemon.c

index 8f96b3ee0724c88e537c1b9f19e051d37ff45564..f437d739f37da6fca68165b983e4137c2622f317 100644 (file)
@@ -33,6 +33,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <dirent.h>
+#include <getopt.h>
 
 static int target_fd;
 static char target_fname[W_MAX_PATH];
@@ -126,15 +127,43 @@ static int hv_copy_cancel(void)
 
 }
 
-int main(void)
+void print_usage(char *argv[])
+{
+       fprintf(stderr, "Usage: %s [options]\n"
+               "Options are:\n"
+               "  -n, --no-daemon        stay in foreground, don't daemonize\n"
+               "  -h, --help             print this help\n", argv[0]);
+}
+
+int main(int argc, char *argv[])
 {
        int fd, fcopy_fd, len;
        int error;
+       int daemonize = 1, long_index = 0, opt;
        int version = FCOPY_CURRENT_VERSION;
        char *buffer[4096 * 2];
        struct hv_fcopy_hdr *in_msg;
 
-       if (daemon(1, 0)) {
+       static struct option long_options[] = {
+               {"help",        no_argument,       0,  'h' },
+               {"no-daemon",   no_argument,       0,  'n' },
+               {0,             0,                 0,  0   }
+       };
+
+       while ((opt = getopt_long(argc, argv, "hn", long_options,
+                                 &long_index)) != -1) {
+               switch (opt) {
+               case 'n':
+                       daemonize = 0;
+                       break;
+               case 'h':
+               default:
+                       print_usage(argv);
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       if (daemonize && daemon(1, 0)) {
                syslog(LOG_ERR, "daemon() failed; error: %s", strerror(errno));
                exit(EXIT_FAILURE);
        }
index 4088b816a3eeac3c513400a67901337a529effd0..22b076419c807d44d5fe2ffd973f110a2853f0ce 100644 (file)
@@ -43,6 +43,7 @@
 #include <fcntl.h>
 #include <dirent.h>
 #include <net/if.h>
+#include <getopt.h>
 
 /*
  * KVP protocol: The user mode component first registers with the
@@ -1417,7 +1418,15 @@ netlink_send(int fd, struct cn_msg *msg)
        return sendmsg(fd, &message, 0);
 }
 
-int main(void)
+void print_usage(char *argv[])
+{
+       fprintf(stderr, "Usage: %s [options]\n"
+               "Options are:\n"
+               "  -n, --no-daemon        stay in foreground, don't daemonize\n"
+               "  -h, --help             print this help\n", argv[0]);
+}
+
+int main(int argc, char *argv[])
 {
        int fd, len, nl_group;
        int error;
@@ -1435,9 +1444,30 @@ int main(void)
        struct hv_kvp_ipaddr_value *kvp_ip_val;
        char *kvp_recv_buffer;
        size_t kvp_recv_buffer_len;
+       int daemonize = 1, long_index = 0, opt;
+
+       static struct option long_options[] = {
+               {"help",        no_argument,       0,  'h' },
+               {"no-daemon",   no_argument,       0,  'n' },
+               {0,             0,                 0,  0   }
+       };
+
+       while ((opt = getopt_long(argc, argv, "hn", long_options,
+                                 &long_index)) != -1) {
+               switch (opt) {
+               case 'n':
+                       daemonize = 0;
+                       break;
+               case 'h':
+               default:
+                       print_usage(argv);
+                       exit(EXIT_FAILURE);
+               }
+       }
 
-       if (daemon(1, 0))
+       if (daemonize && daemon(1, 0))
                return 1;
+
        openlog("KVP", 0, LOG_USER);
        syslog(LOG_INFO, "KVP starting; pid is:%d", getpid());
 
index 1db9430d3fe4d544a693e8c10aa9bd6decf03bd1..b720d8f0f901ad042b0c9d9b06778ff146b67ffc 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/hyperv.h>
 #include <linux/netlink.h>
 #include <syslog.h>
+#include <getopt.h>
 
 static struct sockaddr_nl addr;
 
@@ -155,7 +156,15 @@ static int netlink_send(int fd, struct cn_msg *msg)
        return sendmsg(fd, &message, 0);
 }
 
-int main(void)
+void print_usage(char *argv[])
+{
+       fprintf(stderr, "Usage: %s [options]\n"
+               "Options are:\n"
+               "  -n, --no-daemon        stay in foreground, don't daemonize\n"
+               "  -h, --help             print this help\n", argv[0]);
+}
+
+int main(int argc, char *argv[])
 {
        int fd, len, nl_group;
        int error;
@@ -167,8 +176,28 @@ int main(void)
        struct hv_vss_msg *vss_msg;
        char *vss_recv_buffer;
        size_t vss_recv_buffer_len;
+       int daemonize = 1, long_index = 0, opt;
+
+       static struct option long_options[] = {
+               {"help",        no_argument,       0,  'h' },
+               {"no-daemon",   no_argument,       0,  'n' },
+               {0,             0,                 0,  0   }
+       };
+
+       while ((opt = getopt_long(argc, argv, "hn", long_options,
+                                 &long_index)) != -1) {
+               switch (opt) {
+               case 'n':
+                       daemonize = 0;
+                       break;
+               case 'h':
+               default:
+                       print_usage(argv);
+                       exit(EXIT_FAILURE);
+               }
+       }
 
-       if (daemon(1, 0))
+       if (daemonize && daemon(1, 0))
                return 1;
 
        openlog("Hyper-V VSS", 0, LOG_USER);