]> source.dussan.org Git - tigervnc.git/commitdiff
Add option to run vncsession without forking and detaching 1651/head
authorChuck Zmudzinski <brchuckz@aol.com>
Mon, 20 Nov 2023 17:07:27 +0000 (12:07 -0500)
committerChuck Zmudzinski <brchuckz@aol.com>
Mon, 20 Nov 2023 17:07:27 +0000 (12:07 -0500)
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
unix/vncserver/vncsession.man.in

index c722922183ab1f91ee531b32d4d97454ad38bd78..ba131fbd92bd0e5cdeb25a1a51738f5d6e9af97e 100644 (file)
@@ -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] <username> <display>\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 <username> <display>\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;
index 4efad41bc5864aff6b7dfb30be27339a4d4a25f5..d52da10bf36cf05de8d8bd8fa0798d7ac6a59824 100644 (file)
@@ -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