diff -Naur transmission-1.72/cli/Makefile.am transmission-1.72-haiku/cli/Makefile.am --- transmission-1.72/cli/Makefile.am 2009-06-17 00:01:54.000000000 +0000 +++ transmission-1.72-haiku/cli/Makefile.am 2009-07-09 10:05:58.000000000 +0000 @@ -26,6 +26,5 @@ $(LIBCURL_LIBS) \ $(ZLIB_LIBS) \ $(OPENSSL_LIBS) \ - $(PTHREAD_LIBS) \ - -lm + $(PTHREAD_LIBS) diff -Naur transmission-1.72/configure.ac transmission-1.72-haiku/configure.ac --- transmission-1.72/configure.ac 2009-06-17 00:01:56.000000000 +0000 +++ transmission-1.72-haiku/configure.ac 2009-07-09 10:10:19.000000000 +0000 @@ -163,7 +163,8 @@ dnl build our copy of libevent whether we use it or not, dnl because "make dist" needs its Makefiles to exist, and dnl AM_CONDITIONAL + AC_CONFIG_SUBDIRS don't seem to play nice -AC_CONFIG_SUBDIRS([third-party/libevent]) +dnl (HaikuPorts only: require an installed copy) +dnl AC_CONFIG_SUBDIRS([third-party/libevent]) libevent_source=bundled AC_CHECK_LIB([event],[evutil_vsnprintf], [libevent_found=yes], @@ -179,13 +180,19 @@ fi fi if test "x$libevent_source" = "xbundled"; then + dnl (HaikuPorts only: require an installed copy) + AC_MSG_ERROR("libevent not found!") AC_MSG_WARN([using our own libevent from third-party/libevent/]) AC_MSG_WARN([if you are cross-compiling this is probably NOT what you want.]) LIBEVENT_CFLAGS="-I\$(top_srcdir)/third-party/libevent -I\$(top_builddir)/third-party/libevent" LIBEVENT_LIBS="\$(top_builddir)/third-party/libevent/libevent.la" else LIBEVENT_CFLAGS="" - LIBEVENT_LIBS="-levent -lrt" + dnl FIXME Shouldn't libtool handle this? + case "${host_os}" in + haiku*) LIBEVENT_LIBS="-levent" ;; + *) LIBEVENT_LIBS="-levent -lrt" ;; + esac fi AC_SUBST(LIBEVENT_CFLAGS) AC_SUBST(LIBEVENT_LIBS) @@ -277,17 +284,19 @@ fi use_nls=no -if test "x$enable_nls" = "xyes" ; then - use_nls=yes - IT_PROG_INTLTOOL([0.40.0],[no-xml]) - AC_CHECK_HEADERS([libintl.h]) - GETTEXT_PACKAGE=transmission - AC_SUBST(GETTEXT_PACKAGE) - AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package]) - AM_GLIB_GNU_GETTEXT - transmissionlocaledir='${prefix}/${DATADIRNAME}/locale' - AC_SUBST(transmissionlocaledir) -fi +dnl HACK for Haiku: comment this whole part because we don't need it and +dnl it would require us to have intltool installed only to run autoconf +dnl if test "x$enable_nls" = "xyes" ; then +dnl use_nls=yes +dnl IT_PROG_INTLTOOL([0.40.0],[no-xml]) +dnl AC_CHECK_HEADERS([libintl.h]) +dnl GETTEXT_PACKAGE=transmission +dnl AC_SUBST(GETTEXT_PACKAGE) +dnl AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package]) +dnl AM_GLIB_GNU_GETTEXT +dnl transmissionlocaledir='${prefix}/${DATADIRNAME}/locale' +dnl AC_SUBST(transmissionlocaledir) +dnl fi dnl ---------------------------------------------------------------------------- diff -Naur transmission-1.72/daemon/Makefile.am transmission-1.72-haiku/daemon/Makefile.am --- transmission-1.72/daemon/Makefile.am 2009-06-17 00:01:54.000000000 +0000 +++ transmission-1.72-haiku/daemon/Makefile.am 2009-07-09 10:05:58.000000000 +0000 @@ -28,7 +28,7 @@ $(LIBCURL_LIBS) \ $(ZLIB_LIBS) \ $(OPENSSL_LIBS) \ - $(PTHREAD_LIBS) -lm + $(PTHREAD_LIBS) noinst_HEADERS = \ watch.h diff -Naur transmission-1.72/libtransmission/JSON_parser.c transmission-1.72-haiku/libtransmission/JSON_parser.c --- transmission-1.72/libtransmission/JSON_parser.c 2009-06-17 00:01:44.000000000 +0000 +++ transmission-1.72-haiku/libtransmission/JSON_parser.c 2009-07-09 10:12:28.000000000 +0000 @@ -73,6 +73,10 @@ # endif #endif +/* This can be removed once http://dev.haiku-os.org/ticket/3408 is fixed */ +#ifdef __HAIKU__ +# define strtold strtod +#endif #define true 1 #define false 0 diff -Naur transmission-1.72/libtransmission/Makefile.am transmission-1.72-haiku/libtransmission/Makefile.am --- transmission-1.72/libtransmission/Makefile.am 2009-06-17 00:01:44.000000000 +0000 +++ transmission-1.72-haiku/libtransmission/Makefile.am 2009-07-09 10:05:58.000000000 +0000 @@ -132,8 +132,7 @@ $(LIBCURL_LIBS) \ $(OPENSSL_LIBS) \ $(PTHREAD_LIBS) \ - $(ZLIB_LIBS) \ - -lm + $(ZLIB_LIBS) bencode_test_SOURCES = bencode-test.c bencode_test_LDADD = ${apps_ldadd} diff -Naur transmission-1.72/libtransmission/fdlimit.c transmission-1.72-haiku/libtransmission/fdlimit.c --- transmission-1.72/libtransmission/fdlimit.c 2009-06-17 00:01:44.000000000 +0000 +++ transmission-1.72-haiku/libtransmission/fdlimit.c 2009-07-09 10:05:58.000000000 +0000 @@ -585,7 +585,6 @@ #endif tr_err( _( "Couldn't create socket: %s" ), tr_strerror( sockerrno ) ); - s = -sockerrno; } if( s > -1 ) diff -Naur transmission-1.72/libtransmission/net.c transmission-1.72-haiku/libtransmission/net.c --- transmission-1.72/libtransmission/net.c 2009-06-17 00:01:44.000000000 +0000 +++ transmission-1.72-haiku/libtransmission/net.c 2009-07-09 10:05:58.000000000 +0000 @@ -195,25 +195,6 @@ return memcmp( &a->addr, &b->addr, sizes[a->type] ); } -tr_bool -tr_net_hasIPv6( tr_port port ) -{ - static tr_bool result = FALSE; - static tr_bool alreadyDone = FALSE; - - if( !alreadyDone ) - { - int fd = tr_netBindTCP( &tr_in6addr_any, port, TRUE ); - if( fd >= 0 || -fd != EAFNOSUPPORT ) /* we support ipv6 */ - result = TRUE; - if( fd >= 0 ) - EVUTIL_CLOSESOCKET( fd ); - alreadyDone = TRUE; - } - - return result; -} - /*********************************************************************** * TCP sockets **********************************************************************/ @@ -368,8 +349,8 @@ return s; } -int -tr_netBindTCP( const tr_address * addr, tr_port port, tr_bool suppressMsgs ) +static int +tr_netBindTCPImpl( const tr_address * addr, tr_port port, tr_bool suppressMsgs, int * errOut ) { static const int domains[NUM_TR_AF_INET_TYPES] = { AF_INET, AF_INET6 }; struct sockaddr_storage sock; @@ -380,11 +361,14 @@ assert( tr_isAddress( addr ) ); fd = socket( domains[addr->type], SOCK_STREAM, 0 ); - if( fd < 0 ) + if( fd < 0 ) { + *errOut = sockerrno; return -1; + } if( evutil_make_socket_nonblocking( fd ) < 0 ) { EVUTIL_CLOSESOCKET( fd ); + *errOut = sockerrno; return -1; } @@ -395,8 +379,10 @@ #ifdef IPV6_V6ONLY if( addr->type == TR_AF_INET6 ) if( setsockopt( fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof( optval ) ) == -1 ) - if( sockerrno != ENOPROTOOPT ) /* if the kernel doesn't support it, ignore it */ - return -sockerrno; + if( sockerrno != ENOPROTOOPT ) { /* if the kernel doesn't support it, ignore it */ + *errOut = sockerrno; + return -1; + } #endif addrlen = setup_sockaddr( addr, htons( port ), &sock ); @@ -406,7 +392,8 @@ tr_err( _( "Couldn't bind port %d on %s: %s" ), port, tr_ntop_non_ts( addr ), tr_strerror( err ) ); EVUTIL_CLOSESOCKET( fd ); - return -err; + *errOut = err; + return -1; } if( !suppressMsgs ) @@ -414,13 +401,42 @@ if( listen( fd, 128 ) == -1 ) { EVUTIL_CLOSESOCKET( fd ); - return -sockerrno; + *errOut = sockerrno; + return -1; } return fd; } int +tr_netBindTCP( const tr_address * addr, tr_port port, tr_bool suppressMsgs ) +{ + int unused; + return tr_netBindTCPImpl( addr, port, suppressMsgs, &unused ); +} + +tr_bool +tr_net_hasIPv6( tr_port port ) +{ + static tr_bool result = FALSE; + static tr_bool alreadyDone = FALSE; + + if( !alreadyDone ) + { + int err; + int fd = tr_netBindTCPImpl( &tr_in6addr_any, port, TRUE, &err ); + if( fd >= 0 || err != EAFNOSUPPORT ) /* we support ipv6 */ + result = TRUE; + if( fd >= 0 ) + EVUTIL_CLOSESOCKET( fd ); + tr_inf( "IPv6 support: %s", result ? "yes" : "no" ); + alreadyDone = TRUE; + } + + return result; +} + +int tr_netAccept( tr_session * session UNUSED, int b, tr_address * addr, diff -Naur transmission-1.72/libtransmission/net.h transmission-1.72-haiku/libtransmission/net.h --- transmission-1.72/libtransmission/net.h 2009-06-17 00:01:44.000000000 +0000 +++ transmission-1.72-haiku/libtransmission/net.h 2009-07-09 10:13:49.000000000 +0000 @@ -56,6 +56,32 @@ #define sockerrno errno #endif +/* To be removed once those macros are added to Haiku's headers */ +#ifndef IN6ADDR_ANY_INIT + #define IN6ADDR_ANY_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}} +#endif +#ifndef INET6_ADDRSTRLEN + #define INET6_ADDRSTRLEN 46 +#endif +#ifndef IN6_IS_ADDR_V4MAPPED + #define IN6_IS_ADDR_V4MAPPED(a) \ + ((((const uint32_t *) (a))[0] == 0) && \ + (((const uint32_t *) (a))[1] == 0) && \ + (((const uint32_t *) (a))[2] == htonl(0xFFFF))) +#endif +#ifndef IN6_IS_ADDR_V4COMPAT + #define IN6_IS_ADDR_V4COMPAT(a) \ + ((((const uint32_t *) (a))[0] == 0) && \ + (((const uint32_t *) (a))[1] == 0) && \ + (((const uint32_t *) (a))[2] == 0) && \ + (ntohl(((const uint32_t *) (a))[2]) > 1)) +#endif +#ifndef IN6_IS_ADDR_LINKLOCAL + #define IN6_IS_ADDR_LINKLOCAL(a) \ + ((((const uint32_t *) (a))[0] & htonl(0xFFC00000)) \ + == htonl(0xFE800000)) +#endif + struct tr_session; typedef enum tr_address_type diff -Naur transmission-1.72/libtransmission/platform.c transmission-1.72-haiku/libtransmission/platform.c --- transmission-1.72/libtransmission/platform.c 2009-06-17 00:01:44.000000000 +0000 +++ transmission-1.72-haiku/libtransmission/platform.c 2009-07-09 10:07:24.000000000 +0000 @@ -17,7 +17,9 @@ #ifdef SYS_DARWIN #include #endif - + #ifdef __HAIKU__ + #include + #endif #define _XOPEN_SOURCE 600 /* needed for recursive locks. */ #ifndef __USE_UNIX98 #define __USE_UNIX98 /* some older Linuxes need it spelt out for them */ @@ -271,6 +273,10 @@ char appdata[MAX_PATH]; /* SHGetFolderPath() requires MAX_PATH */ SHGetFolderPath( NULL, CSIDL_APPDATA, NULL, 0, appdata ); path = tr_buildPath( appdata, "Transmission", NULL ); +#elif defined( __HAIKU__ ) + char buf[MAX_PATH_LENGTH]; + find_directory( B_USER_SETTINGS_DIRECTORY, -1, true, buf, sizeof(buf) ); + path = tr_buildPath( buf, "Transmission", NULL ); #else path = tr_buildPath( getHomeDir( ), ".transmission", NULL ); #endif @@ -431,6 +437,10 @@ char appdata[MAX_PATH]; /* SHGetFolderPath() requires MAX_PATH */ SHGetFolderPath( NULL, CSIDL_APPDATA, NULL, 0, appdata ); s = tr_buildPath( appdata, appname, NULL ); +#elif defined( __HAIKU__ ) + char buf[MAX_PATH_LENGTH]; + find_directory( B_USER_SETTINGS_DIRECTORY, -1, true, buf, sizeof(buf) ); + s = tr_buildPath( buf, appname, NULL ); #else if( ( s = getenv( "XDG_CONFIG_HOME" ) ) ) s = tr_buildPath( s, appname, NULL ); @@ -486,7 +496,11 @@ } if( user_dir == NULL ) +#ifdef __HAIKU__ + user_dir = tr_buildPath( getHomeDir( ), "Desktop", NULL ); +#else user_dir = tr_buildPath( getHomeDir( ), "Downloads", NULL ); +#endif tr_free( content ); tr_free( config_file ); diff -Naur transmission-1.72/third-party/Makefile.am transmission-1.72-haiku/third-party/Makefile.am --- transmission-1.72/third-party/Makefile.am 2009-06-17 00:01:54.000000000 +0000 +++ transmission-1.72-haiku/third-party/Makefile.am 2009-07-09 10:05:58.000000000 +0000 @@ -1,5 +1,5 @@ -SUBDIRS = libnatpmp miniupnp dht libevent +SUBDIRS = libnatpmp miniupnp dht EXTRA_DIST = macosx-libevent-config.h diff -Naur transmission-1.72/third-party/libnatpmp/getgateway.c transmission-1.72-haiku/third-party/libnatpmp/getgateway.c --- transmission-1.72/third-party/libnatpmp/getgateway.c 2009-06-17 00:01:54.000000000 +0000 +++ transmission-1.72-haiku/third-party/libnatpmp/getgateway.c 2009-07-09 10:05:58.000000000 +0000 @@ -75,6 +75,12 @@ #define MAX_KEY_LENGTH 255 #define MAX_VALUE_LENGTH 16383 #endif +#ifdef __HAIKU__ +#include +#include +#include +#include +#endif #include "getgateway.h" #ifndef WIN32 @@ -421,3 +427,56 @@ } #endif /* #ifdef USE_WIN32_CODE */ +#ifdef __HAIKU__ +int getdefaultgateway(in_addr_t *addr) +{ + int fd, ret = -1; + struct ifconf config; + void *buffer = NULL; + struct ifreq *interface; + + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + return -1; + } + if (ioctl(fd, SIOCGRTSIZE, &config, sizeof(config)) != 0) { + goto fail; + } + if (config.ifc_value < 1) { + goto fail; /* No routes */ + } + if ((buffer = malloc(config.ifc_value)) == NULL) { + goto fail; + } + config.ifc_len = config.ifc_value; + config.ifc_buf = buffer; + if (ioctl(fd, SIOCGRTTABLE, &config, sizeof(config)) != 0) { + goto fail; + } + for (interface = buffer; + (uint8_t *)interface < (uint8_t *)buffer + config.ifc_len; ) { + struct route_entry route = interface->ifr_route; + int intfSize; + if (route.flags & (RTF_GATEWAY | RTF_DEFAULT)) { + *addr = ((struct sockaddr_in *)route.gateway)->sin_addr.s_addr; + ret = 0; + break; + } + intfSize = sizeof(route) + IF_NAMESIZE; + if (route.destination != NULL) { + intfSize += route.destination->sa_len; + } + if (route.mask != NULL) { + intfSize += route.mask->sa_len; + } + if (route.gateway != NULL) { + intfSize += route.gateway->sa_len; + } + interface = (struct ifreq *)((uint8_t *)interface + intfSize); + } +fail: + free(buffer); + close(fd); + return ret; +} +#endif + diff -Naur transmission-1.72/third-party/miniupnp/upnpreplyparse.h transmission-1.72-haiku/third-party/miniupnp/upnpreplyparse.h --- transmission-1.72/third-party/miniupnp/upnpreplyparse.h 2009-06-17 00:01:54.000000000 +0000 +++ transmission-1.72-haiku/third-party/miniupnp/upnpreplyparse.h 2009-07-09 10:05:59.000000000 +0000 @@ -8,7 +8,7 @@ #ifndef __UPNPREPLYPARSE_H__ #define __UPNPREPLYPARSE_H__ -#if defined(NO_SYS_QUEUE_H) || defined(WIN32) +#if defined(NO_SYS_QUEUE_H) || defined(WIN32) || defined(__HAIKU__) #include "bsdqueue.h" #else #include