Commit 170f4bea authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Greg Kroah-Hartman

tools: hv: introduce -n/--no-daemon option

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: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4f689190
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <dirent.h> #include <dirent.h>
#include <getopt.h>
static int target_fd; static int target_fd;
static char target_fname[W_MAX_PATH]; static char target_fname[W_MAX_PATH];
...@@ -126,15 +127,43 @@ static int hv_copy_cancel(void) ...@@ -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 fd, fcopy_fd, len;
int error; int error;
int daemonize = 1, long_index = 0, opt;
int version = FCOPY_CURRENT_VERSION; int version = FCOPY_CURRENT_VERSION;
char *buffer[4096 * 2]; char *buffer[4096 * 2];
struct hv_fcopy_hdr *in_msg; 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)); syslog(LOG_ERR, "daemon() failed; error: %s", strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <dirent.h> #include <dirent.h>
#include <net/if.h> #include <net/if.h>
#include <getopt.h>
/* /*
* KVP protocol: The user mode component first registers with the * KVP protocol: The user mode component first registers with the
...@@ -1417,7 +1418,15 @@ netlink_send(int fd, struct cn_msg *msg) ...@@ -1417,7 +1418,15 @@ netlink_send(int fd, struct cn_msg *msg)
return sendmsg(fd, &message, 0); 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 fd, len, nl_group;
int error; int error;
...@@ -1435,9 +1444,30 @@ int main(void) ...@@ -1435,9 +1444,30 @@ int main(void)
struct hv_kvp_ipaddr_value *kvp_ip_val; struct hv_kvp_ipaddr_value *kvp_ip_val;
char *kvp_recv_buffer; char *kvp_recv_buffer;
size_t kvp_recv_buffer_len; 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; return 1;
openlog("KVP", 0, LOG_USER); openlog("KVP", 0, LOG_USER);
syslog(LOG_INFO, "KVP starting; pid is:%d", getpid()); syslog(LOG_INFO, "KVP starting; pid is:%d", getpid());
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <linux/hyperv.h> #include <linux/hyperv.h>
#include <linux/netlink.h> #include <linux/netlink.h>
#include <syslog.h> #include <syslog.h>
#include <getopt.h>
static struct sockaddr_nl addr; static struct sockaddr_nl addr;
...@@ -155,7 +156,15 @@ static int netlink_send(int fd, struct cn_msg *msg) ...@@ -155,7 +156,15 @@ static int netlink_send(int fd, struct cn_msg *msg)
return sendmsg(fd, &message, 0); 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 fd, len, nl_group;
int error; int error;
...@@ -167,8 +176,28 @@ int main(void) ...@@ -167,8 +176,28 @@ int main(void)
struct hv_vss_msg *vss_msg; struct hv_vss_msg *vss_msg;
char *vss_recv_buffer; char *vss_recv_buffer;
size_t vss_recv_buffer_len; 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; return 1;
openlog("Hyper-V VSS", 0, LOG_USER); openlog("Hyper-V VSS", 0, LOG_USER);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment