qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Oliver Gerlich <olig9@gmx.de>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [Patch] Publish VNC display with zeroconf
Date: Sun, 14 May 2006 17:00:10 +0200	[thread overview]
Message-ID: <446745FA.7090804@gmx.de> (raw)

[-- Attachment #1: Type: text/plain, Size: 865 bytes --]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

here's a little gimmick for VNC support :-)

The patch makes Qemu publish its VNC display via zeroconf if it is
called with -vnc option. The patch uses the avahi-publish helper app for
this, which comes with the Avahi suite (eg. in Debian and Ubuntu it's in
the avahi-utils package). If avahi-publish is not installed, this patch
won't do anything.

With the patch applied, you can use the service-discovery-applet under
Gnome to see all Qemu instances which use VNC. Under KDE, Krdc offers a
list of all zeroconf-published VNC displays (choose "DNS-SD" from the
listbox in the upper left corner in Krdc).


Regards,
Oliver
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (GNU/Linux)

iD8DBQFEZ0X5TFOM6DcNJ6cRApiCAJ0dSa115JeNvXu9PfND5R+E4TqyeQCgvDlK
ROoGXIBo2gVLK104J2uKz1M=
=8tDu
-----END PGP SIGNATURE-----

[-- Attachment #2: vnc-avahi-publish.diff --]
[-- Type: text/plain, Size: 2527 bytes --]

--- qemu-0.8.1/vnc.c	2006-05-03 22:32:58.000000000 +0200
+++ qemu-0.8.1-avahi/vnc.c	2006-05-14 16:21:05.000000000 +0200
@@ -64,6 +64,11 @@
     size_t read_handler_expect;
 };
 
+#ifndef _WIN32
+#include <signal.h>
+pid_t mdns_publish_pid = 0;
+#endif
+
 /* TODO
    1) Get the queue working for IO.
    2) there is some weirdness when using the -S option (the screen is grey
@@ -852,6 +857,71 @@
     }
 }
 
+#ifndef _WIN32
+static void vnc_unpublish_mdns(void)
+{
+    if (mdns_publish_pid != 0)
+    {
+        kill(mdns_publish_pid, SIGTERM);
+    }
+    return;
+}
+#endif
+
+/// Publish VNC display via mdns/zeroconf using the Avahi suite.
+/// See RFC 2782 and avahi-publish(1) for more info.
+void vnc_publish_mdns(int port)
+{
+#ifndef _WIN32
+    // Execute avahi helper program in a child process.
+    pid_t childPid = fork();
+    switch(childPid)
+    {
+        case -1:
+            // fork() failed; ignore this.
+            break;
+
+        case 0:
+        {
+            // New child process.
+            char name[250];
+            char portString[10];
+            char *argv[10];
+            int i = 0;
+
+            sprintf(name, "QEMU instance on port %d", port);
+            sprintf(portString, "%d", port);
+
+            argv[i++] = "avahi-publish"; // avahi-publish is a helper program from Avahi that publishes DNS-SD records.
+            argv[i++] = "-s";            // Flag: publish a service.
+            argv[i++] = name;            // Name of the service
+            argv[i++] = "_rfb._tcp";     // Service type (see http://www.dns-sd.org/ServiceTypes.html)
+            argv[i++] = portString;      // TCP port
+            argv[i++] = NULL;
+
+            // Close stdout/stderr to suppress output from avahi-publish
+            close(STDOUT_FILENO);
+            close(STDERR_FILENO);
+
+            // Execute avahi-publish
+            execvp(argv[0], argv);
+
+            // This point might be reached, eg. if avahi-publish is not installed.
+            exit(0);
+            break;
+        }
+
+        default:
+            // Parent process. Record child pid and set exit handler.
+            mdns_publish_pid = childPid;
+            atexit(vnc_unpublish_mdns);
+            break;
+    }
+#endif
+
+    return;
+}
+
 void vnc_display_init(DisplayState *ds, int display)
 {
     struct sockaddr_in addr;
@@ -918,4 +988,6 @@
     memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row));
 
     vnc_dpy_resize(vs->ds, 640, 400);
+
+    vnc_publish_mdns(5900 + display);
 }

                 reply	other threads:[~2006-05-14 15:00 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=446745FA.7090804@gmx.de \
    --to=olig9@gmx.de \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).