fix FreeBSD support

The GNU/kFreeBSD (and BSDs in general) have a different
layout of struct sockaddr, sockaddr_in, sockaddr_un ...

The first member do not have to be "sa_family",
they also have "sa_len" field.

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Petr Salinger 2008-07-07 17:57:37 +02:00 committed by Julien Danjou
parent ee78071902
commit a9d15a0845
2 changed files with 13 additions and 2 deletions

View File

@ -70,6 +70,14 @@ AC_HEADER_STDC
AC_SEARCH_LIBS(getaddrinfo, socket)
AC_SEARCH_LIBS(connect, socket)
dnl check for the sockaddr_un.sun_len member
AC_CHECK_MEMBER([struct sockaddr_un.sun_len],
[AC_DEFINE(HAVE_SOCKADDR_SUN_LEN,1,[Have the sockaddr_un.sun_len member.])],
[],
[ #include <sys/types.h>
#include <sys/un.h>
])
xcbincludedir='${includedir}/xcb'
AC_SUBST(xcbincludedir)

View File

@ -246,13 +246,16 @@ static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port)
static int _xcb_open_unix(char *protocol, const char *file)
{
int fd;
struct sockaddr_un addr = { AF_UNIX };
struct sockaddr_un addr;
if (protocol && strcmp("unix",protocol))
return -1;
strcpy(addr.sun_path, file);
addr.sun_family = AF_UNIX;
#if HAVE_SOCKADDR_SUN_LEN
addr.sun_len = SUN_LEN(&addr);
#endif
fd = socket(AF_UNIX, SOCK_STREAM, 0);
if(fd == -1)
return -1;