1
From: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2
Date: Sat, 28 Jan 2012 20:14:32 +0100
3
Subject: Allow Unix domain sockets in gvncviewer
5
gvncviewer is useful when connecting to unix domain sockets.
7
examples/gvncviewer.c | 48 +++++++++++++++++++++++++++++++++++++-----------
8
1 files changed, 37 insertions(+), 11 deletions(-)
10
diff --git a/examples/gvncviewer.c b/examples/gvncviewer.c
11
index 6d47d71..6730b33 100644
12
--- a/examples/gvncviewer.c
13
+++ b/examples/gvncviewer.c
18
+#include <sys/types.h>
19
+#include <sys/stat.h>
21
+#include <sys/socket.h>
25
#include <libview/autoDrawer.h>
26
@@ -586,6 +591,8 @@ int main(int argc, char **argv)
28
GtkWidget *showgrabkeydlg;
29
const char *help_msg = "Run 'gvncviewer --help' to see a full list of available command line options";
30
+ struct stat sockstat;
33
name = g_strdup_printf("- Simple VNC Client on Gtk-VNC %s",
34
vnc_util_get_version_string());
35
@@ -688,17 +695,36 @@ int main(int argc, char **argv)
36
gtk_widget_realize(vnc);
38
snprintf(hostname, sizeof(hostname), "%s", args[0]);
39
- display = strchr(hostname, ':');
43
- snprintf(port, sizeof(port), "%d", 5900 + atoi(display + 1));
45
- snprintf(port, sizeof(port), "%d", 5900);
48
- snprintf(hostname, sizeof(hostname), "%s", "127.0.0.1");
49
- vnc_display_open_host(VNC_DISPLAY(vnc), hostname, port);
50
+ if ((0 == stat(hostname, &sockstat)) &&
51
+ S_ISSOCK(sockstat.st_mode)) {
52
+ size_t sockaddrsize = offsetof(struct sockaddr_un, sun_path) + strlen(hostname) + 1;
53
+ struct sockaddr_un* addr = malloc(sockaddrsize);
55
+ /* the argument refers to a unix domain socket */
56
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
57
+ addr->sun_family = AF_UNIX;
58
+ strcpy(addr->sun_path, hostname);
59
+ if (0 == connect(sock, (const struct sockaddr *)addr, sockaddrsize)) {
60
+ vnc_display_open_fd(VNC_DISPLAY(vnc), sock);
62
+ fprintf(stderr, "Failed to open unix domain socket %s\n", hostname);
67
+ /* treat it as a regular hostname */
68
+ display = strchr(hostname, ':');
72
+ snprintf(port, sizeof(port), "%d", 5900 + atoi(display + 1));
74
+ snprintf(port, sizeof(port), "%d", 5900);
77
+ snprintf(hostname, sizeof(hostname), "%s", "127.0.0.1");
78
+ vnc_display_open_host(VNC_DISPLAY(vnc), hostname, port);
80
vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc), TRUE);
81
vnc_display_set_pointer_grab(VNC_DISPLAY(vnc), TRUE);