diff options
author | runge <runge> | 2009-02-04 03:05:32 +0000 |
---|---|---|
committer | runge <runge> | 2009-02-04 03:05:32 +0000 |
commit | e59f78c5eaae3d7d0f98db064df0c85b1da1c7b9 (patch) | |
tree | 8ea60591ff85ae29c6134e04baedd8cf8373c60a /x11vnc/sslhelper.c | |
parent | 3998c18e263b0c73af7451e2af2f40fb305520bf (diff) | |
download | libtdevnc-e59f78c5eaae3d7d0f98db064df0c85b1da1c7b9.tar.gz libtdevnc-e59f78c5eaae3d7d0f98db064df0c85b1da1c7b9.zip |
x11vnc: Add "sendbell" remote cmd. Fix copyrect updates under
-reflect. Workaround that checks valid window of selection
requestor. Wait on some ssl helper pids earlier. Workaround
XAUTHLOCALHOSTNAME for some new usage modes. Set fake fb to
requested bpp with correct masks. -padgeom once:... mode.
Set LIBXCB_ALLOW_SLOPPY_LOCK by default. rfbRandomBytes earlier.
classes/ssl: Update jars. Add "TOP_" dropdown customization to
ultravnc java viewer applet FTP panel.
Diffstat (limited to 'x11vnc/sslhelper.c')
-rw-r--r-- | x11vnc/sslhelper.c | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/x11vnc/sslhelper.c b/x11vnc/sslhelper.c index 1f7598f..4f22dc5 100644 --- a/x11vnc/sslhelper.c +++ b/x11vnc/sslhelper.c @@ -1248,18 +1248,23 @@ void ssl_helper_pid(pid_t pid, int sock) { # define HPSIZE 256 static pid_t helpers[HPSIZE]; static int sockets[HPSIZE], first = 1; - int i, empty, set, status, db = 0; + int i, empty, set, status; + static int db = 0; if (first) { for (i=0; i < HPSIZE; i++) { helpers[i] = 0; sockets[i] = 0; } + if (getenv("SSL_HELPER_PID_DB")) { + db = 1; + } first = 0; } + if (pid == 0) { - /* killall */ + /* killall or waitall */ for (i=0; i < HPSIZE; i++) { if (helpers[i] == 0) { sockets[i] = -1; @@ -1279,13 +1284,17 @@ void ssl_helper_pid(pid_t pid, int sock) { } #if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID -if (db) fprintf(stderr, "waitpid(%d)\n", helpers[i]); wret = waitpid(helpers[i], &status, WNOHANG); + +if (db) fprintf(stderr, "waitpid(%d)\n", helpers[i]); +if (db) fprintf(stderr, " waitret1=%d\n", wret); + if (kret == 0 && wret != helpers[i]) { int k; for (k=0; k < 10; k++) { usleep(100 * 1000); wret = waitpid(helpers[i], &status, WNOHANG); +if (db) fprintf(stderr, " waitret2=%d\n", wret); if (wret == helpers[i]) { break; } @@ -1310,10 +1319,12 @@ if (db) fprintf(stderr, "ssl_helper_pid(%d, %d)\n", pid, sock); for (i=0; i < HPSIZE; i++) { if (helpers[i] == pid) { if (sock == -1) { - #if LIBVNCSERVER_HAVE_SYS_WAIT_H && LIBVNCSERVER_HAVE_WAITPID + pid_t wret; + wret = waitpid(helpers[i], &status, WNOHANG); + if (db) fprintf(stderr, "waitpid(%d) 2\n", helpers[i]); - waitpid(helpers[i], &status, WNOHANG); +if (db) fprintf(stderr, " waitret1=%d\n", wret); #endif helpers[i] = 0; } @@ -2456,6 +2467,7 @@ void accept_openssl(int mode, int presock) { } screen->port = origport; rfbLog("SSL: guessing child https finished.\n"); + ssl_helper_pid(0, -2); if (mode == OPENSSL_INETD) { clean_up_exit(1); } @@ -2490,8 +2502,11 @@ void accept_openssl(int mode, int presock) { } rfbLog("SSL: OPENSSL_INETD guessing " "child https finished.\n"); + ssl_helper_pid(0, -2); clean_up_exit(1); } + /* this will actually only get earlier https */ + ssl_helper_pid(0, -2); return; } kill(pid, SIGTERM); @@ -3522,6 +3537,8 @@ static void ssl_xfer(int csock, int s_in, int s_out, int is_https) { } else { tv_use = tv_vnc_later; } + /* try to clean out some zombies if we can. */ + ssl_helper_pid(0, -2); } if (ssl_timeout_secs > 0) { tv_use = ssl_timeout_secs; @@ -3742,7 +3759,16 @@ void check_openssl(void) { static double last_check = 0.0; double now; - if (! use_openssl || openssl_sock < 0) { + if (! use_openssl) { + return; + } + + if (time(NULL) > last_waitall + 120) { + last_waitall = time(NULL); + ssl_helper_pid(0, -2); /* waitall */ + } + + if (openssl_sock < 0) { return; } @@ -3752,11 +3778,6 @@ void check_openssl(void) { } last_check = now; - if (time(NULL) > last_waitall + 150) { - last_waitall = time(NULL); - ssl_helper_pid(0, -2); /* waitall */ - } - FD_ZERO(&fds); FD_SET(openssl_sock, &fds); @@ -3809,6 +3830,7 @@ void check_https(void) { static void init_prng(void) { int db = 0, bytes, ubytes, fd; char file[MSZ], dtmp[100]; + unsigned int sr; RAND_file_name(file, MSZ); @@ -3838,6 +3860,9 @@ static void init_prng(void) { RAND_poll(); } + RAND_bytes((unsigned char *)&sr, 4); + srand(sr); + if (bytes > 0) { if (! quiet) { rfbLog("initialized PRNG with %d random bytes.\n", |