1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com> 3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat All rights reserved. 4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatThis file is part of x11vnc. 6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatx11vnc is free software; you can redistribute it and/or modify 8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatit under the terms of the GNU General Public License as published by 9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatthe Free Software Foundation; either version 2 of the License, or (at 10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatyour option) any later version. 11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatx11vnc is distributed in the hope that it will be useful, 13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatbut WITHOUT ANY WARRANTY; without even the implied warranty of 14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatGNU General Public License for more details. 16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatYou should have received a copy of the GNU General Public License 18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatalong with x11vnc; if not, write to the Free Software 19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA 20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehator see <http://www.gnu.org/licenses/>. 21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatIn addition, as a special exception, Karl J. Runge 23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatgives permission to link the code of its release of x11vnc with the 24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatOpenSSL project's "OpenSSL" library (or with modified versions of it 25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatthat use the same license as the "OpenSSL" library), and distribute 26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatthe linked executables. You must obey the GNU General Public License 27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatin all respects for all of the code used other than "OpenSSL". If you 28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatmodify this file, you may extend this exception to your version of the 29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatfile, but you are not obligated to do so. If you do not wish to do 30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatso, delete this exception statement from your version. 31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat*/ 32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* -- util.c -- */ 34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "x11vnc.h" 36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "cleanup.h" 37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "win_utils.h" 38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "unixpw.h" 39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "connections.h" 40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstruct timeval _mysleep; 42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* this is only for debugging mutexes. see util.h */ 44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint hxl = 0; 45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD 47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatMUTEX(x11Mutex); 48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatMUTEX(scrollMutex); 49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nfix(int i, int n); 52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nmin(int n, int m); 53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nmax(int n, int m); 54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nabs(int n); 55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dabs(double x); 56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid lowercase(char *str); 57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid uppercase(char *str); 58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *lblanks(char *str); 59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid strzero(char *str); 60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint scan_hexdec(char *str, unsigned long *num); 61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint parse_geom(char *str, int *wp, int *hp, int *xp, int *yp, int W, int H); 62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid set_env(char *name, char *value); 63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *bitprint(unsigned int st, int nbits); 64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *get_user_name(void); 65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *get_home_dir(void); 66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *get_shell(void); 67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *this_host(void); 68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint match_str_list(char *str, char **list); 70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar **create_str_list(char *cslist); 71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dtime(double *); 73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dtime0(double *); 74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dnow(void); 75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dnowx(void); 76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble rnow(void); 77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble rfac(void); 78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint rfbPE(long usec); 80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid rfbCFD(long usec); 81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble rect_overlap(int x1, int y1, int x2, int y2, int X1, int Y1, 83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int X2, int Y2); 84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *choose_title(char *display); 86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * routine to keep 0 <= i < n 90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nfix(int i, int n) { 92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (i < 0) { 93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat i = 0; 94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (i >= n) { 95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat i = n - 1; 96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return i; 98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nmin(int n, int m) { 101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (n < m) { 102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return n; 103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return m; 105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nmax(int n, int m) { 109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (n > m) { 110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return n; 111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return m; 113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint nabs(int n) { 117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (n < 0) { 118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -n; 119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return n; 121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dabs(double x) { 125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (x < 0.0) { 126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -x; 127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return x; 129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid lowercase(char *str) { 133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *p; 134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (str == NULL) { 135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p = str; 138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (*p != '\0') { 139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *p = tolower((unsigned char) (*p)); 140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p++; 141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid uppercase(char *str) { 145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *p; 146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (str == NULL) { 147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 149a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p = str; 150a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (*p != '\0') { 151a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *p = toupper((unsigned char) (*p)); 152a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p++; 153a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 154a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 155a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 156a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *lblanks(char *str) { 157a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *p = str; 158a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (*p != '\0') { 159a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! isspace((unsigned char) (*p))) { 160a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 161a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 162a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p++; 163a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 164a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return p; 165a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 166a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 167a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid strzero(char *str) { 168a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *p = str; 169a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (p != NULL) { 170a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (*p != '\0') { 171a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *p = '\0'; 172a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p++; 173a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 174a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 175a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 176a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 177a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint is_decimal(char *str) { 178a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *p = str; 179a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (p != NULL) { 180a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int first = 1; 181a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (*p != '\0') { 182a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (first && *p == '-') { 183a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ; 184a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (isdigit((int) *p)) { 185a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ; 186a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 187a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 188a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 189a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat first = 0; 190a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p++; 191a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 192a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 1; 193a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 194a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 195a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 196a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 197a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint scan_hexdec(char *str, unsigned long *num) { 198a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (sscanf(str, "0x%lx", num) != 1) { 199a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (sscanf(str, "%lu", num) != 1) { 200a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 201a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 202a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 203a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 1; 204a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 205a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 206a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint parse_geom(char *str, int *wp, int *hp, int *xp, int *yp, int W, int H) { 207a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int w, h, x, y; 208a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! str) { 209a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 210a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 211a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* handle +/-x and +/-y */ 212a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (sscanf(str, "%dx%d+%d+%d", &w, &h, &x, &y) == 4) { 213a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ; 214a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (sscanf(str, "%dx%d-%d+%d", &w, &h, &x, &y) == 4) { 215a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat w = nabs(w); 216a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat x = W - x - w; 217a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (sscanf(str, "%dx%d+%d-%d", &w, &h, &x, &y) == 4) { 218a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat h = nabs(h); 219a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat y = H - y - h; 220a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (sscanf(str, "%dx%d-%d-%d", &w, &h, &x, &y) == 4) { 221a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat w = nabs(w); 222a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat h = nabs(h); 223a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat x = W - x - w; 224a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat y = H - y - h; 225a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 226a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 227a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 228a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *wp = w; 229a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *hp = h; 230a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *xp = x; 231a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *yp = y; 232a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 1; 233a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 234a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 235a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid set_env(char *name, char *value) { 236a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *str; 237a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! name) { 238a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 239a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 240a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! value) { 241a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat value = ""; 242a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 243a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat str = (char *) malloc(strlen(name) + 1 + strlen(value) + 1); 244a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sprintf(str, "%s=%s", name, value); 245a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat putenv(str); 246a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 247a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 248a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *bitprint(unsigned int st, int nbits) { 249a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static char str[33]; 250a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i, mask; 251a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (nbits > 32) { 252a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat nbits = 32; 253a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 254a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for (i=0; i<nbits; i++) { 255a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat str[i] = '0'; 256a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 257a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat str[nbits] = '\0'; 258a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat mask = 1; 259a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for (i=nbits-1; i>=0; i--) { 260a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (st & mask) { 261a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat str[i] = '1'; 262a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 263a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat mask = mask << 1; 264a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 265a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return str; /* take care to use or copy immediately */ 266a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 267a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 268a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *get_user_name(void) { 269a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *user = NULL; 270a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 271a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat user = getenv("USER"); 272a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (user == NULL) { 273a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat user = getenv("LOGNAME"); 274a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 275a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 276a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#if LIBVNCSERVER_HAVE_PWD_H 277a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (user == NULL) { 278a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct passwd *pw = getpwuid(getuid()); 279a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (pw) { 280a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat user = pw->pw_name; 281a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 282a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 283a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 284a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 285a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (user) { 286a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(strdup(user)); 287a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 288a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(strdup("unknown-user")); 289a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 290a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 291a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 292a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *get_home_dir(void) { 293a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *home = NULL; 294a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 295a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat home = getenv("HOME"); 296a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 297a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#if LIBVNCSERVER_HAVE_PWD_H 298a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (home == NULL) { 299a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct passwd *pw = getpwuid(getuid()); 300a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (pw) { 301a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat home = pw->pw_dir; 302a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 303a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 304a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 305a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 306a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (home) { 307a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(strdup(home)); 308a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 309a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(strdup("/")); 310a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 311a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 312a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 313a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *get_shell(void) { 314a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *shell = NULL; 315a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 316a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat shell = getenv("SHELL"); 317a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 318a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#if LIBVNCSERVER_HAVE_PWD_H 319a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (shell == NULL) { 320a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct passwd *pw = getpwuid(getuid()); 321a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (pw) { 322a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat shell = pw->pw_shell; 323a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 324a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 325a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 326a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 327a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (shell) { 328a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(strdup(shell)); 329a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 330a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(strdup("/bin/sh")); 331a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 332a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 333a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 334a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 335a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * utility to get the current host name 336a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 337a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *this_host(void) { 338a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char host[MAXN]; 339a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#if LIBVNCSERVER_HAVE_GETHOSTNAME 340a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (gethostname(host, MAXN) == 0) { 341a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat host[MAXN-1] = '\0'; 342a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return strdup(host); 343a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (UT.nodename) { 344a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return strdup(UT.nodename); 345a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 346a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 347a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return NULL; 348a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 349a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 350a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint match_str_list(char *str, char **list) { 351a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i = 0, matched = 0; 352a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 353a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! str || ! list) { 354a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 355a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 356a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (list[i] != NULL) { 357a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (!strcmp(list[i], "*")) { 358a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat matched = 1; 359a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 360a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (strstr(str, list[i])) { 361a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat matched = 1; 362a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 363a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 364a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat i++; 365a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 366a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return matched; 367a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 368a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 369a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar **create_str_list(char *cslist) { 370a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i, n; 371a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *p, *str; 372a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char **list = NULL; 373a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 374a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! cslist) { 375a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return NULL; 376a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 377a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 378a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat str = strdup(cslist); 379a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat n = 1; 380a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p = str; 381a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (*p != '\0') { 382a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (*p == ',') { 383a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat n++; 384a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 385a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p++; 386a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 387a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 388a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* the extra last one holds NULL */ 389a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat list = (char **) calloc((n+1)*sizeof(char *), 1); 390a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 391a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p = strtok(str, ","); 392a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat i = 0; 393a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (p && i < n) { 394a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat list[i++] = strdup(p); 395a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat p = strtok(NULL, ","); 396a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 397a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat free(str); 398a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 399a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return list; 400a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 401a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 402a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 403a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * simple function for measuring sub-second time differences, using 404a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * a double to hold the value. 405a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 406a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dtime(double *t_old) { 407a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* 408a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * usage: call with 0.0 to initialize, subsequent calls give 409a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * the time difference since last call. 410a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 411a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double t_now, dt; 412a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct timeval now; 413a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 414a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat gettimeofday(&now, NULL); 415a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat t_now = now.tv_sec + ( (double) now.tv_usec/1000000. ); 416a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (*t_old == 0.0) { 417a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *t_old = t_now; 418a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return t_now; 419a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 420a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dt = t_now - *t_old; 421a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *t_old = t_now; 422a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return(dt); 423a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 424a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 425a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* common dtime() activities: */ 426a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dtime0(double *t_old) { 427a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *t_old = 0.0; 428a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return dtime(t_old); 429a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 430a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 431a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dnow(void) { 432a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double t; 433a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return dtime0(&t); 434a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 435a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 436a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble dnowx(void) { 437a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return dnow() - x11vnc_start; 438a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 439a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 440a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble rnow(void) { 441a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double t = dnow(); 442a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat t = t - ((int) t); 443a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (t > 1.0) { 444a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat t = 1.0; 445a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else if (t < 0.0) { 446a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat t = 0.0; 447a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 448a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return t; 449a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 450a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 451a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble rfac(void) { 452a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double f; 453a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static int first = 1; 454a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 455a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (first) { 456a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned int s; 457a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (getenv("RAND_SEED")) { 458a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat s = (unsigned int) atoi(getenv("RAND_SEED")); 459a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 460a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat s = (unsigned int) ((int) getpid() + 100000 * rnow()); 461a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 462a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat srand(s); 463a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat first = 0; 464a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 465a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 466a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat f = (double) rand(); 467a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat f = f / ((double) RAND_MAX); 468a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 469a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return f; 470a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 471a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 472a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid check_allinput_rate(void) { 473a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static double last_all_input_check = 0.0; 474a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static int set = 0, verb = -1; 475a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 476a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (use_threads) { 477a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 478a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 479a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb < 0) { 480a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat verb = 0; 481a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (getenv("RATE_VERB")) verb = 1; 482a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 483a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! set) { 484a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat set = 1; 485a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat last_all_input_check = dnow(); 486a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 487a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int dt = 5; 488a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (x11vnc_current > last_all_input_check + dt) { 489a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int n, nq = 0; 490a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while ((n = rfbCheckFds(screen, 0))) { 491a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat nq += n; 492a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 493a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) fprintf(stderr, "nqueued: %d\n", nq); 494a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (getenv("CHECK_RATE") && nq > 18 * dt) { 495a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double rate = nq / dt; 496a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) rfbLog("check_allinput_rate:\n"); 497a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) rfbLog("Client is sending %.1f extra requests per second for the\n", rate); 498a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) rfbLog("past %d seconds! (queued: %d)\n", dt, nq); 499a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (strstr(getenv("CHECK_RATE"), "allinput") && !all_input && !handle_events_eagerly) { 500a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("Switching to -allpinput mode.\n"); 501a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat all_input = 1; 502a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 503a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 504a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat set = 0; 505a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 506a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 507a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 508a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 509a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void do_allinput(long usec) { 510a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static double last = 0.0; 511a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static int meas = 0, verb = -1; 512a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int n, f = 1, cnt = 0, m = 0; 513a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat long usec0; 514a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double now; 515a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (!screen || !screen->clientHead) { 516a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 517a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 518a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (use_threads) { 519a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 520a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 521a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (usec < 0) { 522a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat usec = 0; 523a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 524a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat usec0 = usec; 525a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (last == 0.0) { 526a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat last = dnow(); 527a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 528a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb < 0) { 529a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat verb = 0; 530a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (getenv("RATE_VERB")) verb = 1; 531a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 532a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while ((n = rfbCheckFds(screen, usec)) > 0) { 533a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (f) { 534a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) fprintf(stderr, " *"); 535a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat f = 0; 536a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 537a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (cnt++ > 30) { 538a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 539a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 540a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat meas += n; 541a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat m += n; 542a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 543a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) fprintf(stderr, "+%d/%d", cnt, m); 544a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat now = dnow(); 545a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (now > last + 2.0) { 546a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double rate = meas / (now - last); 547a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (verb) fprintf(stderr, "\n allinput rate: %.2f ", rate); 548a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat meas = 0; 549a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat last = dnow(); 550a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 551a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 552a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 553a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 554a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * utility wrapper to call rfbProcessEvents 555a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * checks that we are not in threaded mode. 556a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 557a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define USEC_MAX 999999 /* libvncsever assumes < 1 second */ 558a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint rfbPE(long usec) { 559a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int uip0 = unixpw_in_progress; 560a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static int check_rate = -1; 561a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int res = 0; 562a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! screen) { 563a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return res; 564a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 565a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (unixpw && unixpw_in_progress && !unixpw_in_rfbPE) { 566a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("unixpw_in_rfbPE: skipping rfbPE\n"); 567a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return res; 568a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 569a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 570a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (debug_tiles > 2) { 571a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double tm = dnow(); 572a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fprintf(stderr, "rfbPE(%d) t: %.4f\n", 573a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (int) usec, tm - x11vnc_start); 574a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 575a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 576a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (usec > USEC_MAX) { 577a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat usec = USEC_MAX; 578a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 579a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! use_threads) { 580a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbBool r; 581a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat r = rfbProcessEvents(screen, usec); 582a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (r) { 583a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat res = 1; 584a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 585a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 586a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 587a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (unixpw && unixpw_in_progress && !uip0) { 588a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (!unixpw_in_rfbPE) { 589a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("rfbPE: got new client in non-rfbPE\n"); 590a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ; /* this is new unixpw client */ 591a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 592a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 593a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 594a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (ipv6_listen) { 595a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat check_ipv6_listen(usec); 596a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 597a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (unix_sock) { 598a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat check_unix_sock(usec); 599a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 600a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (check_rate != 0) { 601a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (check_rate < 0) { 602a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (getenv("CHECK_RATE")) { 603a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat check_rate = 1; 604a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 605a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat check_rate = 0; 606a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 607a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 608a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (check_rate && !all_input && x11vnc_current < last_client + 45) { 609a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat check_allinput_rate(); 610a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 611a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 612a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (all_input) { 613a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat do_allinput(usec); 614a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 615a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return res; 616a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 617a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 618a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid rfbCFD(long usec) { 619a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int uip0 = unixpw_in_progress; 620a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! screen) { 621a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 622a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 623a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (unixpw && unixpw_in_progress && !unixpw_in_rfbPE) { 624a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static int msgs = 0; 625a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static double last_reset = 0.0; 626a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (dnow() > last_reset + 5.0) { 627a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat msgs = 0; 628a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat last_reset = dnow(); 629a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 630a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (msgs++ < 10) { 631a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("unixpw_in_rfbPE: skipping rfbCFD\n"); 632a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (msgs == 10) { 633a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("unixpw_in_rfbPE: skipping rfbCFD ...\n"); 634a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 635a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 636a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return; 637a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 638a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (usec > USEC_MAX) { 639a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat usec = USEC_MAX; 640a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 641a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 642a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (debug_tiles > 2) { 643a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double tm = dnow(); 644a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fprintf(stderr, "rfbCFD(%d) t: %.4f\n", 645a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (int) usec, tm - x11vnc_start); 646a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 647a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 648a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 649a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (! use_threads) { 650a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (all_input) { 651a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat do_allinput(usec); 652a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 653a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (handle_events_eagerly) { 654a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat screen->handleEventsEagerly = TRUE; 655a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 656a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat screen->handleEventsEagerly = FALSE; 657a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 658a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbCheckFds(screen, usec); 659a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 660a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 661a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 662a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (unixpw && unixpw_in_progress && !uip0) { 663a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (!unixpw_in_rfbPE) { 664a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("rfbCFD: got new client in non-rfbPE\n"); 665a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ; /* this is new unixpw client */ 666a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 667a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 668a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 669a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 670a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatdouble rect_overlap(int x1, int y1, int x2, int y2, int X1, int Y1, 671a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int X2, int Y2) { 672a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat double a, A, o; 673a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRegionPtr r, R; 674a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRectangleIterator *iter; 675a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRect rt; 676a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 677a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat a = nabs((x2 - x1) * (y2 - y1)); 678a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat A = nabs((X2 - X1) * (Y2 - Y1)); 679a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 680a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (a == 0 || A == 0) { 681a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0.0; 682a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 683a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 684a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat r = sraRgnCreateRect(x1, y1, x2, y2); 685a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat R = sraRgnCreateRect(X1, Y1, X2, Y2); 686a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 687a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRgnAnd(r, R); 688a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 689a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat o = 0.0; 690a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat iter = sraRgnGetIterator(r); 691a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (sraRgnIteratorNext(iter, &rt)) { 692a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat o += nabs( (rt.x2 - rt.x1) * (rt.y2 - rt.y1) ); 693a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 694a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRgnReleaseIterator(iter); 695a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 696a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRgnDestroy(r); 697a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sraRgnDestroy(R); 698a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 699a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (a < A) { 700a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat o = o/a; 701a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } else { 702a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat o = o/A; 703a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 704a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return o; 705a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 706a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 707a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 708a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * choose a desktop name 709a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 710a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatchar *choose_title(char *display) { 711a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat static char title[(MAXN+10)]; 712a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 713a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(title, 0, sizeof(title)); 714a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcpy(title, "x11vnc"); 715a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 716a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (display == NULL) { 717a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat display = getenv("DISPLAY"); 718a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 719a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 720a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifdef MACOSX 721a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (display == NULL || strstr(display, "/tmp/") == display) { 722a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *u = get_user_name(); 723a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *th = this_host(); 724a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (strlen(u) > MAXN/4) { 725a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat u = "someone"; 726a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 727a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcpy(title, u); 728a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (th == NULL && UT.nodename) { 729a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat th = UT.nodename; 730a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 731a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (th) { 732a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strcat(title, "@"); 733a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strncat(title, th, MAXN - strlen(title)); 734a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 735a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return title; 736a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 737a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 738a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 739a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (display == NULL) { 740a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return title; 741a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 742a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 743a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* use display: */ 744a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat title[0] = '\0'; 745a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (display[0] == ':') { 746a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *th = this_host(); 747a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (th != NULL) { 748a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strncpy(title, th, MAXN - strlen(title)); 749a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 750a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 751a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strncat(title, display, MAXN - strlen(title)); 752a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat X_LOCK; 753a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (subwin && dpy && valid_window(subwin, NULL, 0)) { 754a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#if !NO_X11 755a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char *name = NULL; 756a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int do_appshare = getenv("X11VNC_APPSHARE_ACTIVE") ? 1 : 0; 757a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (0 && do_appshare) { 758a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat title[0] = '\0'; 759a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 760a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (XFetchName(dpy, subwin, &name)) { 761a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (name) { 762a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (title[0] != '\0') { 763a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strncat(title, " ", MAXN - strlen(title)); 764a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 765a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strncat(title, name, MAXN - strlen(title)); 766a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat free(name); 767a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 768a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 769a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (do_appshare) { 770a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat Window c; 771a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int x, y; 772a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (xtranslate(subwin, rootwin, 0, 0, &x, &y, &c, 1)) { 773a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat char tmp[32]; 774a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (scaling) { 775a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat x *= scale_fac_x; 776a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat y *= scale_fac_y; 777a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 778a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat sprintf(tmp, " XY=%d,%d", x, y); 779a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat strncat(title, tmp, MAXN - strlen(title)); 780a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 781a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rfbLog("appshare title: %s\n", title); 782a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 783a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif /* NO_X11 */ 784a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 785a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat X_UNLOCK; 786a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return title; 787a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 788