Merge branch 'gsoc2010' of git://anongit.freedesktop.org/~chr/libxcb
authorPeter Harris <pharris@opentext.com>
Wed, 8 Sep 2010 18:41:52 +0000 (14:41 -0400)
committerPeter Harris <pharris@opentext.com>
Wed, 8 Sep 2010 18:41:52 +0000 (14:41 -0400)
1  2 
configure.ac
src/xcb_util.c

diff --combined configure.ac
@@@ -3,7 -3,7 +3,7 @@@
  
  AC_PREREQ(2.57)
  AC_INIT([libxcb],
 -        1.6,
 +        1.7,
          [xcb@lists.freedesktop.org])
  AC_CONFIG_SRCDIR([xcb.pc.in])
  AM_INIT_AUTOMAKE([foreign dist-bzip2])
@@@ -146,6 -146,7 +146,7 @@@ XCB_EXTENSION(XFixes, "yes"
  XCB_EXTENSION(XFree86-DRI, "yes")
  XCB_EXTENSION(Xinerama, "yes")
  XCB_EXTENSION(XInput, "no")
+ XCB_EXTENSION(XKB, "no")
  XCB_EXTENSION(Xprint, "yes")
  XCB_EXTENSION(SELinux, "no")
  XCB_EXTENSION(XTest, "yes")
@@@ -155,7 -156,7 +156,7 @@@ XCB_EXTENSION(XvMC, "yes"
  AC_ARG_WITH(launchd, AS_HELP_STRING([--with-launchd], [Build with support for Apple's launchd (default: auto)]), [LAUNCHD=$withval], [LAUNCHD=auto])
  if test "x$LAUNCHD" = xauto; then
        unset LAUNCHD
 -      AC_CHECK_PROG(LAUNCHD, [launchd], [yes], [no])
 +      AC_CHECK_PROG(LAUNCHD, [launchd], [yes], [no], [$PATH$PATH_SEPARATOR/sbin])
  fi
  
  if test "x$LAUNCHD" = xyes ; then
@@@ -189,6 -190,7 +190,7 @@@ xcb-xf86dri.p
  xcb-xfixes.pc
  xcb-xinerama.pc
  xcb-xinput.pc
+ xcb-xkb.pc
  xcb-xprint.pc
  xcb-xselinux.pc
  xcb-xtest.pc
@@@ -212,31 -214,6 +214,31 @@@ echo "    XDM support.........: ${have_
  echo "    Build unit tests....: ${HAVE_CHECK}"
  echo "    XCB buffer size.....: ${xcb_queue_buffer_size}"
  echo ""
 +echo "  X11 extensions"
 +echo "    Composite...........: ${BUILD_COMPOSITE}"
 +echo "    Damage..............: ${BUILD_DAMAGE}"
 +echo "    Dpms................: ${BUILD_DPMS}"
 +echo "    Dri2................: ${BUILD_DRI2}"
 +echo "    Glx.................: ${BUILD_GLX}"
 +echo "    Randr...............: ${BUILD_RANDR}"
 +echo "    Record..............: ${BUILD_RECORD}"
 +echo "    Render..............: ${BUILD_RENDER}"
 +echo "    Resource............: ${BUILD_RESOURCE}"
 +echo "    Screensaver.........: ${BUILD_SCREENSAVER}"
 +echo "    selinux.............: ${BUILD_SELINUX}"
 +echo "    Shape...............: ${BUILD_SHAPE}"
 +echo "    Shm.................: ${BUILD_SHM}"
 +echo "    Sync................: ${BUILD_SYNC}"
 +echo "    Xevie...............: ${BUILD_XEVIE}"
 +echo "    Xfixes..............: ${BUILD_XFIXES}"
 +echo "    Xfree86-dri.........: ${BUILD_XFREE86_DRI}"
 +echo "    xinerama............: ${BUILD_XINERAMA}"
 +echo "    xinput..............: ${BUILD_XINPUT}"
 +echo "    xprint..............: ${BUILD_XPRINT}"
 +echo "    xtest...............: ${BUILD_XTEST}"
 +echo "    xv..................: ${BUILD_XV}"
 +echo "    xvmc................: ${BUILD_XVMC}"
 +echo ""
  echo "  Used CFLAGS:"
  echo "    CPPFLAGS............: ${CPPFLAGS}"
  echo "    CFLAGS..............: ${CFLAGS}"
diff --combined src/xcb_util.c
  
  #include <assert.h>
  #include <sys/types.h>
 -#include <sys/socket.h>
  #include <limits.h>
 -#include <sys/un.h>
 -#include <netinet/in.h>
 -#include <netinet/tcp.h>
  #ifdef DNETCONN
  #include <netdnet/dnetdb.h>
  #include <netdnet/dn.h>
  #endif
 -#include <netdb.h>
  #include <errno.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <stddef.h>
  #include <unistd.h>
 -#include <fcntl.h>
  #include <string.h>
  
 +#ifdef _WIN32
 +#include "xcb_windefs.h"
 +#else
 +#include <sys/socket.h>
 +#include <sys/un.h>
 +#include <netinet/in.h>
 +#include <netinet/tcp.h>
 +#include <fcntl.h>
 +#include <netdb.h>
 +#endif /* _WIN32 */
 +
  #include "xcb.h"
  #include "xcbext.h"
  #include "xcbint.h"
@@@ -64,12 -59,21 +64,22 @@@ int xcb_popcount(uint32_t mask
      return ((y + (y >> 3)) & 030707070707) % 077;
  }
  
+ int xcb_sumof(uint8_t *list, int len)
+ {
+   int i, s = 0;
+   for(i=0; i<len; i++) {
+     s += *list;
+     list++;
+   }
+   return s;
+ }
  static int _xcb_parse_display(const char *name, char **host, char **protocol,
                        int *displayp, int *screenp)
  {
      int len, display, screen;
      char *slash, *colon, *dot, *end;
 +
      if(!name || !*name)
          name = getenv("DISPLAY");
      if(!name)
  
      colon = strrchr(name, ':');
      if(!colon)
 -        return 0;
 +        goto error_out;
      len = colon - name;
      ++colon;
      display = strtoul(colon, &dot, 10);
      if(dot == colon)
 -        return 0;
 +        goto error_out;
      if(*dot == '\0')
          screen = 0;
      else
      {
          if(*dot != '.')
 -            return 0;
 +            goto error_out;
          ++dot;
          screen = strtoul(dot, &end, 10);
          if(end == dot || *end != '\0')
 -            return 0;
 +            goto error_out;
      }
      /* At this point, the display string is fully parsed and valid, but
       * the caller's memory is untouched. */
  
      *host = malloc(len + 1);
      if(!*host)
 -        return 0;
 +        goto error_out;
      memcpy(*host, name, len);
      (*host)[len] = '\0';
      *displayp = display;
      if(screenp)
          *screenp = screen;
      return 1;
 +
 +error_out:
 +    if (protocol) {
 +        free(*protocol);
 +        *protocol = NULL;
 +    }
 +
 +    return 0;
  }
  
  int xcb_parse_display(const char *name, char **host, int *displayp,
  }
  
  static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port);
 +#ifndef _WIN32
  static int _xcb_open_unix(char *protocol, const char *file);
 +#endif /* !WIN32 */
  #ifdef DNETCONN
  static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port);
  #endif
@@@ -195,7 -189,6 +205,7 @@@ static int _xcb_open(const char *host, 
              }
      }
  
 +#ifndef _WIN32
      filelen = strlen(base) + 1 + sizeof(display) * 3 + 1;
      file = malloc(filelen);
      if(file == NULL)
      free(file);
  
      return fd;
 +#endif /* !_WIN32 */
 +    return -1; /* if control reaches here then something has gone wrong */
  }
  
  static int _xcb_socket(int family, int type, int proto)
  #endif
      {
        fd = socket(family, type, proto);
 +#ifndef _WIN32
        if (fd >= 0)
            fcntl(fd, F_SETFD, FD_CLOEXEC);
 +#endif
      }
      return fd;
  }
