diff -urN gtk-vnc-0.3.7.abs/bootstrap gtk-vnc-0.3.7.dan3/bootstrap --- gtk-vnc-0.3.7.abs/bootstrap 1970-01-01 01:00:00.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/bootstrap 2008-10-09 15:23:00.000000000 +0100 @@ -0,0 +1,89 @@ +#!/bin/sh +# Run this after autogen.sh, to pull in all of the gnulib-related bits. +# It's important to run *after* autogen.sh, since it updates some of +# the same files autogen.sh does, yet those from gnulib are newer, +# and match the tests. So if a gnulib bug has been fixed since the +# snapshot taken for whatever gettext release you're using, yet you +# run "make check" against the wrong version, the corresponding unit +# test in gl-tests/ may well fail. + +usage() { + echo >&2 "\ +Usage: $0 [OPTION]... +Bootstrap this package from the checked-out sources. + +Options: + --gnulib-srcdir=DIRNAME Specify the local directory where gnulib + sources reside. Use this if you already + have gnulib sources on your machine, and + do not want to waste your bandwidth downloading + them again. + +If the file bootstrap.conf exists in the current working directory, its +contents are read as shell variables to configure the bootstrap. + +Running without arguments will suffice in most cases. +" +} + +for option +do + case $option in + --help) + usage + exit;; + --gnulib-srcdir=*) + GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;; + *) + echo >&2 "$0: $option: unknown option" + exit 1;; + esac +done + +cleanup_gnulib() { + st=$? + rm -fr .gnulib + exit $st +} + +case ${GNULIB_SRCDIR--} in +-) + if [ ! -d .gnulib ]; then + echo "$0: getting gnulib files..." + + trap cleanup_gnulib 1 2 13 15 + + git clone --depth 1 git://git.sv.gnu.org/gnulib .gnulib || + cleanup_gnulib + + trap - 1 2 13 15 + fi + GNULIB_SRCDIR=.gnulib +esac + +gnulib_tool=$GNULIB_SRCDIR/gnulib-tool +<$gnulib_tool || exit + +modules=' +getaddrinfo +socket +recv +send +connect +malloc +vc-list-files +' + +# Tell gnulib to: +# require LGPLv2+ +# put *.m4 files in new gnulib/m4/ dir +# put *.[ch] files in new gnulib/lib/ dir. + +$gnulib_tool \ + --lgpl=2 \ + --with-tests \ + --m4-base=gnulib/m4 \ + --source-base=gnulib/lib \ + --tests-base=gnulib/tests \ + --import $modules + diff -urN gtk-vnc-0.3.7.abs/configure.ac gtk-vnc-0.3.7.dan3/configure.ac --- gtk-vnc-0.3.7.abs/configure.ac 2008-09-05 13:32:15.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/configure.ac 2008-10-09 15:23:00.000000000 +0100 @@ -23,15 +23,29 @@ AC_CONFIG_HEADERS([config.h:config.hin]) - AC_CANONICAL_TARGET AM_INIT_AUTOMAKE(gtk-vnc, 0.3.7) + +dnl gl_INIT uses m4_foreach_w, yet that is not defined in autoconf-2.59. +dnl In order to accommodate developers with such old tools, here's a +dnl replacement definition. +m4_ifndef([m4_foreach_w], + [m4_define([m4_foreach_w], + [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) + +gl_EARLY +gl_INIT + AC_PROG_CC_STDC AM_PROG_CC_C_O +AC_LIBTOOL_WIN32_DLL + AC_PROG_LIBTOOL +AC_CHECK_HEADERS([pwd.h winsock2.h]) + AC_ARG_WITH(python, [ --with-python build python bindings], [case "${withval}" in @@ -234,6 +248,8 @@ AC_CONFIG_FILES( Makefile + gnulib/lib/Makefile + gnulib/tests/Makefile src/Makefile examples/Makefile plugin/Makefile diff -urN gtk-vnc-0.3.7.abs/Makefile.am gtk-vnc-0.3.7.dan3/Makefile.am --- gtk-vnc-0.3.7.abs/Makefile.am 2008-09-05 13:32:15.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/Makefile.am 2008-10-09 15:22:57.000000000 +0100 @@ -1,5 +1,9 @@ -SUBDIRS = src examples plugin +SUBDIRS = gnulib/lib src examples plugin gnulib/tests + +ACLOCAL_AMFLAGS = -I gnulib/m4 + + pkgconfig_DATA = @PACKAGE@-1.0.pc pkgconfigdir = $(libdir)/pkgconfig diff -urN gtk-vnc-0.3.7.abs/src/continuation.c gtk-vnc-0.3.7.dan3/src/continuation.c --- gtk-vnc-0.3.7.abs/src/continuation.c 2008-09-05 13:32:16.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/src/continuation.c 2008-10-09 15:23:00.000000000 +0100 @@ -8,6 +8,8 @@ * GTK VNC Widget */ +#include + #include "continuation.h" /* diff -urN gtk-vnc-0.3.7.abs/src/coroutine_gthread.c gtk-vnc-0.3.7.dan3/src/coroutine_gthread.c --- gtk-vnc-0.3.7.abs/src/coroutine_gthread.c 2008-09-05 13:32:16.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/src/coroutine_gthread.c 2008-10-09 15:23:00.000000000 +0100 @@ -8,6 +8,8 @@ * GTK VNC Widget */ +#include + #include "coroutine.h" #include #include @@ -17,13 +19,24 @@ static struct coroutine *current; static struct coroutine leader; +#if 0 +#define CO_DEBUG(OP) fprintf(stderr, "%s %p %s %d\n", OP, g_thread_self(), __FUNCTION__, __LINE__) +#else +#define CO_DEBUG(OP) +#endif + static void coroutine_system_init(void) { - if (!g_thread_supported()) + if (!g_thread_supported()) { + CO_DEBUG("INIT"); g_thread_init(NULL); + } + run_cond = g_cond_new(); run_lock = g_mutex_new(); + CO_DEBUG("LOCK"); + g_mutex_lock(run_lock); /* The thread that creates the first coroutine is the system coroutine * so let's fill out a structure for it */ @@ -42,17 +55,22 @@ static gpointer coroutine_thread(gpointer opaque) { struct coroutine *co = opaque; - + CO_DEBUG("LOCK"); g_mutex_lock(run_lock); - while (!co->runnable) + while (!co->runnable) { + CO_DEBUG("WAIT"); g_cond_wait(run_cond, run_lock); + } + CO_DEBUG("RUNNABLE"); current = co; co->data = co->entry(co->data); co->exited = 1; co->caller->runnable = TRUE; + CO_DEBUG("BROADCAST"); g_cond_broadcast(run_cond); + CO_DEBUG("UNLOCK"); g_mutex_unlock(run_lock); return NULL; @@ -62,7 +80,8 @@ { if (run_cond == NULL) coroutine_system_init(); - + + CO_DEBUG("NEW"); co->thread = g_thread_create_full(coroutine_thread, co, co->stack_size, FALSE, TRUE, G_THREAD_PRIORITY_NORMAL, @@ -88,15 +107,19 @@ to->runnable = TRUE; to->data = arg; to->caller = from; + CO_DEBUG("BROADCAST"); g_cond_broadcast(run_cond); + CO_DEBUG("UNLOCK"); g_mutex_unlock(run_lock); - + CO_DEBUG("LOCK"); g_mutex_lock(run_lock); - while (!from->runnable) + while (!from->runnable) { + CO_DEBUG("WAIT"); g_cond_wait(run_cond, run_lock); - + } current = from; + CO_DEBUG("SWAPPED"); return from->data; } @@ -111,6 +134,7 @@ fprintf(stderr, "Co-routine is re-entering itself\n"); abort(); } + CO_DEBUG("SWAP"); return coroutine_swap(coroutine_self(), to, arg); } @@ -121,6 +145,8 @@ fprintf(stderr, "Co-routine is yielding to no one\n"); abort(); } + + CO_DEBUG("SWAP"); coroutine_self()->caller = NULL; return coroutine_swap(coroutine_self(), to, arg); } diff -urN gtk-vnc-0.3.7.abs/src/coroutine_ucontext.c gtk-vnc-0.3.7.dan3/src/coroutine_ucontext.c --- gtk-vnc-0.3.7.abs/src/coroutine_ucontext.c 2008-09-05 13:32:16.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/src/coroutine_ucontext.c 2008-10-09 15:23:00.000000000 +0100 @@ -8,6 +8,8 @@ * GTK VNC Widget */ +#include + #include #include #include diff -urN gtk-vnc-0.3.7.abs/src/gvnc.c gtk-vnc-0.3.7.dan3/src/gvnc.c --- gtk-vnc-0.3.7.abs/src/gvnc.c 2008-09-05 13:32:16.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/src/gvnc.c 2008-10-09 15:23:00.000000000 +0100 @@ -8,13 +8,14 @@ * GTK VNC Widget */ +#include + #include "gvnc.h" #include #include #include -#include #include #include #include @@ -40,6 +41,14 @@ #include #include "vnc_keycodes.h" +#include "getaddrinfo.h" + +/* AI_ADDRCONFIG is missing on some systems and gnulib won't provide it + even if its emulated getaddrinfo() for us . */ +#ifndef AI_ADDRCONFIG +# define AI_ADDRCONFIG 0 +#endif + struct wait_queue { @@ -185,7 +194,6 @@ g_io_add_watch(channel, cond | G_IO_HUP | G_IO_ERR | G_IO_NVAL, g_io_wait_helper, coroutine_self()); ret = coroutine_yield(NULL); - return *ret; } @@ -344,7 +352,7 @@ size_t offset = 0; if (gvnc->has_error) return -EINVAL; - + while (offset < len) { size_t tmp; @@ -376,7 +384,7 @@ if (ret == -1) { switch (errno) { - case EAGAIN: + case EWOULDBLOCK: if (gvnc->wait_interruptable) { if (!g_io_wait_interruptable(&gvnc->wait, gvnc->channel, G_IO_IN)) @@ -386,7 +394,7 @@ case EINTR: continue; default: - GVNC_DEBUG("Closing the connection: gvnc_read() - ret=-1\n"); + GVNC_DEBUG("Closing the connection: gvnc_read() - errno=%d\n", errno); gvnc->has_error = TRUE; return -errno; } @@ -436,12 +444,12 @@ gvnc->write_offset-offset); if (ret == -1) { switch (errno) { - case EAGAIN: + case EWOULDBLOCK: g_io_wait(gvnc->channel, G_IO_OUT); case EINTR: continue; default: - GVNC_DEBUG("Closing the connection: gvnc_flush\n"); + GVNC_DEBUG("Closing the connection: gvnc_flush %d\n", errno); gvnc->has_error = TRUE; return; } @@ -1341,12 +1349,12 @@ static int gvnc_read_zrle_rl(struct gvnc *gvnc) { int rl = 1; - uint8_t byte; + uint8_t b; do { - byte = gvnc_read_u8(gvnc); - rl += byte; - } while (!gvnc_has_error(gvnc) && byte == 255); + b = gvnc_read_u8(gvnc); + rl += b; + } while (!gvnc_has_error(gvnc) && b == 255); return rl; } @@ -2802,12 +2810,12 @@ if (gvnc_has_error(gvnc)) return FALSE; - if (!gvnc->fmt.true_color_flag && gvnc->ops.get_preferred_pixel_format) + if (!gvnc->fmt.true_color_flag && gvnc->ops.get_preferred_pixel_format) { if (gvnc->ops.get_preferred_pixel_format(gvnc->ops_data, &gvnc->fmt)) gvnc_set_pixel_format(gvnc, &gvnc->fmt); else goto fail; - + } memset(&gvnc->strm, 0, sizeof(gvnc->strm)); /* FIXME what level? */ for (i = 0; i < 5; i++) @@ -2822,15 +2830,16 @@ return !gvnc_has_error(gvnc); } -gboolean gvnc_open_fd(struct gvnc *gvnc, int fd) +static gboolean gvnc_set_nonblock(int fd) { - int flags; - if (gvnc_is_open(gvnc)) { - GVNC_DEBUG ("Error: already connected?\n"); +#ifdef __MINGW32__ + unsigned long flags = 1; + if (ioctlsocket(fd, FIONBIO, &flags) < 0) { + GVNC_DEBUG ("Failed to set nonblocking flag\n"); return FALSE; } - - GVNC_DEBUG("Connecting to FD %d\n", fd); +#else + int flags; if ((flags = fcntl(fd, F_GETFL)) < 0) { GVNC_DEBUG ("Failed to fcntl()\n"); return FALSE; @@ -2840,6 +2849,21 @@ GVNC_DEBUG ("Failed to fcntl()\n"); return FALSE; } +#endif + return TRUE; +} + +gboolean gvnc_open_fd(struct gvnc *gvnc, int fd) +{ + if (gvnc_is_open(gvnc)) { + GVNC_DEBUG ("Error: already connected?\n"); + return FALSE; + } + + GVNC_DEBUG("Connecting to FD %d\n", fd); + + if (!gvnc_set_nonblock(fd)) + return FALSE; if (!(gvnc->channel = g_io_channel_unix_new(fd))) { GVNC_DEBUG ("Failed to g_io_channel_unix_new()\n"); @@ -2873,7 +2897,7 @@ runp = ai; while (runp != NULL) { - int flags, fd; + int fd; GIOChannel *chan; if ((fd = socket(runp->ai_family, runp->ai_socktype, @@ -2883,17 +2907,8 @@ } GVNC_DEBUG("Trying socket %d\n", fd); - if ((flags = fcntl(fd, F_GETFL)) < 0) { - close(fd); - GVNC_DEBUG ("Failed to fcntl()\n"); - break; - } - flags |= O_NONBLOCK; - if (fcntl(fd, F_SETFL, flags) < 0) { - close(fd); - GVNC_DEBUG ("Failed to fcntl()\n"); - break; - } + if (!gvnc_set_nonblock(fd)) + break; if (!(chan = g_io_channel_unix_new(fd))) { close(fd); @@ -2904,14 +2919,15 @@ reconnect: /* FIXME: Better handle EINPROGRESS/EISCONN return values, as explained in connect(2) man page */ - if ( (connect(fd, runp->ai_addr, runp->ai_addrlen) == 0) || errno == EISCONN) { + if ((connect(fd, runp->ai_addr, runp->ai_addrlen) == 0) || + errno == EISCONN) { gvnc->channel = chan; gvnc->fd = fd; freeaddrinfo(ai); return !gvnc_has_error(gvnc); } - - if (errno == EINPROGRESS) { + if (errno == EINPROGRESS || + errno == EWOULDBLOCK) { g_io_wait(chan, G_IO_OUT|G_IO_ERR|G_IO_HUP); goto reconnect; } else if (errno != ECONNREFUSED && diff -urN gtk-vnc-0.3.7.abs/src/Makefile.am gtk-vnc-0.3.7.dan3/src/Makefile.am --- gtk-vnc-0.3.7.abs/src/Makefile.am 2008-09-05 13:32:15.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/src/Makefile.am 2008-10-09 15:23:00.000000000 +0100 @@ -4,13 +4,15 @@ lib_LTLIBRARIES = libgtk-vnc-1.0.la libgtk_vnc_1_0_la_LIBADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @GNUTLS_LIBS@ \ - @GTHREAD_LIBS@ + @GTHREAD_LIBS@ \ + ../gnulib/lib/libgnu.la libgtk_vnc_1_0_la_CFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @GNUTLS_CFLAGS@ \ @GTHREAD_CFLAGS@ @WARNING_CFLAGS@ \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ - -DG_LOG_DOMAIN=\"gtk-vnc\" + -DG_LOG_DOMAIN=\"gtk-vnc\" \ + -I$(top_srcdir)gnulib/lib -I../gnulib/lib libgtk_vnc_1_0_la_LDFLAGS = -Wl, @LD_VERSION_SCRIPT_SUPPORT@ \ - -version-info 0:1:0 + -version-info 0:1:0 -no-undefined gtk_vnc_includedir = $(includedir)/gtk-vnc-1.0/ gtk_vnc_include_HEADERS = vncdisplay.h diff -urN gtk-vnc-0.3.7.abs/src/vncdisplay.c gtk-vnc-0.3.7.dan3/src/vncdisplay.c --- gtk-vnc-0.3.7.abs/src/vncdisplay.c 2008-10-09 15:21:21.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/src/vncdisplay.c 2008-10-09 15:23:00.000000000 +0100 @@ -8,6 +8,8 @@ * GTK VNC Widget */ +#include + #include "vncdisplay.h" #include "coroutine.h" #include "gvnc.h" @@ -24,7 +26,9 @@ #include #include #include +#ifdef HAVE_PWD_H #include +#endif #if WITH_GTKGLEXT #include @@ -2191,33 +2195,44 @@ static int vnc_display_set_x509_credential(VncDisplay *obj, const char *name) { - char sysdir[PATH_MAX], userdir[PATH_MAX]; - struct passwd *pw; char file[PATH_MAX]; + char sysdir[PATH_MAX]; +#ifndef __MINGW32__ + char userdir[PATH_MAX]; + struct passwd *pw; char *dirs[] = { sysdir, userdir }; +#else + char *dirs[] = { sysdir }; +#endif strncpy(sysdir, SYSCONFDIR "/pki", PATH_MAX-1); sysdir[PATH_MAX-1] = '\0'; +#ifndef __MINGW32__ if (!(pw = getpwuid(getuid()))) return TRUE; snprintf(userdir, PATH_MAX-1, "%s/.pki", pw->pw_dir); userdir[PATH_MAX-1] = '\0'; +#endif - if (vnc_display_best_path(file, PATH_MAX, "CA", "cacert.pem", dirs, 2) < 0) + if (vnc_display_best_path(file, PATH_MAX, "CA", "cacert.pem", + dirs, sizeof(dirs)/sizeof(dirs[0])) < 0) return TRUE; gvnc_set_credential_x509_cacert(obj->priv->gvnc, file); /* Don't mind failures of CRL */ - if (vnc_display_best_path(file, PATH_MAX, "CA", "cacrl.pem", dirs, 2) == 0) + if (vnc_display_best_path(file, PATH_MAX, "CA", "cacrl.pem", + dirs, sizeof(dirs)/sizeof(dirs[0])) == 0) gvnc_set_credential_x509_cacert(obj->priv->gvnc, file); /* Set client key & cert if we have them. Server will reject auth * if it decides it requires them*/ - if (vnc_display_best_path(file, PATH_MAX, name, "private/clientkey.pem", dirs, 2) == 0) + if (vnc_display_best_path(file, PATH_MAX, name, "private/clientkey.pem", + dirs, sizeof(dirs)/sizeof(dirs[0])) == 0) gvnc_set_credential_x509_key(obj->priv->gvnc, file); - if (vnc_display_best_path(file, PATH_MAX, name, "clientcert.pem", dirs, 2) == 0) + if (vnc_display_best_path(file, PATH_MAX, name, "clientcert.pem", + dirs, sizeof(dirs)/sizeof(dirs[0])) == 0) gvnc_set_credential_x509_cert(obj->priv->gvnc, file); return FALSE; diff -urN gtk-vnc-0.3.7.abs/vc-list-files gtk-vnc-0.3.7.dan3/vc-list-files --- gtk-vnc-0.3.7.abs/vc-list-files 1970-01-01 01:00:00.000000000 +0100 +++ gtk-vnc-0.3.7.dan3/vc-list-files 2008-10-09 15:23:00.000000000 +0100 @@ -0,0 +1,107 @@ +#!/bin/sh +# List version-controlled file names. + +# Print a version string. +scriptversion=2008-07-11.19 + +# Copyright (C) 2006-2008 Free Software Foundation, Inc. + +# This program 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 3 of the License, or +# (at your option) any later version. + +# This program 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 this program. If not, see . + + +# List the specified version-controlled files. +# With no argument, list them all. With a single DIRECTORY argument, +# list the version-controlled files in that directory. + +# If there's an argument, it must be a single, "."-relative directory name. +# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/ + +postprocess= +case $1 in + --help) cat <. +EOF + exit ;; + + --version) + year=`echo "$scriptversion" | sed 's/[^0-9].*//'` + cat < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. +EOF + exit ;; + + -C) + test "$2" = . || postprocess="| sed 's|^|$2/|'" + cd "$2" || exit 1 + shift; shift ;; +esac + +dir= +case $# in + 0) ;; + 1) dir=$1 ;; + *) echo "$0: too many arguments" 1>&2 + echo "Usage: $0 [-C srcdir] [DIR]" 1>&2; exit 1;; +esac + +test "x$dir" = x && dir=. + +if test -d .git; then + eval exec git ls-files '"$dir"' $postprocess +elif test -d .hg; then + eval exec hg locate '"$dir/*"' $postprocess +elif test -d .bzr; then + test "$postprocess" = '' && postprocess="| sed 's|^\./||'" + eval exec bzr ls --versioned '"$dir"' $postprocess +elif test -d CVS; then + test "$postprocess" = '' && postprocess="| sed 's|^\./||'" + if test -x build-aux/cvsu; then + eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess + elif (cvsu --help) >/dev/null 2>&1; then + eval cvsu --find --types=AFGM '"$dir"' $postprocess + else + eval awk -F/ \''{ \ + if (!$1 && $3 !~ /^-/) { \ + f=FILENAME; \ + if (f ~ /CVS\/Entries$/) \ + f = substr(f, 0, length(f)-11); \ + print f $2; \ + }}'\'' \ + `find "$dir" -name Entries -print` /dev/null' $postprocess + fi +else + echo "$0: Failed to determine type of version control used in `pwd`" 1>&2 + exit 1 +fi + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: