From 444c7ccd9fbf6979bdb096155781951cc71b811a Mon Sep 17 00:00:00 2001 From: Chuck Zmudzinski Date: Mon, 20 Nov 2023 12:07: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..ba131fbd92 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 ((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