* [Qemu-devel] [Patch] Publish VNC display with zeroconf
@ 2006-05-14 15:00 Oliver Gerlich
0 siblings, 0 replies; only message in thread
From: Oliver Gerlich @ 2006-05-14 15:00 UTC (permalink / raw)
To: qemu-devel
[-- 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);
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-05-14 15:00 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-05-14 15:00 [Qemu-devel] [Patch] Publish VNC display with zeroconf Oliver Gerlich
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.