From 5ede05b5e94825a5c5b301818b034f3ba97b32b7 Mon Sep 17 00:00:00 2001 From: Chuck Zmudzinski Date: Thu, 16 Nov 2023 02:04:27 -0500 Subject: [PATCH] Add option to run vncsession without forking and detaching Option is -D, which is what sshd uses for the same option. Also add description of the new option to the vncsession man page. Tested on Void Linux using the new option, also tested on Fedora without using the new option. Resolves #1649 --- unix/vncserver/vncsession.c | 38 ++++++++++++++++++++++++-------- unix/vncserver/vncsession.man.in | 10 +++++++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/unix/vncserver/vncsession.c b/unix/vncserver/vncsession.c index c722922183..1212fd40ad 100644 --- a/unix/vncserver/vncsession.c +++ b/unix/vncserver/vncsession.c @@ -503,6 +503,14 @@ run_script(const char *username, const char *display, char **envp) _exit(EX_OSERR); } +static void +usage(void) +{ + fprintf(stderr, "Syntax:\n"); + fprintf(stderr, " vncsession [-D] \n"); + exit(EX_USAGE); +} + int main(int argc, char **argv) { @@ -511,14 +519,23 @@ main(int argc, char **argv) const char *username, *display; - if ((argc != 3) || (argv[2][0] != ':')) { - fprintf(stderr, "Syntax:\n"); - fprintf(stderr, " %s \n", argv[0]); - return EX_USAGE; + int opt, forking = 1; + + while ((opt = getopt(argc, argv, "D")) != -1) { + switch (opt) { + case 'D': + forking = 0; + break; + default: + usage(); + } } - username = argv[1]; - display = argv[2]; + if ((optind > 2) || (argc != optind + 2) || (argv[optind +1][0] != ':')) + usage(); + + username = argv[argc - 2]; + display = argv[argc - 1]; if (geteuid() != 0) { fprintf(stderr, "This program needs to be run as root!\n"); @@ -534,8 +551,10 @@ main(int argc, char **argv) return EX_OSERR; } - if (begin_daemon() == -1) - return EX_OSERR; + if (forking) { + if (begin_daemon() == -1) + return EX_OSERR; + } openlog("vncsession", LOG_PID, LOG_AUTH); @@ -586,7 +605,8 @@ main(int argc, char **argv) fclose(f); } - finish_daemon(); + if (forking) + finish_daemon(); while (1) { int status; diff --git a/unix/vncserver/vncsession.man.in b/unix/vncserver/vncsession.man.in index 4efad41bc5..d52da10bf3 100644 --- a/unix/vncserver/vncsession.man.in +++ b/unix/vncserver/vncsession.man.in @@ -3,6 +3,7 @@ vncsession \- start a VNC server .SH SYNOPSIS .B vncsession +.RI [-D] .RI < username > .RI <: display# > .SH DESCRIPTION @@ -16,6 +17,15 @@ appropriate options and starts a window manager on the VNC desktop. is rarely called directly and is normally started by the system service manager. +.SH -D OPTION +.B vncsession +by default forks and detaches. If the -D option is used, it does not fork and +detach. This option is provided for use with system service managers that +require services to run in the foreground. This option is not intended for +debugging in a login shell from a terminal or for running +.B vncsession +from a terminal as an ordinary user. + .SH FILES Several VNC-related files are found in the directory $HOME/.vnc: .TP