diff options
Diffstat (limited to 'x11vnc/util.c')
-rw-r--r-- | x11vnc/util.c | 397 |
1 files changed, 397 insertions, 0 deletions
diff --git a/x11vnc/util.c b/x11vnc/util.c new file mode 100644 index 0000000..4d5dfe2 --- /dev/null +++ b/x11vnc/util.c @@ -0,0 +1,397 @@ +/* -- util.c -- */ + +#include "x11vnc.h" +#include "cleanup.h" + +struct timeval _mysleep; + +/* this is only for debugging mutexes. see util.h */ +int hxl = 0; + +#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD +MUTEX(x11Mutex); +MUTEX(scrollMutex); +#endif + +int nfix(int i, int n); +int nabs(int n); +double dabs(double x); +void lowercase(char *str); +void uppercase(char *str); +char *lblanks(char *str); +void strzero(char *str); +int scan_hexdec(char *str, unsigned long *num); +int parse_geom(char *str, int *wp, int *hp, int *xp, int *yp, int W, int H); +void set_env(char *name, char *value); +char *bitprint(unsigned int st, int nbits); +char *get_user_name(void); +char *get_home_dir(void); +char *get_shell(void); +char *this_host(void); + +int match_str_list(char *str, char **list); +char **create_str_list(char *cslist); + +double dtime(double *); +double dtime0(double *); +double dnow(void); +double dnowx(void); +double rnow(void); +double rfac(void); + +void rfbPE(long usec); +void rfbCFD(long usec); + + +/* + * routine to keep 0 <= i < n, should use in more places... + */ +int nfix(int i, int n) { + if (i < 0) { + i = 0; + } else if (i >= n) { + i = n - 1; + } + return i; +} + +int nabs(int n) { + if (n < 0) { + return -n; + } else { + return n; + } +} + +double dabs(double x) { + if (x < 0.0) { + return -x; + } else { + return x; + } +} + +void lowercase(char *str) { + char *p; + if (str == NULL) { + return; + } + p = str; + while (*p != '\0') { + *p = tolower(*p); + p++; + } +} + +void uppercase(char *str) { + char *p; + if (str == NULL) { + return; + } + p = str; + while (*p != '\0') { + *p = toupper(*p); + p++; + } +} + +char *lblanks(char *str) { + char *p = str; + while (*p) { + if (! isspace(*p)) { + break; + } + p++; + } + return p; +} + +void strzero(char *str) { + char *p = str; + if (p != NULL) { + while (*p != '\0') { + *p = '\0'; + p++; + } + } +} + +int scan_hexdec(char *str, unsigned long *num) { + if (sscanf(str, "0x%lx", num) != 1) { + if (sscanf(str, "%lu", num) != 1) { + return 0; + } + } + return 1; +} + +int parse_geom(char *str, int *wp, int *hp, int *xp, int *yp, int W, int H) { + int w, h, x, y; + /* handle +/-x and +/-y */ + if (sscanf(str, "%dx%d+%d+%d", &w, &h, &x, &y) == 4) { + ; + } else if (sscanf(str, "%dx%d-%d+%d", &w, &h, &x, &y) == 4) { + w = nabs(w); + x = W - x - w; + } else if (sscanf(str, "%dx%d+%d-%d", &w, &h, &x, &y) == 4) { + h = nabs(h); + y = H - y - h; + } else if (sscanf(str, "%dx%d-%d-%d", &w, &h, &x, &y) == 4) { + w = nabs(w); + h = nabs(h); + x = W - x - w; + y = H - y - h; + } else { + return 0; + } + *wp = w; + *hp = h; + *xp = x; + *yp = y; + return 1; +} + +void set_env(char *name, char *value) { + char *str; + if (!value) { + value = ""; + } + str = (char *) malloc(strlen(name)+strlen(value)+2); + sprintf(str, "%s=%s", name, value); + putenv(str); +} + +char *bitprint(unsigned int st, int nbits) { + static char str[33]; + int i, mask; + if (nbits > 32) { + nbits = 32; + } + for (i=0; i<nbits; i++) { + str[i] = '0'; + } + str[nbits] = '\0'; + mask = 1; + for (i=nbits-1; i>=0; i--) { + if (st & mask) { + str[i] = '1'; + } + mask = mask << 1; + } + return str; /* take care to use or copy immediately */ +} + +char *get_user_name(void) { + char *user = NULL; + + user = getenv("USER"); + if (user == NULL) { + user = getenv("LOGNAME"); + } + +#if LIBVNCSERVER_HAVE_PWD_H + if (user == NULL) { + struct passwd *pw = getpwuid(getuid()); + if (pw) { + user = pw->pw_name; + } + } +#endif + + if (user) { + return(strdup(user)); + } else { + return(strdup("unknown-user")); + } +} + +char *get_home_dir(void) { + char *home = NULL; + + home = getenv("HOME"); + +#if LIBVNCSERVER_HAVE_PWD_H + if (home == NULL) { + struct passwd *pw = getpwuid(getuid()); + if (pw) { + home = pw->pw_dir; + } + } +#endif + + if (home) { + return(strdup(home)); + } else { + return(strdup("/")); + } +} + +char *get_shell(void) { + char *shell = NULL; + + shell = getenv("SHELL"); + +#if LIBVNCSERVER_HAVE_PWD_H + if (shell == NULL) { + struct passwd *pw = getpwuid(getuid()); + if (pw) { + shell = pw->pw_shell; + } + } +#endif + + if (shell) { + return(strdup(shell)); + } else { + return(strdup("/bin/sh")); + } +} + +/* + * utility to get the current host name + */ +char *this_host(void) { + char host[MAXN]; +#if LIBVNCSERVER_HAVE_GETHOSTNAME + if (gethostname(host, MAXN) == 0) { + return strdup(host); + } +#endif + return NULL; +} + +int match_str_list(char *str, char **list) { + int i = 0, matched = 0; + + if (! list) { + return matched; + } + while (list[i] != NULL) { + if (!strcmp(list[i], "*")) { + matched = 1; + break; + } else if (strstr(str, list[i])) { + matched = 1; + break; + } + i++; + } + return matched; +} + +char **create_str_list(char *cslist) { + int i, n; + char *p, *str = strdup(cslist); + char **list = NULL; + + n = 1; + p = str; + while (*p != '\0') { + if (*p == ',') { + n++; + } + p++; + } + + list = (char **) malloc((n+1)*sizeof(char *)); + for(i=0; i < n+1; i++) { + list[i] = NULL; + } + + p = strtok(str, ","); + i = 0; + while (p && i < n) { + list[i++] = strdup(p); + p = strtok(NULL, ","); + } + free(str); + + return list; +} + +/* + * simple function for measuring sub-second time differences, using + * a double to hold the value. + */ +double dtime(double *t_old) { + /* + * usage: call with 0.0 to initialize, subsequent calls give + * the time difference since last call. + */ + double t_now, dt; + struct timeval now; + + gettimeofday(&now, NULL); + t_now = now.tv_sec + ( (double) now.tv_usec/1000000. ); + if (*t_old == 0.0) { + *t_old = t_now; + return t_now; + } + dt = t_now - *t_old; + *t_old = t_now; + return(dt); +} + +/* common dtime() activities: */ +double dtime0(double *t_old) { + *t_old = 0.0; + return dtime(t_old); +} + +double dnow(void) { + double t; + return dtime0(&t); +} + +double dnowx(void) { + return dnow() - x11vnc_start; +} + +double rnow(void) { + double t = dnowx(); + t = t - ((int) t); + if (t > 1.0) { + t = 1.0; + } else if (t < 0.0) { + t = 0.0; + } + return t; +} + +double rfac(void) { + double f = (double) rand(); + f = f / ((double) RAND_MAX); + return f; +} + +/* + * utility wrapper to call rfbProcessEvents + * checks that we are not in threaded mode. + */ +#define USEC_MAX 999999 /* libvncsever assumes < 1 second */ +void rfbPE(long usec) { + if (! screen) { + return; + } + + if (usec > USEC_MAX) { + usec = USEC_MAX; + } + if (! use_threads) { + rfbProcessEvents(screen, usec); + } +} + +void rfbCFD(long usec) { + if (! screen) { + return; + } + if (usec > USEC_MAX) { + usec = USEC_MAX; + } + if (! use_threads) { + rfbCheckFds(screen, usec); + } +} + + |