@@@ -352,7 -341,6 +362,7 @@@ static int _xcb_open_tcp(const char *ho
      return fd;
  }
  
 +#ifndef _WIN32
  static int _xcb_open_unix(char *protocol, const char *file)
  {
      int fd;
      }
      return fd;
  }
 +#endif /* !_WIN32 */
  
  #ifdef HAVE_ABSTRACT_SOCKETS
  static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen)
@@@ -412,28 -399,24 +422,28 @@@ xcb_connection_t *xcb_connect(const cha
  xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, xcb_auth_info_t *auth, int *screenp)
  {
      int fd, display = 0;
 -    char *host;
 -    char *protocol;
 +    char *host = NULL;
 +    char *protocol = NULL;
      xcb_auth_info_t ourauth;
      xcb_connection_t *c;
  
      int parsed = _xcb_parse_display(displayname, &host, &protocol, &display, screenp);
      
 -    if(!parsed)
 -        return (xcb_connection_t *) &error_connection;
 -    else
 +    if(!parsed) {
 +        c = (xcb_connection_t *) &error_connection;
 +        goto out;
 +    } else
          fd = _xcb_open(host, protocol, display);
 -    free(host);
  
 -    if(fd == -1)
 -        return (xcb_connection_t *) &error_connection;
 +    if(fd == -1) {
 +        c = (xcb_connection_t *) &error_connection;
 +        goto out;
 +    }
  
 -    if(auth)
 -        return xcb_connect_to_fd(fd, auth);
 +    if(auth) {
 +        c = xcb_connect_to_fd(fd, auth);
 +        goto out;
 +    }
  
      if(_xcb_get_auth_info(fd, &ourauth, display))
      {
      else
          c = xcb_connect_to_fd(fd, 0);
  
 +out:
 +    free(host);
 +    free(protocol);
      return c;
  }