summaryrefslogtreecommitdiffstats
path: root/x11vnc/x11vnc.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/x11vnc.c')
-rw-r--r--x11vnc/x11vnc.c132
1 files changed, 126 insertions, 6 deletions
diff --git a/x11vnc/x11vnc.c b/x11vnc/x11vnc.c
index c02f813..70cef69 100644
--- a/x11vnc/x11vnc.c
+++ b/x11vnc/x11vnc.c
@@ -1907,6 +1907,62 @@ static void do_sleepin(char *sleep) {
}
}
+static void check_guess_auth_file(void) {
+ if (!strcasecmp(auth_file, "guess")) {
+ char line[4096], *cmd, *q, *disp = use_dpy ? use_dpy: "";
+ FILE *p;
+ int n;
+ if (!program_name) {
+ rfbLog("-auth guess: no program_name found.\n");
+ clean_up_exit(1);
+ }
+ if (strpbrk(program_name, " \t\r\n")) {
+ rfbLog("-auth guess: whitespace in program_name '%s'\n", program_name);
+ clean_up_exit(1);
+ }
+ if (no_external_cmds || !cmd_ok("findauth")) {
+ rfbLog("-auth guess: cannot run external commands in -nocmds mode:\n");
+ clean_up_exit(1);
+ }
+
+ cmd = (char *)malloc(100 + strlen(program_name) + strlen(disp));
+ sprintf(cmd, "%s -findauth %s", program_name, disp);
+ p = popen(cmd, "r");
+ if (!p) {
+ rfbLog("-auth guess: could not run cmd '%s'\n", cmd);
+ clean_up_exit(1);
+ }
+ memset(line, 0, sizeof(line));
+ n = fread(line, 1, sizeof(line), p);
+ pclose(p);
+ q = strrchr(line, '\n');
+ if (q) *q = '\0';
+ if (!strcmp(disp, "")) {
+ disp = getenv("DISPLAY");
+ if (!disp) {
+ disp = "unset";
+ }
+ }
+ if (!strcmp(line, "")) {
+ rfbLog("-auth guess: failed for display='%s'\n", disp);
+ clean_up_exit(1);
+ } else if (strstr(line, "XAUTHORITY=") != line) {
+ rfbLog("-auth guess: failed. '%s' for display='%s'\n", line, disp);
+ clean_up_exit(1);
+ } else if (!strcmp(line, "XAUTHORITY=")) {
+ rfbLog("-auth guess: using default XAUTHORITY for display='%s'\n", disp);
+ q = getenv("XAUTHORITY");
+ if (q) {
+ *(q-2) = '_'; /* yow */
+ }
+ auth_file = NULL;
+ } else {
+ rfbLog("-auth guess: using '%s' for disp='%s'\n", line, disp);
+ auth_file = strdup(line + strlen("XAUTHORITY="));
+ }
+ }
+}
+
extern int dragum(void);
extern int is_decimal(char *);
@@ -1947,8 +2003,10 @@ int main(int argc, char* argv[]) {
dtime0(&x11vnc_start);
+
if (!getuid() || !geteuid()) {
started_as_root = 1;
+ rfbLog("getuid: %d geteuid: %d\n", getuid(), geteuid());
/* check for '-users =bob' */
immediate_switch_user(argc, argv);
@@ -2091,6 +2149,27 @@ int main(int argc, char* argv[]) {
exit(0);
continue;
}
+ if (!strcmp(arg, "-findauth")) {
+ int ic = 0;
+ if (use_dpy != NULL) {
+ set_env("DISPLAY", use_dpy);
+ }
+ use_dpy = strdup("WAIT:cmd=FINDDISPLAY-run");
+ if (argc > i+1) {
+ set_env("X11VNC_SKIP_DISPLAY", argv[i+1]);
+ } else if (getenv("DISPLAY")) {
+ set_env("X11VNC_SKIP_DISPLAY", getenv("DISPLAY"));
+ } else {
+ set_env("X11VNC_SKIP_DISPLAY", ":0");
+ }
+ set_env("X11VNC_SKIP_DISPLAY_NEGATE", "1");
+ set_env("FIND_DISPLAY_XAUTHORITY_PATH", "1");
+ set_env("FIND_DISPLAY_NO_SHOW_XAUTH", "1");
+ set_env("FIND_DISPLAY_NO_SHOW_DISPLAY", "1");
+ wait_for_client(&ic, NULL, 0);
+ exit(0);
+ continue;
+ }
if (!strcmp(arg, "-create")) {
use_dpy = strdup("WAIT:cmd=FINDCREATEDISPLAY-Xvfb");
continue;
@@ -4635,10 +4714,14 @@ int main(int argc, char* argv[]) {
CLIENT_INIT;
/* open the X display: */
+
if (auth_file) {
- set_env("XAUTHORITY", auth_file);
-if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
+ check_guess_auth_file();
+ if (auth_file != NULL) {
+ set_env("XAUTHORITY", auth_file);
+ }
}
+
#if LIBVNCSERVER_HAVE_XKEYBOARD
/*
* Disable XKEYBOARD before calling XOpenDisplay()
@@ -4724,7 +4807,7 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
;
} else
#endif
- if (use_dpy) {
+ if (use_dpy && strcmp(use_dpy, "")) {
dpy = XOpenDisplay_wr(use_dpy);
#ifdef MACOSX
} else if (!subwin && getenv("DISPLAY")
@@ -4733,11 +4816,36 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
rfbLog("MacOSX: Ignoring $DISPLAY '%s'\n", getenv("DISPLAY"));
rfbLog("MacOSX: Use -display $DISPLAY to force it.\n");
#endif
+ } else if (raw_fb_str != NULL && raw_fb_str[0] != '+' && !got_noviewonly) {
+ rfbLog("Not opening DISPLAY in -rawfb mode (force via -rawfb +str)\n");
+ dpy = NULL; /* don't open it. */
} else if ( (use_dpy = getenv("DISPLAY")) ) {
+ if (strstr(use_dpy, "localhost") == use_dpy) {
+ rfbLog("\n");
+ rfbLog("WARNING: DISPLAY starts with localhost: '%s'\n", use_dpy);
+ rfbLog("WARNING: Is this an SSH X11 port forwarding? You most\n");
+ rfbLog("WARNING: likely don't want x11vnc to use that DISPLAY.\n");
+ rfbLog("WARNING: You probably should supply something\n");
+ rfbLog("WARNING: like: -display :0 to access the physical\n");
+ rfbLog("WARNING: X display on the machine where x11vnc is running.\n");
+ rfbLog("\n");
+ usleep(500 * 1000);
+ } else if (using_shm && use_dpy[0] != ':') {
+ rfbLog("\n");
+ rfbLog("WARNING: DISPLAY might not be local: '%s'\n", use_dpy);
+ rfbLog("WARNING: Is this the DISPLAY of another machine? Usually,\n");
+ rfbLog("WARNING: x11vnc is run on the same machine with the\n");
+ rfbLog("WARNING: physical X display to be exported by VNC. If\n");
+ rfbLog("WARNING: that is what you really meant, supply something\n");
+ rfbLog("WARNING: like: -display :0 on the x11vnc command line.\n");
+ rfbLog("\n");
+ usleep(250 * 1000);
+ }
dpy = XOpenDisplay_wr(use_dpy);
} else {
dpy = XOpenDisplay_wr("");
}
+ last_open_xdisplay = time(NULL);
if (terminal_services_daemon != NULL) {
terminal_services(terminal_services_daemon);
@@ -4751,8 +4859,7 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
#endif
if (! dpy && raw_fb_str) {
- rfbLog("continuing without X display in -rawfb mode, "
- "hold on tight..\n");
+ rfbLog("Continuing without X display in -rawfb mode.\n");
goto raw_fb_pass_go_and_collect_200_dollars;
}
@@ -4771,6 +4878,7 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
fprintf(stderr, "\n");
use_dpy = ":0";
dpy = XOpenDisplay_wr(use_dpy);
+ last_open_xdisplay = time(NULL);
if (dpy) {
rfbLog("*** XOpenDisplay of \":0\" successful.\n");
}
@@ -4805,6 +4913,10 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
if (dpy) {
Window w = XCreateSimpleWindow(dpy, rootwin, 0, 0, 1, 1, 0, 0, 0);
if (! quiet) rfbLog("rootwin: 0x%lx reswin: 0x%lx dpy: 0x%x\n", rootwin, w, dpy);
+ if (w != None) {
+ XDestroyWindow(dpy, w);
+ }
+ XSync(dpy, False);
}
#endif
@@ -5403,6 +5515,10 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
if (speeds_read_rate_measured > 80) {
/* framebuffer read is fast at > 80 MB/sec */
+ int same = 0;
+ if (waitms == defer_update) {
+ same = 1;
+ }
if (! got_waitms) {
waitms /= 2;
if (waitms < 5) {
@@ -5414,7 +5530,11 @@ if (0) fprintf(stderr, "XA: %s\n", getenv("XAUTHORITY"));
}
if (! got_deferupdate && ! got_defer) {
if (defer_update > 10) {
- defer_update = 10;
+ if (same) {
+ defer_update = waitms;
+ } else {
+ defer_update = 10;
+ }
if (screen) {
screen->deferUpdateTime = defer_update;
}