diff options
Diffstat (limited to 'x11vnc/x11vnc.c')
-rw-r--r-- | x11vnc/x11vnc.c | 744 |
1 files changed, 407 insertions, 337 deletions
diff --git a/x11vnc/x11vnc.c b/x11vnc/x11vnc.c index c26db31..1df51a5 100644 --- a/x11vnc/x11vnc.c +++ b/x11vnc/x11vnc.c @@ -256,7 +256,7 @@ static int xdamage_base_event_type; #endif /* date +'lastmod: %Y-%m-%d' */ -char lastmod[] = "0.6.3pre lastmod: 2004-12-17"; +char lastmod[] = "0.6.3pre lastmod: 2004-12-19"; /* X display info */ @@ -310,6 +310,9 @@ typedef struct _ClientData { int had_cursor_shape_updates; int had_cursor_pos_updates; int uid; + int client_port; + int server_port; + char *server_ip; } ClientData; /* scaling parameters */ @@ -697,7 +700,7 @@ int scan_hexdec(char *str, unsigned long *num) { void set_env(char *name, char *value) { char *str; - str = malloc(strlen(name)+strlen(value)+2); + str = (char *)malloc(strlen(name)+strlen(value)+2); sprintf(str, "%s=%s", name, value); putenv(str); } @@ -1460,6 +1463,10 @@ char *list_clients(void) { } rfbReleaseClientIterator(iter); + /* + * each client: 123.123.123.123:60000/0x11111111-rw, = 36 bytes + * so count+1 * 100 should cover it. + */ list = (char *) malloc((count+1)*100); list[0] = '\0'; @@ -1553,18 +1560,10 @@ void close_clients(char *str) { */ static int run_user_command(char *cmd, rfbClientPtr client, char *mode) { char *dpystr = DisplayString(dpy); - static char *display_env = NULL; - static char env_rfb_client_id[100]; - static char env_rfb_client_ip[100]; - static char env_rfb_client_port[100]; - static char env_rfb_server_ip[100]; - static char env_rfb_server_port[100]; - static char env_rfb_x11vnc_pid[100]; - static char env_rfb_client_count[100]; - static char env_rfb_mode[100]; + char *old_display = NULL; char *addr = client->host; - int rc, hport; - char *ip_str = NULL; + char str[100]; + int rc; ClientData *cd = (ClientData *) client->clientData; if (addr == NULL || addr[0] == '\0') { @@ -1573,29 +1572,29 @@ static int run_user_command(char *cmd, rfbClientPtr client, char *mode) { /* set RFB_CLIENT_ID to semi unique id for command to use */ if (cd && cd->uid) { - sprintf(env_rfb_client_id, "RFB_CLIENT_ID=0x%x", cd->uid); + sprintf(str, "0x%x", cd->uid); } else { /* not accepted yet: */ - sprintf(env_rfb_client_id, "RFB_CLIENT_ID=0x%x", - clients_served); + sprintf(str, "0x%x", clients_served); } - putenv(env_rfb_client_id); + set_env("RFB_CLIENT_ID", str); /* set RFB_CLIENT_IP to IP addr for command to use */ - sprintf(env_rfb_client_ip, "RFB_CLIENT_IP=%s", addr); - putenv(env_rfb_client_ip); + set_env("RFB_CLIENT_IP", addr); /* set RFB_X11VNC_PID to our pid for command to use */ - sprintf(env_rfb_x11vnc_pid, "RFB_X11VNC_PID=%d", (int) getpid()); - putenv(env_rfb_x11vnc_pid); + sprintf(str, "%d", (int) getpid()); + set_env("RFB_X11VNC_PID", str); /* set RFB_CLIENT_PORT to peer port for command to use */ - hport = get_remote_port(client->sock); - sprintf(env_rfb_client_port, "RFB_CLIENT_PORT=%d", hport); - putenv(env_rfb_client_port); + if (cd && cd->client_port > 0) { + sprintf(str, "%d", cd->client_port); + } else { + sprintf(str, "%d", get_remote_port(client->sock)); + } + set_env("RFB_CLIENT_PORT", str); - sprintf(env_rfb_mode, "RFB_MODE=%s", mode); - putenv(env_rfb_mode); + set_env("RFB_MODE", mode); /* * now do RFB_SERVER_IP and RFB_SERVER_PORT (i.e. us!) @@ -1603,32 +1602,35 @@ static int run_user_command(char *cmd, rfbClientPtr client, char *mode) { * program can potentially use to work out the virtual circuit * for this connection. */ - ip_str = get_local_host(client->sock); - hport = get_local_port(client->sock); - - sprintf(env_rfb_server_ip, "RFB_SERVER_IP=%s", ip_str); - putenv(env_rfb_server_ip); - sprintf(env_rfb_server_port, "RFB_SERVER_PORT=%d", hport); - putenv(env_rfb_server_port); + if (cd && cd->server_ip) { + set_env("RFB_SERVER_IP", cd->server_ip); + } else { + set_env("RFB_SERVER_IP", get_local_host(client->sock)); + } + if (cd && cd->server_port > 0) { + sprintf(str, "%d", cd->server_port); + } else { + sprintf(str, "%d", get_local_port(client->sock)); + } + set_env("RFB_SERVER_PORT", str); /* * Better set DISPLAY to the one we are polling, if they * want something trickier, they can handle on their own - * via environment, etc. XXX really should save/restore old. + * via environment, etc. */ - if (display_env == NULL) { - display_env = (char *) malloc(strlen(dpystr)+10); + if (getenv("DISPLAY")) { + old_display = strdup(getenv("DISPLAY")); } - sprintf(display_env, "DISPLAY=%s", dpystr); - putenv(display_env); + set_env("DISPLAY", dpystr); /* * work out the number of clients (have to use client_count * since there is deadlock in rfbGetClientIterator) */ - sprintf(env_rfb_client_count, "RFB_CLIENT_COUNT=%d", client_count); - putenv(env_rfb_client_count); + sprintf(str, "%d", client_count); + set_env("RFB_CLIENT_COUNT", str); rfbLog("running command:\n"); rfbLog(" %s\n", cmd); @@ -1640,6 +1642,11 @@ static int run_user_command(char *cmd, rfbClientPtr client, char *mode) { } rfbLog("command returned: %d\n", rc); + if (old_display) { + set_env("DISPLAY", old_display); + free(old_display); + } + return rc; } @@ -1651,10 +1658,6 @@ static void client_gone(rfbClientPtr client) { client_count--; rfbLog("client_count: %d\n", client_count); - if (client->clientData) { - free(client->clientData); - } - if (no_autorepeat && client_count == 0) { autorepeat(1); } @@ -1663,6 +1666,14 @@ static void client_gone(rfbClientPtr client) { run_user_command(gone_cmd, client, "gone"); } + if (client->clientData) { + ClientData *cd = (ClientData *) client->clientData; + if (cd && cd->server_ip) { + free(cd->server_ip); + } + free(client->clientData); + } + if (inetd) { rfbLog("viewer exited.\n"); clean_up_exit(0); @@ -2543,14 +2554,14 @@ void read_vnc_connect_prop(void) { } while (bytes_after > 0); vnc_connect_str[VNC_CONNECT_MAX] = '\0'; - if (strlen(vnc_connect_str) > 100) { - char trim[101]; + if (strlen(vnc_connect_str) > 38) { + char trim[100]; trim[0] = '\0'; - strncat(trim, vnc_connect_str, 100); - rfbLog("read X property VNC_CONNECT: %s ...\n", trim); + strncat(trim, vnc_connect_str, 38); + rfbLog("read VNC_CONNECT: %s ...\n", trim); } else { - rfbLog("read X property VNC_CONNECT: %s\n", vnc_connect_str); + rfbLog("read VNC_CONNECT: %s\n", vnc_connect_str); } } @@ -2564,6 +2575,8 @@ static void send_client_connect(void) { process_remote_cmd(client_connect, 0); } else if (strstr(str, "ans=") || strstr(str, "aro=") == str) { ; + } else if (strstr(str, "ack=") == str) { + ; } else { reverse_connect(client_connect); } @@ -2641,6 +2654,10 @@ enum rfbNewClientAction new_client(rfbClientPtr client) { cd->uid = clients_served; + cd->client_port = get_remote_port(client->sock); + cd->server_port = get_local_port(client->sock); + cd->server_ip = strdup(get_remote_host(client->sock)); + client->clientGoneHook = client_gone; client_count++; @@ -4419,7 +4436,8 @@ static void update_x11_pointer(int mask, int x, int y) { X_LOCK; if (use_xwarppointer) { - XWarpPointer(dpy, None, window, 0, 0, 0, 0, x+off_x, y+off_y); + /* off_x and off_y not needed with XWarpPointer */ + XWarpPointer(dpy, None, window, 0, 0, 0, 0, x, y); } else { XTestFakeMotionEvent_wr(dpy, scr, x+off_x, y+off_y, CurrentTime); @@ -4820,7 +4838,6 @@ int handle_subwin_resize(char *msg) { int new_x, new_y; int i, check = 10, ms = 250; /* 2.5 secs... */ - if (0) fprintf(stderr, "IN handle_subwin_resize('%s')\n", msg); if (! subwin) { return 0; /* hmmm... */ } @@ -5473,8 +5490,7 @@ void xcut_receive(char *text, int len, rfbClientPtr cl) { /* * for the wild-n-crazy -remote/-R interface. */ -int send_remote_cmd(char *cmd, int query) { - char *str; +int send_remote_cmd(char *cmd, int query, int wait) { FILE *in = NULL; if (client_connect_file) { @@ -5494,29 +5510,22 @@ int send_remote_cmd(char *cmd, int query) { return 1; } } - str = (char *) malloc((strlen(cmd)+5)); - if (query) { - strcpy(str, "qry="); - } else { - strcpy(str, "cmd="); - } - strcat(str, cmd); if (in != NULL) { fprintf(stderr, "sending remote command: \"%s\"\nvia connect" " file: %s\n", cmd, client_connect_file); - fprintf(in, "%s\n", str); + fprintf(in, "%s\n", cmd); fclose(in); } else { fprintf(stderr, "sending remote command: \"%s\" via VNC_CONNECT" " X property.\n", cmd); - set_vnc_connect_prop(str); + set_vnc_connect_prop(cmd); XFlush(dpy); } - if (strstr(str, "qry=") == str) { + if (query || wait) { char line[VNC_CONNECT_MAX]; - int rc=1, i=0, max=20, ms_sl=100; + int rc=1, i=0, max=70, ms_sl=50; for (i=0; i<max; i++) { usleep(ms_sl * 1000); if (client_connect_file) { @@ -5540,14 +5549,15 @@ int send_remote_cmd(char *cmd, int query) { read_vnc_connect_prop(); strncpy(line, vnc_connect_str, VNC_CONNECT_MAX); } - if (strcmp(str, line)){ - fprintf(stdout, "%s\n", line); - fflush(stdout); + if (strcmp(cmd, line)){ + if (query) { + fprintf(stdout, "%s\n", line); + fflush(stdout); + } rc = 0; break; } } - free(str); if (rc) { fprintf(stderr, "error: could not connect to " "an x11vnc server at %s (rc=%d)\n", @@ -5556,10 +5566,42 @@ int send_remote_cmd(char *cmd, int query) { } return rc; } - free(str); return 0; } +int do_remote_query(char *remote_cmd, char *query_cmd, int remote_sync) { + char *rcmd = NULL, *qcmd = NULL; + int rc = 1; + + if (remote_cmd) { + rcmd = (char *)malloc(strlen(remote_cmd) + 5); + strcpy(rcmd, "cmd="); + strcat(rcmd, remote_cmd); + } + if (query_cmd) { + qcmd = (char *)malloc(strlen(query_cmd) + 5); + strcpy(qcmd, "qry="); + strcat(qcmd, query_cmd); + } + + if (rcmd && qcmd) { + rc = send_remote_cmd(rcmd, 0, 1); + if (rc) { + free(rcmd); + free(qcmd); + return(rc); + } + rc = send_remote_cmd(qcmd, 1, 1); + } else if (rcmd) { + rc = send_remote_cmd(rcmd, 0, remote_sync); + free(rcmd); + } else if (qcmd) { + rc = send_remote_cmd(qcmd, 1, 1); + free(qcmd); + } + return rc; +} + char *add_item(char *instr, char *item) { char *p, *str; int len, saw_item = 0; @@ -5652,7 +5694,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { char *p = cmd; char *co = ""; char buf[VNC_CONNECT_MAX]; - int do_vnc_connect = 0; + int bufn = VNC_CONNECT_MAX; int query = 0; static char *prev_cursors_mode = NULL; @@ -5661,6 +5703,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { return NULL; } + strcpy(buf, ""); if (strstr(cmd, "cmd=") == cmd) { p += strlen("cmd="); } else if (strstr(cmd, "qry=") == cmd) { @@ -5673,8 +5716,16 @@ char *process_remote_cmd(char *cmd, int stringonly) { s = strdup(cmd + strlen("qry=")); q = strtok(s, ","); while (q) { - sprintf(tmp, "qry=%s", q); + strcpy(tmp, "qry="); + strncat(tmp, q, 500); res = process_remote_cmd(tmp, 1); + if (res && strlen(buf)+strlen(res) + >= VNC_CONNECT_MAX - 1) { + rfbLog("overflow in process_remote_cmd:" + " %s -- %s\n", buf, res); + free(res); + break; + } if (res) { strcat(buf, res); free(res); @@ -5690,48 +5741,9 @@ char *process_remote_cmd(char *cmd, int stringonly) { p += strlen("qry="); } else { rfbLog("ignoring malformed command: %s\n", cmd); - return NULL; + goto done; } - if (!query && strstr(p, "file:") == p) { - /* process command from a script file */ - FILE *in; - char line[VNC_CONNECT_MAX], cmd[VNC_CONNECT_MAX]; - int sz = VNC_CONNECT_MAX - 6; - p += strlen("file:"); - in = fopen(p, "r"); - if (in == NULL) { - rfbLog("process_remote_cmd: could not open cmd file" - " '%s'\n", p); - return NULL; - } - rfbLog("process_remote_cmd: running command from '%s'\n", p); - while (fgets(line, sz, in) != NULL) { - char *q; - if (strlen(line)) { - q = line + strlen(line) - 1; - if (*q == '\n') { - *q = '\0'; - } - while (q > line && isspace(*q)) { - *q = '\0'; - q--; - } - } - q = line; - while (isspace(*q)) { - q++; - } - if ( *q == '#' || *q == '\0') { - continue; - } - strcpy(cmd, "cmd="); - strcat(cmd, q); - process_remote_cmd(cmd, 0); - } - fclose(in); - return NULL; - } /* always call like: COLON_CHECK("foobar:") */ #define COLON_CHECK(str) \ @@ -5750,9 +5762,9 @@ char *process_remote_cmd(char *cmd, int stringonly) { #define NOTAPP \ if (query) { \ if (strchr(p, ':')) { \ - sprintf(buf, "ans=%sN/A", p); \ + snprintf(buf, bufn, "ans=%sN/A", p); \ } else { \ - sprintf(buf, "ans=%s:N/A", p); \ + snprintf(buf, bufn, "ans=%s:N/A", p); \ } \ goto qry; \ } @@ -5760,9 +5772,9 @@ char *process_remote_cmd(char *cmd, int stringonly) { #define NOTAPPRO \ if (query) { \ if (strchr(p, ':')) { \ - sprintf(buf, "aro=%sN/A", p); \ + snprintf(buf, bufn, "aro=%sN/A", p); \ } else { \ - sprintf(buf, "aro=%s:N/A", p); \ + snprintf(buf, bufn, "aro=%s:N/A", p); \ } \ goto qry; \ } @@ -5780,9 +5792,9 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "ping")) { query = 1; if (rfb_desktop_name) { - sprintf(buf, "ans=%s:%s", p, rfb_desktop_name); + snprintf(buf, bufn, "ans=%s:%s", p, rfb_desktop_name); } else { - sprintf(buf, "ans=%s:%s", p, "unknown"); + snprintf(buf, bufn, "ans=%s:%s", p, "unknown"); } goto qry; @@ -5841,7 +5853,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { Window twin; COLON_CHECK("id:") if (query) { - sprintf(buf, "ans=%s%s0x%lx", p, co, subwin); + snprintf(buf, bufn, "ans=%s%s0x%lx", p, co, subwin); goto qry; } p += strlen("id:"); @@ -5857,7 +5869,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { ok = 1; } } else if (! scan_hexdec(p, &twin)) { - rfbLog("-id: incorrect hex/dec number: %s\n", p); + rfbLog("-id: skipping incorrect hex/dec number: %s\n", p); } else { ok = 1; } @@ -5877,7 +5889,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { Window twin; COLON_CHECK("sid:") if (query) { - sprintf(buf, "ans=%s%s0x%lx", p, co, subwin); + snprintf(buf, bufn, "ans=%s%s0x%lx", p, co, subwin); goto qry; } p += strlen("sid:"); @@ -5893,7 +5905,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { ok = 1; } } else if (! scan_hexdec(p, &twin)) { - rfbLog("-sid: incorrect hex/dec number: %s\n", p); + rfbLog("-sid: skipping incorrect hex/dec number: %s\n", p); } else { ok = 1; } @@ -5911,14 +5923,14 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "flashcmap")) { if (query) { - sprintf(buf, "ans=%s:%d", p, flash_cmap); + snprintf(buf, bufn, "ans=%s:%d", p, flash_cmap); goto qry; } rfbLog("process_remote_cmd: turning on flashcmap mode.\n"); flash_cmap = 1; } else if (!strcmp(p, "noflashcmap")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !flash_cmap); + snprintf(buf, bufn, "ans=%s:%d", p, !flash_cmap); goto qry; } rfbLog("process_remote_cmd: turning off flashcmap mode.\n"); @@ -5927,7 +5939,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "truecolor")) { int orig = force_indexed_color; if (query) { - sprintf(buf, "ans=%s:%d", p, !force_indexed_color); + snprintf(buf, bufn, "ans=%s:%d", p, !force_indexed_color); goto qry; } rfbLog("process_remote_cmd: turning off notruecolor mode.\n"); @@ -5938,7 +5950,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "notruecolor")) { int orig = force_indexed_color; if (query) { - sprintf(buf, "ans=%s:%d", p, force_indexed_color); + snprintf(buf, bufn, "ans=%s:%d", p, force_indexed_color); goto qry; } rfbLog("process_remote_cmd: turning on notruecolor mode.\n"); @@ -5949,7 +5961,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "overlay")) { if (query) { - sprintf(buf, "ans=%s:%d", p, overlay); + snprintf(buf, bufn, "ans=%s:%d", p, overlay); goto qry; } rfbLog("process_remote_cmd: turning on -overlay mode.\n"); @@ -5971,7 +5983,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nooverlay")) { int orig = overlay; if (query) { - sprintf(buf, "ans=%s:%d", p, !overlay); + snprintf(buf, bufn, "ans=%s:%d", p, !overlay); goto qry; } rfbLog("process_remote_cmd: turning off overlay mode\n"); @@ -5988,7 +6000,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "overlay_cursor") || !strcmp(p, "overlay_yescursor")) { if (query) { - sprintf(buf, "ans=%s:%d", p, overlay_cursor); + snprintf(buf, bufn, "ans=%s:%d", p, overlay_cursor); goto qry; } rfbLog("process_remote_cmd: turning on overlay_cursor mode.\n"); @@ -6005,7 +6017,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nooverlay_cursor") || !strcmp(p, "overlay_nocursor")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !overlay_cursor); + snprintf(buf, bufn, "ans=%s:%d", p, !overlay_cursor); goto qry; } rfbLog("process_remote_cmd: turning off overlay_cursor mode\n"); @@ -6022,7 +6034,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "visual") == p) { COLON_CHECK("visual:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(visual_str)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(visual_str)); goto qry; } p += strlen("visual:"); @@ -6032,10 +6045,11 @@ char *process_remote_cmd(char *cmd, int stringonly) { /* OK, this requires a new fb... */ do_new_fb(0); - } else if (strstr(p, "scale") == p) { + } else if (!strcmp(p, "scale") || + strstr(p, "scale:") == p) { /* skip-cmd-list */ COLON_CHECK("scale:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(scale_str)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, NONUL(scale_str)); goto qry; } p += strlen("scale:"); @@ -6048,20 +6062,20 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "viewonly")) { if (query) { - sprintf(buf, "ans=%s:%d", p, view_only); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, view_only); goto qry; } rfbLog("process_remote_cmd: enable viewonly mode.\n"); view_only = 1; } else if (!strcmp(p, "noviewonly")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !view_only); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !view_only); goto qry; } rfbLog("process_remote_cmd: disable viewonly mode.\n"); view_only = 0; } else if (!strcmp(p, "shared")) { if (query) { - sprintf(buf, "ans=%s:%d", p, shared); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, shared); goto qry; } rfbLog("process_remote_cmd: enable sharing.\n"); shared = 1; @@ -6069,7 +6083,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { screen->neverShared = FALSE; } else if (!strcmp(p, "noshared")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !shared); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !shared); goto qry; } rfbLog("process_remote_cmd: disable sharing.\n"); shared = 0; @@ -6078,26 +6092,28 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "forever")) { if (query) { - sprintf(buf, "ans=%s:%d", p, 1-connect_once); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, 1-connect_once); + goto qry; } rfbLog("process_remote_cmd: enable -forever mode.\n"); connect_once = 0; } else if (!strcmp(p, "noforever") || !strcmp(p, "once")) { if (query) { - sprintf(buf, "ans=%s:%d", p, connect_once); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, connect_once); + goto qry; } rfbLog("process_remote_cmd: disable -forever mode.\n"); connect_once = 1; } else if (!strcmp(p, "deny") || !strcmp(p, "lock")) { if (query) { - sprintf(buf, "ans=%s:%d", p, deny_all); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, deny_all); goto qry; } rfbLog("process_remote_cmd: denying new connections.\n"); deny_all = 1; } else if (!strcmp(p, "nodeny") || !strcmp(p, "unlock")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !deny_all); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !deny_all); goto qry; } rfbLog("process_remote_cmd: allowing new connections.\n"); deny_all = 0; @@ -6105,8 +6121,10 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "connect") == p) { NOTAPP COLON_CHECK("connect:") - p += strlen("connect:"); /* handled at end */ - do_vnc_connect = 1; + p += strlen("connect:"); + /* this is a reverse connection */ + strncpy(vnc_connect_str, p, VNC_CONNECT_MAX); + vnc_connect_str[VNC_CONNECT_MAX] = '\0'; } else if (strstr(p, "allowonce") == p) { NOTAPP @@ -6119,14 +6137,15 @@ char *process_remote_cmd(char *cmd, int stringonly) { char *before, *old; COLON_CHECK("allow:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(allow_list)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(allow_list)); goto qry; } p += strlen("allow:"); if (allow_list && strchr(allow_list, '/')) { rfbLog("process_remote_cmd: cannot use allow:host\n"); rfbLog("in '-allow %s' mode.\n", allow_list); - return NULL; + goto done; } if (allow_list) { before = strdup(allow_list); @@ -6160,7 +6179,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { if (allow_list && !strcmp(allow_list, "127.0.0.1")) { state = 1; } - sprintf(buf, "ans=%s:%d", p, state); + snprintf(buf, bufn, "ans=%s:%d", p, state); goto qry; } if (allow_list) { @@ -6186,7 +6205,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { if (allow_list && !strcmp(allow_list, "127.0.0.1")) { state = 1; } - sprintf(buf, "ans=%s:%d", p, !state); + snprintf(buf, bufn, "ans=%s:%d", p, !state); goto qry; } if (allow_list) { @@ -6209,7 +6228,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "accept") == p) { COLON_CHECK("accept:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(accept_cmd)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(accept_cmd)); goto qry; } if (safe_remote_only) { @@ -6223,7 +6243,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "gone") == p) { COLON_CHECK("gone:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(gone_cmd)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, NONUL(gone_cmd)); goto qry; } if (safe_remote_only) { @@ -6237,7 +6257,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "shm")) { int orig = using_shm; if (query) { - sprintf(buf, "ans=%s:%d", p, using_shm); + snprintf(buf, bufn, "ans=%s:%d", p, using_shm); goto qry; } rfbLog("process_remote_cmd: turning off noshm mode.\n"); @@ -6250,7 +6270,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noshm")) { int orig = using_shm; if (query) { - sprintf(buf, "ans=%s:%d", p, !using_shm); + snprintf(buf, bufn, "ans=%s:%d", p, !using_shm); goto qry; } rfbLog("process_remote_cmd: turning on noshm mode.\n"); @@ -6264,7 +6284,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "flipbyteorder")) { int orig = flip_byte_order; if (query) { - sprintf(buf, "ans=%s:%d", p, flip_byte_order); + snprintf(buf, bufn, "ans=%s:%d", p, flip_byte_order); goto qry; } rfbLog("process_remote_cmd: turning on flipbyteorder mode.\n"); @@ -6279,7 +6299,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noflipbyteorder")) { int orig = flip_byte_order; if (query) { - sprintf(buf, "ans=%s:%d", p, !flip_byte_order); + snprintf(buf, bufn, "ans=%s:%d", p, !flip_byte_order); goto qry; } rfbLog("process_remote_cmd: turning off flipbyteorder mode.\n"); @@ -6294,13 +6314,14 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "onetile")) { if (query) { - sprintf(buf, "ans=%s:%d", p, single_copytile); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, single_copytile); + goto qry; } rfbLog("process_remote_cmd: enable -onetile mode.\n"); single_copytile = 1; } else if (!strcmp(p, "noonetile")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !single_copytile); + snprintf(buf, bufn, "ans=%s:%d", p, !single_copytile); goto qry; } rfbLog("process_remote_cmd: disable -onetile mode.\n"); @@ -6315,7 +6336,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { char *before, *old; COLON_CHECK("blackout:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, + snprintf(buf, bufn, "ans=%s%s%s", p, co, NONUL(blackout_string)); goto qry; } @@ -6352,7 +6373,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "xinerama")) { if (query) { - sprintf(buf, "ans=%s:%d", p, xinerama); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, xinerama); goto qry; } rfbLog("process_remote_cmd: enable xinerama mode." "(if applicable).\n"); @@ -6360,7 +6381,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { initialize_blackouts_and_xinerama(); } else if (!strcmp(p, "noxinerama")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !xinerama); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !xinerama); goto qry; } rfbLog("process_remote_cmd: disable xinerama mode." "(if applicable).\n"); @@ -6370,7 +6391,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "xrandr")) { int orig = xrandr; if (query) { - sprintf(buf, "ans=%s:%d", p, xrandr); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, xrandr); goto qry; } if (xrandr_present) { rfbLog("process_remote_cmd: enable xrandr mode.\n"); @@ -6388,7 +6409,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noxrandr")) { int orig = xrandr; if (query) { - sprintf(buf, "ans=%s:%d", p, !xrandr); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !xrandr); goto qry; } xrandr = 0; if (xrandr_present) { @@ -6404,7 +6425,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { int orig = xrandr; COLON_CHECK("xrandr_mode:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(xrandr_mode)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(xrandr_mode)); goto qry; } p += strlen("xrandr_mode:"); @@ -6416,7 +6438,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { xrandr_mode = strdup(p); } else { rfbLog("skipping unknown xrandr mode: %s\n", p); - return NULL; + goto done; } xrandr = 1; } @@ -6442,7 +6464,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "padgeom") == p) { COLON_CHECK("padgeom:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(pad_geometry)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(pad_geometry)); goto qry; } p += strlen("padgeom:"); @@ -6459,20 +6482,20 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "quiet") || !strcmp(p, "q")) { if (query) { - sprintf(buf, "ans=%s:%d", p, quiet); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, quiet); goto qry; } rfbLog("process_remote_cmd: turning on quiet mode.\n"); quiet = 1; } else if (!strcmp(p, "noquiet")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !quiet); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !quiet); goto qry; } rfbLog("process_remote_cmd: turning off quiet mode.\n"); quiet = 0; } else if (!strcmp(p, "modtweak")) { if (query) { - sprintf(buf, "ans=%s:%d", p, use_modifier_tweak); + snprintf(buf, bufn, "ans=%s:%d", p, use_modifier_tweak); goto qry; } rfbLog("process_remote_cmd: enabling -modtweak mode.\n"); @@ -6484,7 +6507,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nomodtweak")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !use_modifier_tweak); + snprintf(buf, bufn, "ans=%s:%d", p, !use_modifier_tweak); goto qry; } rfbLog("process_remote_cmd: enabling -nomodtweak mode.\n"); @@ -6492,13 +6515,13 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "xkb")) { if (query) { - sprintf(buf, "ans=%s:%d", p, use_xkb_modtweak); + snprintf(buf, bufn, "ans=%s:%d", p, use_xkb_modtweak); goto qry; } if (! xkb_present) { rfbLog("process_remote_cmd: cannot enable -xkb " "modtweak mode (not supported on X display)\n"); - return NULL; + goto done; } rfbLog("process_remote_cmd: enabling -xkb modtweak mode" " (if supported).\n"); @@ -6512,13 +6535,13 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noxkb")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !use_xkb_modtweak); + snprintf(buf, bufn, "ans=%s:%d", p, !use_xkb_modtweak); goto qry; } if (! xkb_present) { rfbLog("process_remote_cmd: cannot disable -xkb " "modtweak mode (not supported on X display)\n"); - return NULL; + goto done; } rfbLog("process_remote_cmd: disabling -xkb modtweak mode.\n"); use_xkb_modtweak = 0; @@ -6526,7 +6549,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "skip_keycodes") == p) { COLON_CHECK("skip_keycodes:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(skip_keycodes)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(skip_keycodes)); goto qry; } p += strlen("skip_keycodes:"); @@ -6549,7 +6573,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "add_keysyms")) { if (query) { - sprintf(buf, "ans=%s:%d", p, add_keysyms); + snprintf(buf, bufn, "ans=%s:%d", p, add_keysyms); goto qry; } rfbLog("process_remote_cmd: enabling -add_keysyms mode.\n"); @@ -6557,7 +6581,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noadd_keysyms")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !add_keysyms); + snprintf(buf, bufn, "ans=%s:%d", p, !add_keysyms); goto qry; } rfbLog("process_remote_cmd: disabling -add_keysyms mode.\n"); @@ -6565,7 +6589,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "clear_mods")) { if (query) { - sprintf(buf, "ans=%s:%d", p, clear_mods == 1); + snprintf(buf, bufn, "ans=%s:%d", p, clear_mods == 1); goto qry; } rfbLog("process_remote_cmd: enabling -clear_mods mode.\n"); @@ -6574,7 +6598,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noclear_mods")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !(clear_mods == 1)); + snprintf(buf, bufn, "ans=%s:%d", p, !(clear_mods == 1)); goto qry; } rfbLog("process_remote_cmd: disabling -clear_mods mode.\n"); @@ -6582,7 +6606,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "clear_keys")) { if (query) { - sprintf(buf, "ans=%s:%d", p, clear_mods == 2); + snprintf(buf, bufn, "ans=%s:%d", p, clear_mods == 2); goto qry; } rfbLog("process_remote_cmd: enabling -clear_keys mode.\n"); @@ -6591,7 +6615,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noclear_keys")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !(clear_mods == 2)); + snprintf(buf, bufn, "ans=%s:%d", p, !(clear_mods == 2)); goto qry; } rfbLog("process_remote_cmd: disabling -clear_keys mode.\n"); @@ -6601,7 +6625,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { char *before, *old; COLON_CHECK("remap:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(remap_file)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(remap_file)); goto qry; } p += strlen("remap:"); @@ -6609,7 +6634,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { strchr(remap_file, '/')) { rfbLog("process_remote_cmd: cannot use remap:+/-\n"); rfbLog("in '-remap %s' mode.\n", remap_file); - return NULL; + goto done; } if (remap_file) { before = strdup(remap_file); @@ -6640,7 +6665,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "repeat")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !no_autorepeat); + snprintf(buf, bufn, "ans=%s:%d", p, !no_autorepeat); goto qry; } rfbLog("process_remote_cmd: enabling -repeat mode.\n"); @@ -6651,7 +6676,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "norepeat")) { if (query) { - sprintf(buf, "ans=%s:%d", p, no_autorepeat); + snprintf(buf, bufn, "ans=%s:%d", p, no_autorepeat); goto qry; } rfbLog("process_remote_cmd: enabling -norepeat mode.\n"); @@ -6663,7 +6688,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "bell")) { if (query) { - sprintf(buf, "ans=%s:%d", p, sound_bell); + snprintf(buf, bufn, "ans=%s:%d", p, sound_bell); goto qry; } rfbLog("process_remote_cmd: enabling bell (if supported).\n"); @@ -6671,7 +6696,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nobell")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !sound_bell); + snprintf(buf, bufn, "ans=%s:%d", p, !sound_bell); goto qry; } rfbLog("process_remote_cmd: disabling bell.\n"); @@ -6679,7 +6704,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "sel")) { if (query) { - sprintf(buf, "ans=%s:%d", p, watch_selection); + snprintf(buf, bufn, "ans=%s:%d", p, watch_selection); goto qry; } rfbLog("process_remote_cmd: enabling watch_selection.\n"); @@ -6687,7 +6712,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nosel")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !watch_selection); + snprintf(buf, bufn, "ans=%s:%d", p, !watch_selection); goto qry; } rfbLog("process_remote_cmd: disabling watch_selection.\n"); @@ -6695,7 +6720,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "primary")) { if (query) { - sprintf(buf, "ans=%s:%d", p, watch_primary); + snprintf(buf, bufn, "ans=%s:%d", p, watch_primary); goto qry; } rfbLog("process_remote_cmd: enabling watch_primary.\n"); @@ -6703,7 +6728,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noprimary")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !watch_primary); + snprintf(buf, bufn, "ans=%s:%d", p, !watch_primary); goto qry; } rfbLog("process_remote_cmd: disabling watch_primary.\n"); @@ -6715,7 +6740,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "cursorshape")) { if (query) { - sprintf(buf, "ans=%s:%d", p, cursor_shape_updates); + snprintf(buf, bufn, "ans=%s:%d", p, cursor_shape_updates); goto qry; } rfbLog("process_remote_cmd: turning on cursorshape mode.\n"); @@ -6727,7 +6752,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nocursorshape")) { int i, max = 5; if (query) { - sprintf(buf, "ans=%s:%d", p, !cursor_shape_updates); + snprintf(buf, bufn, "ans=%s:%d", p, !cursor_shape_updates); goto qry; } rfbLog("process_remote_cmd: turning off cursorshape mode.\n"); @@ -6743,14 +6768,14 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "cursorpos")) { if (query) { - sprintf(buf, "ans=%s:%d", p, cursor_pos_updates); + snprintf(buf, bufn, "ans=%s:%d", p, cursor_pos_updates); goto qry; } rfbLog("process_remote_cmd: turning on cursorpos mode.\n"); cursor_pos_updates = 1; } else if (!strcmp(p, "nocursorpos")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !cursor_pos_updates); + snprintf(buf, bufn, "ans=%s:%d", p, !cursor_pos_updates); goto qry; } rfbLog("process_remote_cmd: turning off cursorpos mode.\n"); @@ -6759,7 +6784,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "cursor") == p) { COLON_CHECK("cursor:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, + snprintf(buf, bufn, "ans=%s%s%s", p, co, NONUL(multiple_cursors_mode)); goto qry; } @@ -6783,7 +6808,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "show_cursor")) { if (query) { - sprintf(buf, "ans=%s:%d", p, show_cursor); + snprintf(buf, bufn, "ans=%s:%d", p, show_cursor); goto qry; } rfbLog("process_remote_cmd: enabling show_cursor.\n"); @@ -6803,7 +6828,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { initialize_cursors_mode(); } else if (!strcmp(p, "noshow_cursor") || !strcmp(p, "nocursor")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !show_cursor); + snprintf(buf, bufn, "ans=%s:%d", p, !show_cursor); goto qry; } if (prev_cursors_mode) free(prev_cursors_mode); @@ -6815,13 +6840,13 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "xfixes")) { if (query) { - sprintf(buf, "ans=%s:%d", p, use_xfixes); + snprintf(buf, bufn, "ans=%s:%d", p, use_xfixes); goto qry; } if (! xfixes_present) { rfbLog("process_remote_cmd: cannot enable xfixes " "(not supported on X display)\n"); - return NULL; + goto done; } rfbLog("process_remote_cmd: enabling -xfixes" " (if supported).\n"); @@ -6829,28 +6854,28 @@ char *process_remote_cmd(char *cmd, int stringonly) { initialize_xfixes(); } else if (!strcmp(p, "noxfixes")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !use_xfixes); + snprintf(buf, bufn, "ans=%s:%d", p, !use_xfixes); goto qry; } if (! xfixes_present) { rfbLog("process_remote_cmd: disabling xfixes " "(but not supported on X display)\n"); - return NULL; + goto done; } rfbLog("process_remote_cmd: disabling -xfixes.\n"); use_xfixes = 0; initialize_xfixes(); - } else if (strstr(p, "xwarp") == p || strstr(p, "xwarppointer")) { + } else if (strstr(p, "xwarp") == p || strstr(p, "xwarppointer") == p) { if (query) { - sprintf(buf, "ans=%s:%d", p, use_xwarppointer); + snprintf(buf, bufn, "ans=%s:%d", p, use_xwarppointer); goto qry; } rfbLog("process_remote_cmd: turning on xwarppointer mode.\n"); use_xwarppointer = 1; - } else if (strstr(p, "noxwarp") == p || strstr(p, "noxwarppointer")) { + } else if (strstr(p, "noxwarp") == p || strstr(p, "noxwarppointer") == p) { if (query) { - sprintf(buf, "ans=%s:%d", p, !use_xwarppointer); + snprintf(buf, bufn, "ans=%s:%d", p, !use_xwarppointer); goto qry; } rfbLog("process_remote_cmd: turning off xwarppointer mode.\n"); @@ -6859,7 +6884,8 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "buttonmap") == p) { COLON_CHECK("buttonmap:") if (query) { - sprintf(buf, "ans=%s%s%s", p, co, NONUL(pointer_remap)); + snprintf(buf, bufn, "ans=%s%s%s", p, co, + NONUL(pointer_remap)); goto qry; } p += strlen("buttonmap:"); @@ -6872,14 +6898,14 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "dragging")) { if (query) { - sprintf(buf, "ans=%s:%d", p, show_dragging); + snprintf(buf, bufn, "ans=%s:%d", p, show_dragging); goto qry; } rfbLog("process_remote_cmd: enabling mouse dragging mode.\n"); show_dragging = 1; } else if (!strcmp(p, "nodragging")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !show_dragging); + snprintf(buf, bufn, "ans=%s:%d", p, !show_dragging); goto qry; } rfbLog("process_remote_cmd: enabling mouse nodragging mode.\n"); @@ -6889,7 +6915,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int pm; COLON_CHECK("pointer_mode:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, pointer_mode); + snprintf(buf, bufn, "ans=%s%s%d", p, co, pointer_mode); goto qry; } p += strlen("pointer_mode:"); @@ -6906,7 +6932,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int is; COLON_CHECK("input_skip:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, ui_skip); + snprintf(buf, bufn, "ans=%s%s%d", p, co, ui_skip); goto qry; } p += strlen("input_skip:"); @@ -6916,14 +6942,14 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "debug_pointer") || !strcmp(p, "dp")) { if (query) { - sprintf(buf, "ans=%s:%d", p, debug_pointer); + snprintf(buf, bufn, "ans=%s:%d", p, debug_pointer); goto qry; } rfbLog("process_remote_cmd: turning on debug_pointer.\n"); debug_pointer = 1; } else if (!strcmp(p, "nodebug_pointer") || !strcmp(p, "nodp")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !debug_pointer); + snprintf(buf, bufn, "ans=%s:%d", p, !debug_pointer); goto qry; } rfbLog("process_remote_cmd: turning off debug_pointer.\n"); @@ -6931,14 +6957,14 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "debug_keyboard") || !strcmp(p, "dk")) { if (query) { - sprintf(buf, "ans=%s:%d", p, debug_keyboard); + snprintf(buf, bufn, "ans=%s:%d", p, debug_keyboard); goto qry; } rfbLog("process_remote_cmd: turning on debug_keyboard.\n"); debug_keyboard = 1; } else if (!strcmp(p, "nodebug_keyboard") || !strcmp(p, "nodk")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !debug_keyboard); + snprintf(buf, bufn, "ans=%s:%d", p, !debug_keyboard); goto qry; } rfbLog("process_remote_cmd: turning off debug_keyboard.\n"); @@ -6948,7 +6974,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int d; COLON_CHECK("deferupdate:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, + snprintf(buf, bufn, "ans=%s%s%d", p, co, screen->deferUpdateTime); goto qry; } @@ -6962,7 +6988,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int d; COLON_CHECK("defer:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, + snprintf(buf, bufn, "ans=%s%s%d", p, co, screen->deferUpdateTime); goto qry; } @@ -6977,7 +7003,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int w; COLON_CHECK("wait:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, waitms); + snprintf(buf, bufn, "ans=%s%s%d", p, co, waitms); goto qry; } p += strlen("wait:"); @@ -6989,13 +7015,13 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "nap")) { if (query) { - sprintf(buf, "ans=%s:%d", p, take_naps); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, take_naps); goto qry; } rfbLog("process_remote_cmd: turning on nap mode.\n"); take_naps = 1; } else if (!strcmp(p, "nonap")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !take_naps); goto qry; + snprintf(buf, bufn, "ans=%s:%d", p, !take_naps); goto qry; } rfbLog("process_remote_cmd: turning off nap mode.\n"); take_naps = 0; @@ -7004,7 +7030,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int w; COLON_CHECK("sb:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, screen_blank); + snprintf(buf, bufn, "ans=%s%s%d", p, co, screen_blank); goto qry; } p += strlen("sb:"); @@ -7017,7 +7043,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int w; COLON_CHECK("screen_blank:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, screen_blank); + snprintf(buf, bufn, "ans=%s%s%d", p, co, screen_blank); goto qry; } p += strlen("screen_blank:"); @@ -7030,7 +7056,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (strstr(p, "fs") == p) { COLON_CHECK("fs:") if (query) { - sprintf(buf, "ans=%s%s%f", p, co, fs_frac); + snprintf(buf, bufn, "ans=%s%s%f", p, co, fs_frac); goto qry; } p += strlen("fs:"); @@ -7041,7 +7067,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int g; COLON_CHECK("gaps:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, gaps_fill); + snprintf(buf, bufn, "ans=%s%s%d", p, co, gaps_fill); goto qry; } p += strlen("gaps:"); @@ -7054,7 +7080,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int g; COLON_CHECK("grow:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, grow_fill); + snprintf(buf, bufn, "ans=%s%s%d", p, co, grow_fill); goto qry; } p += strlen("grow:"); @@ -7067,7 +7093,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int f; COLON_CHECK("fuzz:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, tile_fuzz); + snprintf(buf, bufn, "ans=%s%s%d", p, co, tile_fuzz); goto qry; } p += strlen("fuzz:"); @@ -7081,7 +7107,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { int f; COLON_CHECK("progressive:") if (query) { - sprintf(buf, "ans=%s%s%d", p, co, + snprintf(buf, bufn, "ans=%s%s%d", p, co, screen->progressiveSliceHeight); goto qry; } @@ -7094,7 +7120,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "noremote")) { if (query) { - sprintf(buf, "ans=%s:%d", p, !accept_remote_cmds); + snprintf(buf, bufn, "ans=%s:%d", p, !accept_remote_cmds); goto qry; } rfbLog("process_remote_cmd: disabling remote commands.\n"); @@ -7107,114 +7133,119 @@ char *process_remote_cmd(char *cmd, int stringonly) { char *d = DisplayString(dpy); if (! d) d = "unknown"; if (*d == ':') { - sprintf(buf, "aro=%s:%s%s", p, this_host(), d); + snprintf(buf, bufn, "aro=%s:%s%s", p, + this_host(), d); } else { - sprintf(buf, "aro=%s:%s", p, d); + snprintf(buf, bufn, "aro=%s:%s", p, d); } } else if (!strcmp(p, "vncdisplay")) { - sprintf(buf, "aro=%s:%s", p, NONUL(vnc_desktop_name)); + snprintf(buf, bufn, "aro=%s:%s", p, + NONUL(vnc_desktop_name)); } else if (!strcmp(p, "desktopname")) { - sprintf(buf, "aro=%s:%s", p, NONUL(rfb_desktop_name)); + snprintf(buf, bufn, "aro=%s:%s", p, + NONUL(rfb_desktop_name)); } else if (!strcmp(p, "desktop")) { - sprintf(buf, "aro=%s:%s", p, NONUL(rfb_desktop_name)); + snprintf(buf, bufn, "aro=%s:%s", p, + NONUL(rfb_desktop_name)); } else if (!strcmp(p, "auth")) { - sprintf(buf, "aro=%s:%s", p, NONUL(auth_file)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(auth_file)); } else if (!strcmp(p, "rootshift")) { - sprintf(buf, "aro=%s:%d", p, rootshift); + snprintf(buf, bufn, "aro=%s:%d", p, rootshift); } else if (!strcmp(p, "scale_str")) { - sprintf(buf, "aro=%s:%s", p, NONUL(scale_str)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(scale_str)); } else if (!strcmp(p, "scaled_x")) { - sprintf(buf, "aro=%s:%d", p, scaled_x); + snprintf(buf, bufn, "aro=%s:%d", p, scaled_x); } else if (!strcmp(p, "scaled_y")) { - sprintf(buf, "aro=%s:%d", p, scaled_y); + snprintf(buf, bufn, "aro=%s:%d", p, scaled_y); } else if (!strcmp(p, "scale_numer")) { - sprintf(buf, "aro=%s:%d", p, scale_numer); + snprintf(buf, bufn, "aro=%s:%d", p, scale_numer); } else if (!strcmp(p, "scale_denom")) { - sprintf(buf, "aro=%s:%d", p, scale_denom); + snprintf(buf, bufn, "aro=%s:%d", p, scale_denom); } else if (!strcmp(p, "scale_fac")) { - sprintf(buf, "aro=%s:%f", p, scale_fac); + snprintf(buf, bufn, "aro=%s:%f", p, scale_fac); } else if (!strcmp(p, "scaling_noblend")) { - sprintf(buf, "aro=%s:%d", p, scaling_noblend); + snprintf(buf, bufn, "aro=%s:%d", p, scaling_noblend); } else if (!strcmp(p, "scaling_nomult4")) { - sprintf(buf, "aro=%s:%d", p, scaling_nomult4); + snprintf(buf, bufn, "aro=%s:%d", p, scaling_nomult4); } else if (!strcmp(p, "scaling_pad")) { - sprintf(buf, "aro=%s:%d", p, scaling_pad); + snprintf(buf, bufn, "aro=%s:%d", p, scaling_pad); } else if (!strcmp(p, "scaling_interpolate")) { - sprintf(buf, "aro=%s:%d", p, scaling_interpolate); + snprintf(buf, bufn, "aro=%s:%d", p, scaling_interpolate); } else if (!strcmp(p, "inetd")) { - sprintf(buf, "aro=%s:%d", p, inetd); + snprintf(buf, bufn, "aro=%s:%d", p, inetd); } else if (!strcmp(p, "safer")) { - sprintf(buf, "aro=%s:%d", p, safe_remote_only); + snprintf(buf, bufn, "aro=%s:%d", p, safe_remote_only); } else if (!strcmp(p, "unsafe")) { - sprintf(buf, "aro=%s:%d", p, !safe_remote_only); + snprintf(buf, bufn, "aro=%s:%d", p, !safe_remote_only); } else if (!strcmp(p, "passwdfile")) { - sprintf(buf, "aro=%s:%s", p, NONUL(passwdfile)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(passwdfile)); } else if (!strcmp(p, "using_shm")) { - sprintf(buf, "aro=%s:%d", p, !using_shm); + snprintf(buf, bufn, "aro=%s:%d", p, !using_shm); } else if (!strcmp(p, "logfile") || !strcmp(p, "o")) { - sprintf(buf, "aro=%s:%s", p, NONUL(logfile)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(logfile)); } else if (!strcmp(p, "rc")) { - sprintf(buf, "aro=%s:%s", p, NONUL(rc_rcfile)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(rc_rcfile)); } else if (!strcmp(p, "norc")) { - sprintf(buf, "aro=%s:%d", p, rc_norc); + snprintf(buf, bufn, "aro=%s:%d", p, rc_norc); } else if (!strcmp(p, "h") || !strcmp(p, "help") || !strcmp(p, "V") || !strcmp(p, "version") || !strcmp(p, "lastmod")) { - sprintf(buf, "aro=%s:%s", p, NONUL(lastmod)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(lastmod)); } else if (!strcmp(p, "bg")) { - sprintf(buf, "aro=%s:%d", p, opts_bg); + snprintf(buf, bufn, "aro=%s:%d", p, opts_bg); } else if (!strcmp(p, "nofb")) { - sprintf(buf, "aro=%s:%d", p, nofb); + snprintf(buf, bufn, "aro=%s:%d", p, nofb); } else if (!strcmp(p, "sigpipe")) { - sprintf(buf, "aro=%s:%s", p, NONUL(sigpipe)); + snprintf(buf, bufn, "aro=%s:%s", p, NONUL(sigpipe)); } else if (!strcmp(p, "threads")) { - sprintf(buf, "aro=%s:%d", p, use_threads); + snprintf(buf, bufn, "aro=%s:%d", p, use_threads); } else if (!strcmp(p, "clients")) { char *str = list_clients(); - sprintf(buf, "aro=%s:%s", p, str); + snprintf(buf, bufn, "aro=%s:%s", p, str); free(str); } else if (!strcmp(p, "client_count")) { - sprintf(buf, "aro=%s:%d", p, client_count); + snprintf(buf, bufn, "aro=%s:%d", p, client_count); } else if (!strcmp(p, "pid")) { - sprintf(buf, "aro=%s:%d", p, (int) getpid()); + snprintf(buf, bufn, "aro=%s:%d", p, (int) getpid()); } else if (!strcmp(p, "ext_xtest")) { - sprintf(buf, "aro=%s:%d", p, xtest_present); + snprintf(buf, bufn, "aro=%s:%d", p, xtest_present); } else if (!strcmp(p, "ext_xkb")) { - sprintf(buf, "aro=%s:%d", p, xkb_present); + snprintf(buf, bufn, "aro=%s:%d", p, xkb_present); } else if (!strcmp(p, "ext_xshm")) { - sprintf(buf, "aro=%s:%d", p, xshm_present); + snprintf(buf, bufn, "aro=%s:%d", p, xshm_present); } else if (!strcmp(p, "ext_xinerama")) { - sprintf(buf, "aro=%s:%d", p, xinerama_present); + snprintf(buf, bufn, "aro=%s:%d", p, xinerama_present); } else if (!strcmp(p, "ext_overlay")) { - sprintf(buf, "aro=%s:%d", p, overlay_present); + snprintf(buf, bufn, "aro=%s:%d", p, overlay_present); } else if (!strcmp(p, "ext_xfixes")) { - sprintf(buf, "aro=%s:%d", p, xfixes_present); + snprintf(buf, bufn, "aro=%s:%d", p, xfixes_present); } else if (!strcmp(p, "ext_xdamage")) { - sprintf(buf, "aro=%s:%d", p, xdamage_present); + snprintf(buf, bufn, "aro=%s:%d", p, xdamage_present); } else if (!strcmp(p, "ext_xrandr")) { - sprintf(buf, "aro=%s:%d", p, xrandr_present); + snprintf(buf, bufn, "aro=%s:%d", p, xrandr_present); } else if (!strcmp(p, "rootwin")) { - sprintf(buf, "aro=%s:0x%x", p, (unsigned int) rootwin); + snprintf(buf, bufn, "aro=%s:0x%x", p, + (unsigned int) rootwin); } else if (!strcmp(p, "num_buttons")) { - sprintf(buf, "aro=%s:%d", p, num_buttons); + snprintf(buf, bufn, "aro=%s:%d", p, num_buttons); } else if (!strcmp(p, "button_mask")) { - sprintf(buf, "aro=%s:%d", p, button_mask); + snprintf(buf, bufn, "aro=%s:%d", p, button_mask); } else if (!strcmp(p, "mouse_x")) { - sprintf(buf, "aro=%s:%d", p, cursor_x); + snprintf(buf, bufn, "aro=%s:%d", p, cursor_x); } else if (!strcmp(p, "mouse_y")) { - sprintf(buf, "aro=%s:%d", p, cursor_y); + snprintf(buf, bufn, "aro=%s:%d", p, cursor_y); } else if (!strcmp(p, "bpp")) { - sprintf(buf, "aro=%s:%d", p, bpp); + snprintf(buf, bufn, "aro=%s:%d", p, bpp); } else if (!strcmp(p, "depth")) { - sprintf(buf, "aro=%s:%d", p, depth); + snprintf(buf, bufn, "aro=%s:%d", p, depth); } else if (!strcmp(p, "indexed_color")) { - sprintf(buf, "aro=%s:%d", p, indexed_color); + snprintf(buf, bufn, "aro=%s:%d", p, indexed_color); } else if (!strcmp(p, "dpy_x")) { - sprintf(buf, "aro=%s:%d", p, dpy_x); + snprintf(buf, bufn, "aro=%s:%d", p, dpy_x); } else if (!strcmp(p, "dpy_y")) { - sprintf(buf, "aro=%s:%d", p, dpy_y); + snprintf(buf, bufn, "aro=%s:%d", p, dpy_y); } else if (!strcmp(p, "rfbport")) { - sprintf(buf, "aro=%s:%d", p, screen->port); + snprintf(buf, bufn, "aro=%s:%d", p, screen->port); } else if (!strcmp(p, "rfbwait")) { NOTAPPRO } else if (!strcmp(p, "rfbauth")) { @@ -7222,33 +7253,34 @@ char *process_remote_cmd(char *cmd, int stringonly) { } else if (!strcmp(p, "passwd")) { NOTAPPRO } else if (!strcmp(p, "alwaysshared")) { - sprintf(buf, "aro=%s:%d", p, screen->alwaysShared); + snprintf(buf, bufn, "aro=%s:%d", p, screen->alwaysShared); } else if (!strcmp(p, "dontdisconnect")) { - sprintf(buf, "aro=%s:%d", p, screen->dontDisconnect); + snprintf(buf, bufn, "aro=%s:%d", p, + screen->dontDisconnect); } else if (!strcmp(p, "httpdir")) { - sprintf(buf, "aro=%s:%s", p, NONUL(screen->httpDir)); + snprintf(buf, bufn, "aro=%s:%s", p, + NONUL(screen->httpDir)); } else if (!strcmp(p, "enablehttpproxy")) { - sprintf(buf, "aro=%s:%d", p, + snprintf(buf, bufn, "aro=%s:%d", p, screen->httpEnableProxyConnect); } else { NOTAPP } goto qry; } else { + char tmp[100]; NOTAPP rfbLog("process_remote_cmd: warning unknown\n"); - rfbLog("command \"%s\"\n", p); - return NULL; - } - - if (*p != '\0' && do_vnc_connect) { - /* this is a reverse connection */ - strncpy(vnc_connect_str, p, VNC_CONNECT_MAX); - vnc_connect_str[VNC_CONNECT_MAX] = '\0'; + strncpy(tmp, p, 90); + rfbLog("command \"%s\"\n", tmp); + goto done; } done: - return NULL; + + if (*buf == '\0') { + sprintf(buf, "ack=1"); + } qry: @@ -7259,7 +7291,7 @@ char *process_remote_cmd(char *cmd, int stringonly) { if (out != NULL) { fprintf(out, "%s\n", buf); fclose(out); - usleep(200*1000); + usleep(20*1000); } } else { set_vnc_connect_prop(buf); @@ -8418,7 +8450,11 @@ void cursor_position(int x, int y) { } void set_rfb_cursor(int which) { - int workaround = 2; /* if rfbSetCursor does not mark modified */ + int workaround = 1; /* if rfbSetCursor does not mark modified */ + +#if OLD_TREE + workaround = 2; +#endif if (! show_cursor) { return; @@ -8711,6 +8747,7 @@ void set_visual(char *str) { return; } rfbLog("bad -visual arg: %s\n", vstring); + X_UNLOCK; clean_up_exit(1); } visual_id = (VisualID) v_in; @@ -8725,6 +8762,7 @@ void set_visual(char *str) { ; } else { rfbLog("could not find visual: %s\n", vstring); + X_UNLOCK; clean_up_exit(1); } free(vstring); @@ -12197,13 +12235,13 @@ char gui_code[] = ""; void run_gui(char *gui_xdisplay, int connect_to_x11vnc) { char *x11vnc_xdisplay = NULL; - char extra_path[] = ":/usr/local/bin:/usr/sfw/bin:/usr/X11R6/bin"; + char extra_path[] = ":/usr/local/bin:/usr/bin/X11:/usr/sfw/bin" + ":/usr/X11R6/bin:/usr/openwin/bin:/usr/dt/bin"; char cmd[100]; - char *wish, *orig_path, *full_path, *tpath, *p; + char *wish = NULL, *orig_path, *full_path, *tpath, *p; int try_max = 9, sleep = 300; FILE *pipe; - if (getenv("DISPLAY") != NULL) { x11vnc_xdisplay = strdup(getenv("DISPLAY")); } @@ -12212,10 +12250,11 @@ void run_gui(char *gui_xdisplay, int connect_to_x11vnc) { } if (connect_to_x11vnc) { int rc, i; + rfbLogEnable(0); if (! client_connect_file) { dpy = XOpenDisplay(x11vnc_xdisplay); if (! dpy) { - fprintf(stderr, "could not open display: %s\n", + fprintf(stderr, "gui: could not open display: %s\n", x11vnc_xdisplay); exit(1); } @@ -12223,22 +12262,23 @@ void run_gui(char *gui_xdisplay, int connect_to_x11vnc) { rootwin = RootWindow(dpy, scr); initialize_vnc_connect_prop(); } + usleep(1000*1000); for (i=0; i<try_max; i++) { usleep(sleep*1000); - fprintf(stderr, "pinging %s ...\n", - NONUL(x11vnc_xdisplay)); - rc = send_remote_cmd("ping", 1); + fprintf(stderr, "gui: pinging %s try=%d ...\n", + NONUL(x11vnc_xdisplay), i+1); + rc = send_remote_cmd("qry=ping", 1, 1); if (rc == 0) { break; } } if (rc == 0) { - fprintf(stderr, "success.\n"); + fprintf(stderr, "gui: ping succeeded.\n"); set_env("X11VNC_XDISPLAY", x11vnc_xdisplay); set_env("X11VNC_CONNECT", "1"); } else { - fprintf(stderr, "could not connect to: '%s', try again" - " in the gui.\n", x11vnc_xdisplay); + fprintf(stderr, "gui: could not connect to: '%s', try" + " again manually.\n", x11vnc_xdisplay); } } @@ -12262,9 +12302,9 @@ void run_gui(char *gui_xdisplay, int connect_to_x11vnc) { try = (char *)malloc(strlen(p) + 10); for (i=0; i<nwishes; i++) { sprintf(try, "%s/%s", p, wishes[i]); - if (stat(try, &sbuf)) { + if (stat(try, &sbuf) == 0) { + /* assume executable, should check mode */ wish = wishes[i]; - break; } } free(try); @@ -12282,7 +12322,6 @@ void run_gui(char *gui_xdisplay, int connect_to_x11vnc) { set_env("X11VNC_PROG", program_name); set_env("X11VNC_CMDLINE", program_cmdline); -if (0) system("env"); sprintf(cmd, "%s -", wish); pipe = popen(cmd, "w"); if (! pipe) { @@ -13332,25 +13371,33 @@ static void print_help(void) { " initial state of the modifier is ignored and not reset)\n" " To include button events use \"Button1\", ... etc.\n" "\n" -"-nodragging Do not update the display during mouse dragging events\n" -" (mouse motion with a button held down). Greatly\n" -" improves response on slow setups, but you lose all\n" -" visual feedback for drags, text selection, and some\n" -" menu traversals.\n" +"-nodragging Do not update the display during mouse dragging\n" +" events (mouse motion with a button held down).\n" +" Greatly improves response on slow setups, but you lose\n" +" all visual feedback for drags, text selection, and some\n" +" menu traversals. It overrides any -pointer_mode setting\n" +" (think of it as pointer_mode 0)\n" "-pointer_mode n Various pointer update schemes. The problem is pointer\n" " motion can cause rapid changes on the screen, e.g. a\n" -" window drag. Neither x11vnc nor the bandwidth to the\n" -" vncviewers can keep up these rapid screen changes:\n" -" everything bogs down when dragging or scrolling.\n" -" Note that most video h/w is optimized for writing, not\n" -" reading (a 50X rate difference is possible) and x11vnc\n" -" is reading all the time. So a scheme has to be used to\n" -" \"eat\" much of that pointer input before re-polling the\n" -" screen. n can be 1 to %d. n=1 was the original scheme\n" -" used to about Jan 2004. n=2 is an improved scheme.\n" -" n=3 is basically a dynamic -nodragging mode: it detects\n" -" if the mouse drag motion has paused and refreshes\n" -" the display. n=4 is TBD. The default n is %d.\n" +" window drag. Neither x11vnc's screen polling nor the\n" +" bandwidth to the vncviewers can keep up these rapid\n" +" screen changes: everything bogs down when dragging\n" +" or scrolling. Note that most video h/w is optimized\n" +" for writing, not reading (a 50X rate difference is\n" +" possible) and x11vnc is reading all the time. So a\n" +" scheme has to be used to \"eat\" much of that pointer\n" +" input before re-polling the screen. n can be 1 to %d.\n" +"\n" +" n=1 was the original scheme used to about Jan 2004: it\n" +" basically just skips -input_skip pointer events before\n" +" repolling the screen. n=2 is an improved scheme:\n" +" by watching the current rate it tries to detect if\n" +" it should try to \"eat\" more pointer events. n=3 is\n" +" basically a dynamic -nodragging mode: it detects if the\n" +" mouse drag motion has paused and refreshes the display.\n" +" n=4 is TBD, it will try measure screen read and client\n" +" write rates and try to insert \"frames\" between the\n" +" on/off states of mode 3. The default n is %d.\n" "-input_skip n For the pointer handling when non-threaded: try to\n" " read n user input events before scanning display. n < 0\n" " means to act as though there is always user input.\n" @@ -13667,6 +13714,25 @@ static void print_help(void) { " dpy_x dpy_y rfbport rfbwait rfbauth passwd alwaysshared\n" " dontdisconnect httpdir enablehttpproxy\n" "\n" +"-sync By default -remote commands are run asynchronously, that\n" +" is, the request is posted and the program immediately\n" +" exits. Use -sync to have the program wait for an\n" +" acknowledgement from the x11vnc server that command\n" +" was processed. On the other hand -query requests are\n" +" always processed synchronously because they have wait\n" +" for the result.\n" +"\n" +" Also note that if both -remote and -query requests are\n" +" supplied on the command line, the -remote is processed\n" +" first (synchronously: no need for -sync), and then\n" +" the -query request is processed in the normal way.\n" +" This allows for a reliable way to see if the -remote\n" +" command was processed by querying for any new settings.\n" +" Note however that there is timeout of a few seconds so\n" +" if the x11vnc takes longer than that to process the\n" +" requests the requestor will think that a failure has\n" +" taken place.\n" +"\n" "-noremote Do not process any remote control commands or queries.\n" "\n" " A note about security wrt remote control commands.\n" @@ -13825,6 +13891,7 @@ static void check_rcfile(int argc, char **argv) { } } rc_norc = norc; + rc_rcfile = strdup(""); if (norc) { ; } else if (infile != NULL) { @@ -13842,9 +13909,10 @@ static void check_rcfile(int argc, char **argv) { strcat(rcfile, "/.x11vncrc"); infile = rcfile; rc = fopen(rcfile, "r"); - rc_rcfile = strdup(rcfile); if (rc == NULL) { norc = 1; + } else { + rc_rcfile = strdup(rcfile); } } @@ -13980,9 +14048,10 @@ int main(int argc, char* argv[]) { int i, len; int ev, er, maj, min; char *arg; + int remote_sync = 0; char *remote_cmd = NULL; + char *query_cmd = NULL; char *gui_string = NULL; - int remote_query = 0; int pw_loc = -1; int vpw_loc = -1; int dt = 0, bg = 0; @@ -14317,18 +14386,21 @@ int main(int argc, char* argv[]) { } else if (!strcmp(arg, "-remote") || !strcmp(arg, "-R") || !strcmp(arg, "-r")) { CHECK_ARGC - remote_cmd = strdup(argv[++i]); - if (!strcmp(remote_cmd, "ping")) { - remote_query = 1; + i++; + if (!strcmp(argv[i], "ping")) { + query_cmd = strdup(argv[i]); + } else { + remote_cmd = strdup(argv[i]); } quiet = 1; xkbcompat = 0; } else if (!strcmp(arg, "-query") || !strcmp(arg, "-Q")) { CHECK_ARGC - remote_cmd = strdup(argv[++i]); - remote_query = 1; + query_cmd = strdup(argv[++i]); quiet = 1; xkbcompat = 0; + } else if (!strcmp(arg, "-sync")) { + remote_sync = 1; } else if (!strcmp(arg, "-noremote")) { accept_remote_cmds = 0; } else if (!strcmp(arg, "-unsafe")) { @@ -14396,15 +14468,16 @@ int main(int argc, char* argv[]) { } } - if (client_connect_file && remote_cmd) { + if (client_connect_file && (remote_cmd || query_cmd)) { /* no need to open DISPLAY, just write it to the file now */ - int rc = send_remote_cmd(remote_cmd, remote_query); + int rc = do_remote_query(remote_cmd, query_cmd, remote_sync); fflush(stderr); fflush(stdout); exit(rc); } + /* * If -passwd was used, clear it out of argv. This does not * work on all UNIX, have to use execvp() in general... @@ -14654,11 +14727,7 @@ int main(int argc, char* argv[]) { /* open the X display: */ X_INIT; if (auth_file) { - char *tmp; - int len = strlen("XAUTHORITY=") + strlen(auth_file) + 1; - tmp = (char *) malloc((size_t) len); - sprintf(tmp, "XAUTHORITY=%s", auth_file); - putenv(tmp); + set_env("XAUTHORITY", auth_file); } if (watch_bell || use_xkb_modtweak) { /* we need XKEYBOARD for these: */ @@ -14708,10 +14777,11 @@ int main(int argc, char* argv[]) { scr = DefaultScreen(dpy); rootwin = RootWindow(dpy, scr); - if (remote_cmd) { - int rc = send_remote_cmd(remote_cmd, remote_query); + if (remote_cmd || query_cmd) { + int rc = do_remote_query(remote_cmd, query_cmd, remote_sync); XFlush(dpy); fflush(stderr); + fflush(stdout); usleep(30 * 1000); /* still needed? */ XCloseDisplay(dpy); exit(rc); |