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