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