Initial checkin of libvncserver external library

Change-Id: Ie7c0947e3184490a566a63981ca9baaad2fbcaa3
diff --git a/x11vnc/util.h b/x11vnc/util.h
new file mode 100644
index 0000000..55585cf
--- /dev/null
+++ b/x11vnc/util.h
@@ -0,0 +1,156 @@
+/*
+   Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com> 
+   All rights reserved.
+
+This file is part of x11vnc.
+
+x11vnc is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+x11vnc is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with x11vnc; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
+or see <http://www.gnu.org/licenses/>.
+
+In addition, as a special exception, Karl J. Runge
+gives permission to link the code of its release of x11vnc with the
+OpenSSL project's "OpenSSL" library (or with modified versions of it
+that use the same license as the "OpenSSL" library), and distribute
+the linked executables.  You must obey the GNU General Public License
+in all respects for all of the code used other than "OpenSSL".  If you
+modify this file, you may extend this exception to your version of the
+file, but you are not obligated to do so.  If you do not wish to do
+so, delete this exception statement from your version.
+*/
+
+#ifndef _X11VNC_UTIL_H
+#define _X11VNC_UTIL_H
+
+/* -- util.h -- */
+
+extern int nfix(int i, int n);
+extern int nmin(int n, int m);
+extern int nmax(int n, int m);
+extern int nabs(int n);
+extern double dabs(double x);
+extern void lowercase(char *str);
+extern void uppercase(char *str);
+extern char *lblanks(char *str);
+extern void strzero(char *str);
+extern int scan_hexdec(char *str, unsigned long *num);
+extern int parse_geom(char *str, int *wp, int *hp, int *xp, int *yp, int W, int H);
+extern void set_env(char *name, char *value);
+extern char *bitprint(unsigned int st, int nbits);
+extern char *get_user_name(void);
+extern char *get_home_dir(void);
+extern char *get_shell(void);
+extern char *this_host(void);
+
+extern int match_str_list(char *str, char **list);
+extern char **create_str_list(char *cslist);
+
+extern double dtime(double *);
+extern double dtime0(double *);
+extern double dnow(void);
+extern double dnowx(void);
+extern double rnow(void);
+extern double rfac(void);
+
+extern int rfbPE(long usec);
+extern void rfbCFD(long usec);
+extern double rect_overlap(int x1, int y1, int x2, int y2, int X1, int Y1,
+    int X2, int Y2);
+extern char *choose_title(char *display);
+
+
+#define NONUL(x) ((x) ? (x) : "")
+
+/*
+	Put this in usleep2() for debug printout.
+	fprintf(stderr, "_mysleep: %08d %10.6f %s:%d\n", (x), dnow() - x11vnc_start, __FILE__, __LINE__); \
+ */
+
+/* XXX usleep(3) is not thread safe on some older systems... */
+extern struct timeval _mysleep;
+#define usleep2(x) \
+	_mysleep.tv_sec  = (x) / 1000000; \
+	_mysleep.tv_usec = (x) % 1000000; \
+	select(0, NULL, NULL, NULL, &_mysleep); 
+#if !defined(X11VNC_USLEEP)
+#undef usleep
+#define usleep usleep2
+#endif
+
+/*
+ * following is based on IsModifierKey in Xutil.h
+*/
+#define ismodkey(keysym) \
+  ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R) && \
+  ((KeySym)(keysym) != XK_Caps_Lock) && ((KeySym)(keysym) != XK_Shift_Lock)))
+
+/*
+ * When threaded we have to mutex our X11 calls to avoid XIO crashes
+ * due to callbacks.
+ */
+#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
+extern MUTEX(x11Mutex);
+extern MUTEX(scrollMutex);
+MUTEX(clientMutex);
+MUTEX(inputMutex);
+MUTEX(pointerMutex);
+#endif
+
+#define X_INIT INIT_MUTEX(x11Mutex)
+
+#if 1
+#define X_LOCK       LOCK(x11Mutex)
+#define X_UNLOCK   UNLOCK(x11Mutex)
+#else
+extern int hxl;
+#define X_LOCK       fprintf(stderr, "*** X_LOCK**  %d%s  %s:%d\n", \
+	hxl, hxl  ? "  BAD-PRE-LOCK":"",   __FILE__, __LINE__);   LOCK(x11Mutex); hxl = 1;
+#define X_UNLOCK     fprintf(stderr, "    x_unlock  %d%s  %s:%d\n", \
+	hxl, !hxl ? "  BAD-PRE-UNLOCK":"", __FILE__, __LINE__); UNLOCK(x11Mutex); hxl = 0;
+#endif
+
+#define SCR_LOCK   if (use_threads) {LOCK(scrollMutex);}
+#define SCR_UNLOCK if (use_threads) {UNLOCK(scrollMutex);}
+#define SCR_INIT INIT_MUTEX(scrollMutex)
+
+#define CLIENT_LOCK   if (use_threads) {LOCK(clientMutex);}
+#define CLIENT_UNLOCK if (use_threads) {UNLOCK(clientMutex);}
+#define CLIENT_INIT INIT_MUTEX(clientMutex)
+
+#if 1
+#define INPUT_LOCK   if (use_threads) {LOCK(inputMutex);}
+#define INPUT_UNLOCK if (use_threads) {UNLOCK(inputMutex);}
+#else
+#define INPUT_LOCK
+#define INPUT_UNLOCK
+#endif
+#define INPUT_INIT INIT_MUTEX(inputMutex)
+
+#define POINTER_LOCK   if (use_threads) {LOCK(pointerMutex);}
+#define POINTER_UNLOCK if (use_threads) {UNLOCK(pointerMutex);}
+#define POINTER_INIT INIT_MUTEX(pointerMutex)
+
+/*
+ * The sendMutex member was added to libvncserver 0.9.8
+ * rfb/rfb.h sets LIBVNCSERVER_SEND_MUTEX if present.
+ */
+#if LIBVNCSERVER_HAVE_LIBPTHREAD && defined(LIBVNCSERVER_SEND_MUTEX)
+#define SEND_LOCK(cl)   if (use_threads)   LOCK((cl)->sendMutex);
+#define SEND_UNLOCK(cl) if (use_threads) UNLOCK((cl)->sendMutex);
+#else
+#define SEND_LOCK(cl)
+#define SEND_UNLOCK(cl)
+#endif
+
+#endif /* _X11VNC_UTIL_H */