Hi,

here's the patchset mostly for the lib/ and include/ dir. They must be applied 
in the below order and aim to
 * debug-output.patch:
   redefine debug output macros (also works with win32)
 * soname.patch:
   fix the soname in lib/
 * tcpobex.patch:
   user defined local address and port and IPv6 support
 * dll.patch:
   complete win32-dll support and add visibility for linux/*bsd
 * socket_t.patch:
   use the right type for sockets in win32
 * bluez_compat.patch:
   add lib/bluez_compat.h that joins all available bluetooth implementation
     as bluez compatibility macros
   also adds win32 bluetooth support this way

NOTE: those are experimental patches and need testing. If you are interested 
in some of this, help me test them so it may get integrated into CVS.
None of the patches should change the ABI but they extend the API.

If you need further win32 support (apps/ and glib/ dirs), just tell me to get 
the proper patches.

HS
Index: openobex-anoncvs/lib/bluez_compat.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ openobex-anoncvs/lib/bluez_compat.h	2007-01-10 13:44:58.839002922 +0100
@@ -0,0 +1,50 @@
+
+/* Here are the defines that make it possible to
+ * implement bluetooth with the Bluez API
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef _WIN32
+/* you need the headers files from the Platform SDK */
+#include <winsock2.h>
+#include <ws2bth.h>
+#define bdaddr_t    BTH_ADDR
+#define sockaddr_rc _SOCKADDR_BTH
+#define rc_family   addressFamily
+#define rc_bdaddr   btAddr
+#define rc_channel  port
+#define PF_BLUETOOTH   PF_BTH
+#define AF_BLUETOOTH   PF_BLUETOOTH
+#define BTPROTO_RFCOMM BTHPROTO_RFCOMM
+#define BDADDR_ANY     BTH_ADDR_NULL
+#define bacpy(dst,src) memcpy((dst),(src),sizeof(BTH_ADDR))
+
+#else /* _WIN32 */
+/* Linux/FreeBSD/NetBSD case */
+
+#if defined(HAVE_BLUETOOTH_LINUX)
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/rfcomm.h>
+
+#elif defined(HAVE_BLUETOOTH_FREEBSD)
+#include <bluetooth.h>
+#define sockaddr_rc sockaddr_rfcomm
+#define rc_family   rfcomm_family
+#define rc_bdaddr   rfcomm_bdaddr
+#define rc_channel  rfcomm_channel
+
+#elif defined(HAVE_BLUETOOTH_NETBSD)
+#include <bluetooth.h>
+#include <netbt/rfcomm.h>
+#define sockaddr_rc sockaddr_bt
+#define rc_family   bt_family
+#define rc_bdaddr   bt_bdaddr
+#define rc_channel  bt_channel
+#define BDADDR_ANY  NG_HCI_BDADDR_ANY
+
+#endif /* HAVE_BLUETOOTH_* */
+
+#endif /* _WIN32 */
Index: openobex-anoncvs/lib/btobex.c
===================================================================
--- openobex-anoncvs.orig/lib/btobex.c	2007-01-10 13:44:57.550922422 +0100
+++ openobex-anoncvs/lib/btobex.c	2007-01-10 13:44:58.843003172 +0100
@@ -45,27 +45,6 @@
 #include <errno.h>		/* errno and EADDRNOTAVAIL */
 #include <netinet/in.h>
 #include <sys/socket.h>
-
-#ifdef HAVE_BLUETOOTH_LINUX
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/rfcomm.h>
-#endif
-#ifdef HAVE_BLUETOOTH_FREEBSD
-#include <bluetooth.h>
-#define sockaddr_rc  sockaddr_rfcomm
-#define rc_family    rfcomm_family
-#define rc_bdaddr    rfcomm_bdaddr
-#define rc_channel   rfcomm_channel
-#endif
-#ifdef HAVE_BLUETOOTH_NETBSD
-#define rc_family    bt_family
-#define rc_bdaddr    bt_bdaddr
-#define rc_channel   bt_channel
-#define sockaddr_rc  sockaddr_bt
-#include <bluetooth.h>
-#include <netbt/rfcomm.h>
-#endif
-
 #endif /* _WIN32 */
 
 #include "obex_main.h"
@@ -79,7 +58,6 @@
  */
 void btobex_prepare_connect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel)
 {
-#ifndef _WIN32
 	self->trans.self.rfcomm.rc_family = AF_BLUETOOTH;
 	bacpy(&self->trans.self.rfcomm.rc_bdaddr, src);
 	self->trans.self.rfcomm.rc_channel = 0;
@@ -87,7 +65,6 @@
 	self->trans.peer.rfcomm.rc_family = AF_BLUETOOTH;
 	bacpy(&self->trans.peer.rfcomm.rc_bdaddr, dst);
 	self->trans.peer.rfcomm.rc_channel = channel;
-#endif /* _WIN32 */
 }
 
 /*
@@ -98,12 +75,10 @@
  */
 void btobex_prepare_listen(obex_t *self, bdaddr_t *src, uint8_t channel)
 {
-#ifndef _WIN32
 	/* Bind local service */
 	self->trans.self.rfcomm.rc_family = AF_BLUETOOTH;
 	bacpy(&self->trans.self.rfcomm.rc_bdaddr, src);
 	self->trans.self.rfcomm.rc_channel = channel;
-#endif /* _WIN32 */
 }
 
 /*
@@ -114,7 +89,6 @@
  */
 int btobex_listen(obex_t *self)
 {
-#ifndef _WIN32
 	DEBUG(3, "\n");
 
 	self->serverfd = obex_create_socket(self, AF_BLUETOOTH);
@@ -142,7 +116,6 @@
 out_freesock:
 	obex_delete_socket(self, self->serverfd);
 	self->serverfd = INVALID_SOCKET;
-#endif /* _WIN32 */
 	return -1;
 }
 
@@ -156,7 +129,6 @@
  */
 int btobex_accept(obex_t *self)
 {
-#ifndef _WIN32
 	socklen_t addrlen = sizeof(struct sockaddr_rc);
 	//int mtu;
 	//int len = sizeof(int);
@@ -170,7 +142,6 @@
 	}
 
 	self->trans.mtu = OBEX_DEFAULT_MTU;
-#endif /* _WIN32 */
 	return 0;
 }
 	
@@ -183,7 +154,6 @@
 int btobex_connect_request(obex_t *self)
 {
 	int ret;
-#ifndef _WIN32
 	int mtu = 0;
 	//int len = sizeof(int);
 
@@ -220,7 +190,6 @@
 out_freesock:
 	obex_delete_socket(self, self->fd);
 	self->fd = INVALID_SOCKET;
-#endif /* _WIN32 */
 	return ret;	
 }
 
@@ -233,13 +202,11 @@
 int btobex_disconnect_request(obex_t *self)
 {
 	int ret;
-#ifndef _WIN32
 	DEBUG(4, "\n");
 	ret = obex_delete_socket(self, self->fd);
 	if(ret < 0)
 		return ret;
 	self->fd = INVALID_SOCKET;
-#endif /* _WIN32 */
 	return ret;	
 }
 
@@ -254,11 +221,9 @@
 int btobex_disconnect_server(obex_t *self)
 {
 	int ret;
-#ifndef _WIN32
 	DEBUG(4, "\n");
 	ret = obex_delete_socket(self, self->serverfd);
 	self->serverfd = INVALID_SOCKET;
-#endif /* _WIN32 */
 	return ret;	
 }
 
Index: openobex-anoncvs/lib/btobex.h
===================================================================
--- openobex-anoncvs.orig/lib/btobex.h	2007-01-10 13:44:11.512045172 +0100
+++ openobex-anoncvs/lib/btobex.h	2007-01-10 13:44:58.875005172 +0100
@@ -30,6 +30,8 @@
 #ifndef BTOBEX_H
 #define BTOBEX_H
 
+#include "bluez_compat.h"
+
 void btobex_prepare_connect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel);
 void btobex_prepare_listen(obex_t *self, bdaddr_t *src, uint8_t channel);
 int btobex_listen(obex_t *self);
Index: openobex-anoncvs/lib/obex.c
===================================================================
--- openobex-anoncvs.orig/lib/obex.c	2007-01-10 13:44:57.630927422 +0100
+++ openobex-anoncvs/lib/obex.c	2007-01-10 13:44:58.939009172 +0100
@@ -43,6 +43,14 @@
 #ifdef DLL_EXPORT
 #define LIB_SYMBOL __declspec(dllexport)
 #endif
+static unsigned long wsa_init = 0;
+#if HAVE_BLUETOOTH
+#define WSA_VER_MAJOR 2
+#define WSA_VER_MINOR 2
+#else
+#define WSA_VER_MAJOR 2
+#define WSA_VER_MINOR 0
+#endif
 
 #else /* _WIN32 */
 #include <fcntl.h>
@@ -63,17 +71,17 @@
 #include "obex_client.h"
 
 #include "inobex.h"
+
 #ifdef HAVE_IRDA
 #include "irobex.h"
 #endif
+
 #ifdef HAVE_USB
 #include "usbobex.h"
 #endif
+
 #ifdef HAVE_BLUETOOTH
 #include "btobex.h"
-#ifdef HAVE_BLUETOOTH_FREEBSD
-#define BDADDR_ANY  NG_HCI_BDADDR_ANY
-#endif
 #else
 // This is to workaround compilation without Bluetooth support. - Jean II
 typedef char *bdaddr_t;
@@ -115,13 +123,21 @@
 	obex_return_val_if_fail(eventcb != NULL, NULL);
 
 #ifdef _WIN32
-	{
+	if (!wsa_init) {
+		WORD ver = MAKEWORD(WSA_VER_MAJOR,WSA_VER_MINOR);
 		WSADATA WSAData;
-	  	if (WSAStartup (MAKEWORD(2,0), &WSAData) != 0) {
-			DEBUG(4, "WSAStartup failed\n");
+	  	if (WSAStartup (ver, &WSAData) != 0) {
+			DEBUG(4, "WSAStartup failed (%d)\n",WSAGetLastError());
+			return NULL;
+		}
+		if (LOBYTE(WSAData.wVersion) != WSA_VER_MAJOR ||
+		    HIBYTE(WSAData.wVersion) != WSA_VER_MINOR) {
+			DEBUG(4, "WSA version mismatch\n");
+			WSACleanup();
 			return NULL;
 		}
 	}
+	++wsa_init;
 #endif
 
 	self = malloc(sizeof(obex_t));
Index: openobex-anoncvs/acinclude.m4
===================================================================
--- openobex-anoncvs.orig/acinclude.m4	2007-01-10 13:44:44.674117672 +0100
+++ openobex-anoncvs/acinclude.m4	2007-01-10 13:44:58.967010922 +0100
@@ -64,6 +64,16 @@
 	])
 ])
 
+AC_DEFUN([AC_PATH_WINBT], [
+       AC_CACHE_CHECK([for Windows Bluetooth support],winbt_found,[
+               AC_CHECK_HEADERS(ws2bth.h, winbt_found=yes, winbt_found=no,
+                                [
+                                  #include <winsock2.h>
+               ])
+       ])
+])
+
+
 AC_DEFUN([AC_PATH_NETBSDBT], [
 	AC_CACHE_CHECK([for NetBSD Bluetooth support], netbsdbt_found, [
 		AC_TRY_COMPILE([
@@ -85,9 +95,7 @@
 ])
 
 AC_DEFUN([AC_PATH_BLUEZ], [
-	PKG_CHECK_MODULES(BLUEZ, bluez, bluez_found=yes, AC_MSG_RESULT(no))
-	AC_SUBST(BLUEZ_CFLAGS)
-	AC_SUBST(BLUEZ_LIBS)
+	PKG_CHECK_MODULES(BLUETOOTH, bluez, bluez_found=yes, AC_MSG_RESULT(no))
 ])
 
 AC_DEFUN([AC_PATH_BLUETOOTH], [
@@ -101,7 +109,12 @@
 	*-*-netbsd*)
 		AC_PATH_NETBSDBT
 		;;
+	*-*-mingw32*)
+		AC_PATH_WINBT
+		;;
 	esac
+	AC_SUBST(BLUETOOTH_CFLAGS)
+	AC_SUBST(BLUETOOTH_LIBS)
 ])
 
 AC_DEFUN([AC_PATH_USB], [
@@ -196,6 +209,10 @@
 		AC_DEFINE(HAVE_IRDA, 1, [Define if system supports IrDA and it's enabled])
 	fi
 
+        if (test "${bluetooth_enable}" = "yes" && test "${winbt_found}" = "yes"); then
+                AC_DEFINE(HAVE_BLUETOOTH, 1, [Define if system supports Bluetooth and it's enabled])
+        fi
+
 	if (test "${bluetooth_enable}" = "yes" && test "${netbsdbt_found}" = "yes"); then
 		AC_DEFINE(HAVE_BLUETOOTH, 1, [Define if system supports Bluetooth and it's enabled])
 		AC_DEFINE(HAVE_BLUETOOTH_NETBSD, 1, [Define if system supports Bluetooth stack for NetBSD])
Index: openobex-anoncvs/apps/Makefile.am
===================================================================
--- openobex-anoncvs.orig/apps/Makefile.am	2007-01-10 13:44:11.656054172 +0100
+++ openobex-anoncvs/apps/Makefile.am	2007-01-10 13:44:59.003013172 +0100
@@ -14,7 +14,7 @@
 	obex_test_server.c obex_test_server.h \
 	obex_test_cable.c obex_test_cable.h
 
-obex_test_LDADD = $(top_builddir)/lib/libopenobex.la @BLUEZ_LIBS@ libmisc.a
+obex_test_LDADD = $(top_builddir)/lib/libopenobex.la @BLUETOOTH_LIBS@ libmisc.a
 
 LDADD = $(top_builddir)/lib/libopenobex.la libmisc.a
 
Index: openobex-anoncvs/lib/obex_transport.h
===================================================================
--- openobex-anoncvs.orig/lib/obex_transport.h	2007-01-10 13:44:11.568048672 +0100
+++ openobex-anoncvs/lib/obex_transport.h	2007-01-10 13:44:59.035015172 +0100
@@ -41,18 +41,7 @@
 #include "irda_wrap.h"
 #endif /*HAVE_IRDA*/
 #ifdef HAVE_BLUETOOTH
-#ifdef HAVE_BLUETOOTH_LINUX
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/rfcomm.h>
-#endif
-#ifdef HAVE_BLUETOOTH_FREEBSD
-#include <bluetooth.h>
-#define sockaddr_rc  sockaddr_rfcomm
-#endif
-#ifdef HAVE_BLUETOOTH_NETBSD
-#include <bluetooth.h>
-#include <netbt/rfcomm.h>
-#endif
+#include "bluez_compat.h"
 #endif /*HAVE_BLUETOOTH*/
 #ifdef HAVE_USB
 #include "usbobex.h"
@@ -66,12 +55,7 @@
 #endif /*HAVE_IRDA*/
 	struct sockaddr_in6  inet6;
 #ifdef HAVE_BLUETOOTH
-#ifdef HAVE_BLUETOOTH_LINUX
 	struct sockaddr_rc   rfcomm;
-#endif
-#ifdef HAVE_BLUETOOTH_NETBSD
-	struct sockaddr_bt   rfcomm;
-#endif
 #endif /*HAVE_BLUETOOTH*/
 #ifdef HAVE_USB
 	struct obex_usb_intf_transport_t usb;
Index: openobex-anoncvs/include/obex.h
===================================================================
--- openobex-anoncvs.orig/include/obex.h	2007-01-10 13:44:11.692056422 +0100
+++ openobex-anoncvs/include/obex.h	2007-01-10 13:44:59.095018922 +0100
@@ -55,9 +55,6 @@
 typedef void* obex_object_t;
 typedef void (*obex_event_t)(obex_t *handle, obex_object_t *obj, int mode, int event, int obex_cmd, int obex_rsp);
 // This is to workaround compilation without Bluetooth support. - Jean II
-#ifndef SOL_RFCOMM
-typedef char* bdaddr_t;
-#endif
 
 #include <openobex/obex_const.h>
 
@@ -140,8 +137,13 @@
 /*
  * Bluetooth OBEX API
  */
+#ifdef SOL_RFCOMM
+#ifdef _WIN32
+#define bdaddr_t BTH_ADDR
+#endif
 LIB_SYMBOL int BtOBEX_ServerRegister(obex_t *self, bdaddr_t *src, uint8_t channel);
 LIB_SYMBOL int BtOBEX_TransportConnect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel);
+#endif
 
 /*
  * OBEX File API
Index: openobex-anoncvs/lib/obex_main.c
===================================================================
--- openobex-anoncvs.orig/lib/obex_main.c	2007-01-10 13:48:00.790374172 +0100
+++ openobex-anoncvs/lib/obex_main.c	2007-01-10 13:48:30.492230422 +0100
@@ -45,21 +45,12 @@
 #include <sys/types.h>
 #include <stdio.h>
 
+#endif /* _WIN32 */
+
 #ifdef HAVE_BLUETOOTH
-#ifdef HAVE_BLUETOOTH_LINUX
-#include <bluetooth/bluetooth.h>
-#endif
-#ifdef HAVE_BLUETOOTH_FREEBSD
-#include <bluetooth.h>
-#define BTPROTO_RFCOMM  BLUETOOTH_PROTO_RFCOMM
-#endif
-#ifdef HAVE_BLUETOOTH_NETBSB
-#include <bluetooth.h>
-#endif
+#include "bluez_compat.h"
 #endif /*HAVE_BLUETOOTH*/
 
-#endif /* _WIN32 */
-
 #include "obex_main.h"
 #include "obex_header.h"
 #include "obex_server.h"
Index: openobex-anoncvs/include/obex.h
===================================================================
--- openobex-anoncvs.orig/include/obex.h	2007-01-10 13:27:55.219030672 +0100
+++ openobex-anoncvs/include/obex.h	2007-01-10 13:44:11.692056422 +0100
@@ -35,8 +35,11 @@
 
 #ifdef _WIN32
 #include <winsock2.h>
+#define LIB_SYMBOL __declspec(dllimport)
+
 #else
 #include <sys/socket.h>
+#define LIB_SYMBOL
 #endif
 
 /* Hum... This would need to be autogenerated from configure,
@@ -61,51 +64,52 @@
 /*
  *  OBEX API
  */
-obex_t *OBEX_Init(int transport, obex_event_t eventcb, unsigned int flags);
-void    OBEX_Cleanup(obex_t *self);
-void OBEX_SetUserData(obex_t *self, void * data);
-void * OBEX_GetUserData(obex_t *self);
-void OBEX_SetUserCallBack(obex_t *self, obex_event_t eventcb, void * data);
-int OBEX_SetTransportMTU(obex_t *self, uint16_t mtu_rx, uint16_t mtu_tx_max);
-int OBEX_GetFD(obex_t *self);
-
-int OBEX_RegisterCTransport(obex_t *self, obex_ctrans_t *ctrans);
-void OBEX_SetCustomData(obex_t *self, void * data);
-void * OBEX_GetCustomData(obex_t *self);
-
-int    OBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addlen);
-int    OBEX_TransportDisconnect(obex_t *self);
-int    OBEX_CustomDataFeed(obex_t *self, uint8_t *inputbuf, int actual);
-int    OBEX_HandleInput(obex_t *self, int timeout);
-
-int    OBEX_ServerRegister(obex_t *self, struct sockaddr *saddr, int addrlen);
-obex_t *OBEX_ServerAccept(obex_t *server, obex_event_t eventcb, void * data);
-int    OBEX_Request(obex_t *self, obex_object_t *object);
-int    OBEX_CancelRequest(obex_t *self, int nice);
-int    OBEX_SuspendRequest(obex_t *self, obex_object_t *object);
-int    OBEX_ResumeRequest(obex_t *self);
-
-obex_object_t	*OBEX_ObjectNew(obex_t *self, uint8_t cmd);
-int		OBEX_ObjectDelete(obex_t *self, obex_object_t *object);
-
-int		OBEX_ObjectAddHeader(obex_t *self, obex_object_t *object, uint8_t hi, 
-			obex_headerdata_t hv, uint32_t hv_size, unsigned int flags);
-int OBEX_ObjectGetNextHeader(obex_t *self, obex_object_t *object, uint8_t *hi,
-					obex_headerdata_t *hv,
-					uint32_t *hv_size);
-int OBEX_ObjectReParseHeaders(obex_t *self, obex_object_t *object);
-int OBEX_ObjectSetRsp(obex_object_t *object, uint8_t rsp, uint8_t lastrsp);
-
-int OBEX_ObjectGetNonHdrData(obex_object_t *object, uint8_t **buffer);
-int OBEX_ObjectSetNonHdrData(obex_object_t *object, const uint8_t *buffer, unsigned int len);
-int OBEX_ObjectSetHdrOffset(obex_object_t *object, unsigned int offset);
-int OBEX_ObjectReadStream(obex_t *self, obex_object_t *object, const uint8_t **buf);
-int OBEX_ObjectGetCommand(obex_t *self, obex_object_t *object);
+LIB_SYMBOL obex_t * OBEX_Init(int transport, obex_event_t eventcb, unsigned int flags);
+LIB_SYMBOL void     OBEX_Cleanup(obex_t *self);
+LIB_SYMBOL void     OBEX_SetUserData(obex_t *self, void * data);
+LIB_SYMBOL void *   OBEX_GetUserData(obex_t *self);
+LIB_SYMBOL void     OBEX_SetUserCallBack(obex_t *self, obex_event_t eventcb, void * data);
+LIB_SYMBOL int      OBEX_SetTransportMTU(obex_t *self, uint16_t mtu_rx, uint16_t mtu_tx_max);
+LIB_SYMBOL int      OBEX_GetFD(obex_t *self);
+
+LIB_SYMBOL int    OBEX_RegisterCTransport(obex_t *self, obex_ctrans_t *ctrans);
+LIB_SYMBOL void   OBEX_SetCustomData(obex_t *self, void * data);
+LIB_SYMBOL void * OBEX_GetCustomData(obex_t *self);
+
+LIB_SYMBOL int OBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addlen);
+LIB_SYMBOL int OBEX_TransportDisconnect(obex_t *self);
+LIB_SYMBOL int OBEX_CustomDataFeed(obex_t *self, uint8_t *inputbuf, int actual);
+LIB_SYMBOL int OBEX_HandleInput(obex_t *self, int timeout);
+
+LIB_SYMBOL int      OBEX_ServerRegister(obex_t *self, struct sockaddr *saddr, int addrlen);
+LIB_SYMBOL obex_t * OBEX_ServerAccept(obex_t *server, obex_event_t eventcb, void * data);
+
+LIB_SYMBOL int OBEX_Request(obex_t *self, obex_object_t *object);
+LIB_SYMBOL int OBEX_CancelRequest(obex_t *self, int nice);
+LIB_SYMBOL int OBEX_SuspendRequest(obex_t *self, obex_object_t *object);
+LIB_SYMBOL int OBEX_ResumeRequest(obex_t *self);
+
+LIB_SYMBOL obex_object_t * OBEX_ObjectNew(obex_t *self, uint8_t cmd);
+LIB_SYMBOL int             OBEX_ObjectDelete(obex_t *self, obex_object_t *object);
+
+LIB_SYMBOL int OBEX_ObjectAddHeader(obex_t *self, obex_object_t *object,
+				    uint8_t hi, obex_headerdata_t hv, uint32_t hv_size,
+				    unsigned int flags);
+LIB_SYMBOL int OBEX_ObjectGetNextHeader(obex_t *self, obex_object_t *object,
+					uint8_t *hi, obex_headerdata_t *hv, uint32_t *hv_size);
+LIB_SYMBOL int OBEX_ObjectReParseHeaders(obex_t *self, obex_object_t *object);
+LIB_SYMBOL int OBEX_ObjectSetRsp(obex_object_t *object, uint8_t rsp, uint8_t lastrsp);
+
+LIB_SYMBOL int OBEX_ObjectGetNonHdrData(obex_object_t *object, uint8_t **buffer);
+LIB_SYMBOL int OBEX_ObjectSetNonHdrData(obex_object_t *object, const uint8_t *buffer, unsigned int len);
+LIB_SYMBOL int OBEX_ObjectSetHdrOffset(obex_object_t *object, unsigned int offset);
+LIB_SYMBOL int OBEX_ObjectReadStream(obex_t *self, obex_object_t *object, const uint8_t **buf);
+LIB_SYMBOL int OBEX_ObjectGetCommand(obex_t *self, obex_object_t *object);
 
-int OBEX_UnicodeToChar(uint8_t *c, const uint8_t *uc, int size);
-int OBEX_CharToUnicode(uint8_t *uc, const uint8_t *c, int size);
+LIB_SYMBOL int OBEX_UnicodeToChar(uint8_t *c, const uint8_t *uc, int size);
+LIB_SYMBOL int OBEX_CharToUnicode(uint8_t *uc, const uint8_t *c, int size);
 
-char *OBEX_ResponseToString(int rsp);
+LIB_SYMBOL char *OBEX_ResponseToString(int rsp);
 
 /*
  * This function is deprecated and will be removed in OpenOBEX 1.1.0
@@ -113,43 +117,43 @@
  * Please use the OBEX_ResponseToString instead.
  *
  */
-char* OBEX_GetResponseMessage(obex_t *self, int rsp);
+LIB_SYMBOL char* OBEX_GetResponseMessage(obex_t *self, int rsp);
 
 /*
  * TcpOBEX API (IPv4/IPv6)
  */
- int TcpOBEX_ServerRegister(obex_t* self, struct sockaddr *addr, int addrlen);
- int TcpOBEX_TransportConnect(obex_t *self, struct sockaddr *addr, int addrlen);
+LIB_SYMBOL int TcpOBEX_ServerRegister(obex_t* self, struct sockaddr *addr, int addrlen);
+LIB_SYMBOL int TcpOBEX_TransportConnect(obex_t *self, struct sockaddr *addr, int addrlen);
 
 /*
  * InOBEX API (deprecated)
  */
- int InOBEX_ServerRegister(obex_t *self);
- int InOBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen);
+LIB_SYMBOL int InOBEX_ServerRegister(obex_t *self);
+LIB_SYMBOL int InOBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen);
 
 /*
  * IrOBEX API 
  */
- int IrOBEX_ServerRegister(obex_t *self, const char *service);
- int IrOBEX_TransportConnect(obex_t *self, const char *service);
+LIB_SYMBOL int IrOBEX_ServerRegister(obex_t *self, const char *service);
+LIB_SYMBOL int IrOBEX_TransportConnect(obex_t *self, const char *service);
 
 /*
  * Bluetooth OBEX API
  */
- int BtOBEX_ServerRegister(obex_t *self, bdaddr_t *src, uint8_t channel);
- int BtOBEX_TransportConnect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel);
+LIB_SYMBOL int BtOBEX_ServerRegister(obex_t *self, bdaddr_t *src, uint8_t channel);
+LIB_SYMBOL int BtOBEX_TransportConnect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel);
 
 /*
  * OBEX File API
  */
-int FdOBEX_TransportSetup(obex_t *self, int rfd, int wfd, int mtu);
+LIB_SYMBOL int FdOBEX_TransportSetup(obex_t *self, int rfd, int wfd, int mtu);
 
 /*  
  * OBEX interface discovery API 
  */
- int OBEX_FindInterfaces(obex_t *self, obex_interface_t **intf);
- int OBEX_InterfaceConnect(obex_t *self, obex_interface_t *intf);
- void OBEX_FreeInterfaces(obex_t *self);
+LIB_SYMBOL int  OBEX_FindInterfaces(obex_t *self, obex_interface_t **intf);
+LIB_SYMBOL int  OBEX_InterfaceConnect(obex_t *self, obex_interface_t *intf);
+LIB_SYMBOL void OBEX_FreeInterfaces(obex_t *self);
 
 #ifdef __cplusplus
 }
Index: openobex-anoncvs/lib/obex.c
===================================================================
--- openobex-anoncvs.orig/lib/obex.c	2007-01-10 13:27:55.059020672 +0100
+++ openobex-anoncvs/lib/obex.c	2007-01-10 13:44:15.092268922 +0100
@@ -40,11 +40,21 @@
 #ifdef _WIN32
 #include <winsock2.h>
 #define ESOCKTNOSUPPORT 1
-#else /* _WIN32 */
+#ifdef DLL_EXPORT
+#define LIB_SYMBOL __declspec(dllexport)
+#endif
 
+#else /* _WIN32 */
 #include <fcntl.h>
 #include <signal.h>
 #include <unistd.h>
+#ifdef HAVE_VISIBILITY
+#define LIB_SYMBOL __attribute__ ((visibility("default")))
+#endif
+#endif
+
+#ifndef LIB_SYMBOL
+#define LIB_SYMBOL
 #endif
 
 #include "obex_main.h"
@@ -90,6 +100,7 @@
  *
  * Returns an OBEX handle or %NULL on error.
  */
+LIB_SYMBOL
 obex_t *OBEX_Init(int transport, obex_event_t eventcb, unsigned int flags)
 {
 	obex_t *self;
@@ -182,6 +193,7 @@
  * Call this function directly after OBEX_Init if you are using
  * a custom transport.
  */
+LIB_SYMBOL
 int OBEX_RegisterCTransport(obex_t *self, obex_ctrans_t *ctrans)
 {
 	obex_return_val_if_fail(self != NULL, -1);
@@ -197,6 +209,7 @@
  *
  * Close down an OBEX instance.
  */
+LIB_SYMBOL
 void OBEX_Cleanup(obex_t *self)
 {
 	obex_return_if_fail(self != NULL);
@@ -220,6 +233,7 @@
  * @self: OBEX handle
  * @data: It's all up to you!
  */
+LIB_SYMBOL
 void OBEX_SetUserData(obex_t *self, void * data)
 {
 	obex_return_if_fail(self != NULL);
@@ -232,6 +246,7 @@
  *
  * Returns userdata
  */
+LIB_SYMBOL
 void * OBEX_GetUserData(obex_t *self)
 {
 	obex_return_val_if_fail(self != NULL, 0);
@@ -244,6 +259,7 @@
  * @eventcb: Function pointer to your new event callback.
  * @data: Pointer to the new user data to pass to the new callback (optional)
  */
+LIB_SYMBOL
 void OBEX_SetUserCallBack(obex_t *self, obex_event_t eventcb, void * data)
 {
 	obex_return_if_fail(self != NULL);
@@ -269,6 +285,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int OBEX_SetTransportMTU(obex_t *self, uint16_t mtu_rx, uint16_t mtu_tx_max)
 {
 	obex_return_val_if_fail(self != NULL, -EFAULT);
@@ -311,6 +328,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int OBEX_ServerRegister(obex_t *self, struct sockaddr *saddr, int addrlen)
 {
 	DEBUG(3, "\n");
@@ -343,6 +361,7 @@
  *
  * Returns the client instance or %NULL for error.
  */
+LIB_SYMBOL
 obex_t *OBEX_ServerAccept(obex_t *server, obex_event_t eventcb, void * data)
 {
 	obex_t *self;
@@ -431,6 +450,7 @@
  * Like select() this function returns -1 on error, 0 on timeout or
  * positive on success.
  */
+LIB_SYMBOL
 int OBEX_HandleInput(obex_t *self, int timeout)
 {
 	DEBUG(4, "\n");
@@ -445,6 +465,7 @@
  * @inputbuf: Pointer to custom data
  * @actual: Length of buffer
  */
+LIB_SYMBOL
 int OBEX_CustomDataFeed(obex_t *self, uint8_t *inputbuf, int actual)
 {
 	DEBUG(3, "\n");
@@ -464,6 +485,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int OBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen)
 {
 	DEBUG(4, "\n");
@@ -481,6 +503,7 @@
  * OBEX_TransportDisconnect - Disconnect transport
  * @self: OBEX handle
  */
+LIB_SYMBOL
 int OBEX_TransportDisconnect(obex_t *self)
 {
 	DEBUG(4, "\n");
@@ -508,6 +531,7 @@
  * This mean that after receiving an incomming connection, you need to
  * call this function again.
  */
+LIB_SYMBOL
 int OBEX_GetFD(obex_t *self)
 {
 	obex_return_val_if_fail(self != NULL, -1);
@@ -523,6 +547,7 @@
  *
  * Returns negative on error.
  */
+LIB_SYMBOL
 int OBEX_Request(obex_t *self, obex_object_t *object)
 {
 	DEBUG(4, "\n");
@@ -551,6 +576,7 @@
  *
  *
  */
+LIB_SYMBOL
 int OBEX_CancelRequest(obex_t *self, int nice)
 {
 	obex_return_val_if_fail(self != NULL, -1);
@@ -562,6 +588,7 @@
  * @self: OBEX handle
  * @object: object to suspend (NULL to suspend currently transfered object)
  */
+LIB_SYMBOL
 int OBEX_SuspendRequest(obex_t *self, obex_object_t *object)
 {
 	obex_return_val_if_fail(object != NULL || self->object != NULL, -1);
@@ -572,6 +599,7 @@
  * OBEX_ResumeRequest - Resume transfer of an object
  * @self: OBEX handle
  */
+LIB_SYMBOL
 int OBEX_ResumeRequest(obex_t *self)
 {
 	obex_return_val_if_fail(self->object != NULL, -1);
@@ -585,6 +613,7 @@
  *
  * Returns a pointer to a new OBEX Object or %NULL on error.
  */
+LIB_SYMBOL
 obex_object_t *OBEX_ObjectNew(obex_t *self, uint8_t cmd)
 {
 	obex_object_t *object;
@@ -615,6 +644,7 @@
  * Note that as soon as you have passed an object to the lib using
  * OBEX_Request(), you shall not delete it yourself.
  */
+LIB_SYMBOL
 int OBEX_ObjectDelete(obex_t *self, obex_object_t *object)
 {
 	obex_return_val_if_fail(object != NULL, -1);
@@ -651,6 +681,7 @@
  *
  * The headers will be sent in the order you add them.
  */
+LIB_SYMBOL
 int OBEX_ObjectAddHeader(obex_t *self, obex_object_t *object, uint8_t hi,
 				obex_headerdata_t hv, uint32_t hv_size,
 				unsigned int flags)
@@ -675,6 +706,7 @@
  *
  * You will get the headers in the received order.
  */
+LIB_SYMBOL
 int OBEX_ObjectGetNextHeader(obex_t *self, obex_object_t *object, uint8_t *hi,
 					obex_headerdata_t *hv,
 					uint32_t *hv_size)
@@ -697,6 +729,7 @@
  * Returns 1 on success
  * Returns 0 if failed due previous parsing not completed.
  */
+LIB_SYMBOL
 int OBEX_ObjectReParseHeaders(obex_t *self, obex_object_t *object)
 {
 	obex_return_val_if_fail(self != NULL, -1);
@@ -722,6 +755,7 @@
  *
  * Returns the number of bytes in buffer, or 0 for end-of-stream.
  */
+LIB_SYMBOL
 int OBEX_ObjectReadStream(obex_t *self, obex_object_t *object, const uint8_t **buf)
 {
 	obex_return_val_if_fail(self != NULL, -1);
@@ -739,6 +773,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int OBEX_ObjectSetRsp(obex_object_t *object, uint8_t rsp, uint8_t lastrsp)
 {
 	obex_return_val_if_fail(object != NULL, -1);
@@ -752,6 +787,7 @@
  *
  * Returns the size of the buffer or -1 for error.
  */
+LIB_SYMBOL
 int OBEX_ObjectGetNonHdrData(obex_object_t *object, uint8_t **buffer)
 {
 	obex_return_val_if_fail(object != NULL, -1);
@@ -771,6 +807,7 @@
  * Some commands (notably SetPath) send data before headers. Use this
  * function to set this data.
  */
+LIB_SYMBOL
 int OBEX_ObjectSetNonHdrData(obex_object_t *object, const uint8_t *buffer, unsigned int len)
 {
 	//TODO: Check that we actually can send len bytes without violating MTU
@@ -798,6 +835,7 @@
  * command has data before the headers comes. You do NOT need to use this
  * function on Connect and SetPath, they are handled automatically.
  */
+LIB_SYMBOL
 int OBEX_ObjectSetHdrOffset(obex_object_t *object, unsigned int offset)
 {
 	obex_return_val_if_fail(object != NULL, -1);
@@ -812,6 +850,7 @@
  *
  * Call this function to get the OBEX command of an object.
  */
+LIB_SYMBOL
 int OBEX_ObjectGetCommand(obex_t *self, obex_object_t *object)
 {
 	obex_return_val_if_fail(object != NULL || self->object != NULL, -1);
@@ -830,6 +869,7 @@
  *
  * Buffers may not overlap. Returns -1 on error.
  */
+LIB_SYMBOL
 int OBEX_UnicodeToChar(uint8_t *c, const uint8_t *uc, int size)
 {
 	int n;
@@ -857,6 +897,7 @@
  *
  * Buffers may not overlap. Returns -1 on error.
  */
+LIB_SYMBOL
 int OBEX_CharToUnicode(uint8_t *uc, const uint8_t *c, int size)
 {
 	int len, n;
@@ -885,6 +926,7 @@
  *
  * The returned char must not be freed. Returns %NULL on error.
  */
+LIB_SYMBOL
 char *OBEX_ResponseToString(int rsp)
 {
 	DEBUG(4, "\n");
@@ -899,6 +941,7 @@
  *
  * The returned char must not be freed. Returns %NULL on error.
  */
+LIB_SYMBOL
 char* OBEX_GetResponseMessage(obex_t *self, int rsp)
 {
 	DEBUG(4, "\n");
@@ -922,6 +965,7 @@
  * multiple connections transparently (i.e. without a lookup table).
  * - Jean II
  */
+LIB_SYMBOL
 void OBEX_SetCustomData(obex_t *self, void * data)
 {
 	obex_return_if_fail(self != NULL);
@@ -934,6 +978,7 @@
  *
  * Returns Custom Transport data
  */
+LIB_SYMBOL
 void * OBEX_GetCustomData(obex_t *self)
 {
 	obex_return_val_if_fail(self != NULL, 0);
@@ -951,6 +996,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int TcpOBEX_ServerRegister(obex_t* self, struct sockaddr *addr, int addrlen)
 {
 	DEBUG(3, "\n");
@@ -973,6 +1019,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int TcpOBEX_TransportConnect(obex_t *self, struct sockaddr *addr, int addrlen)
 {
      	DEBUG(4, "\n");
@@ -999,6 +1046,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int InOBEX_ServerRegister(obex_t *self)
 {
 	DEBUG(3, "\n");
@@ -1017,6 +1065,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int InOBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen)
 {
      	DEBUG(4, "\n");
@@ -1045,6 +1094,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int IrOBEX_ServerRegister(obex_t *self, const char *service)
 {
 	DEBUG(3, "\n");
@@ -1067,6 +1117,7 @@
  *
  * An easier connect function to use for IrDA (IrOBEX) only.
  */
+LIB_SYMBOL
 int IrOBEX_TransportConnect(obex_t *self, const char *service)
 {
      	DEBUG(4, "\n");
@@ -1096,6 +1147,7 @@
  *
  * Returns -1 on error.
  */
+LIB_SYMBOL
 int BtOBEX_ServerRegister(obex_t *self, bdaddr_t *src, uint8_t channel)
 {
 	DEBUG(3, "\n");
@@ -1119,6 +1171,7 @@
  *
  *  An easier connect function to use for Bluetooth (Bluetooth OBEX) only. 
  */
+LIB_SYMBOL
 int BtOBEX_TransportConnect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel)
 {
 	DEBUG(4, "\n");
@@ -1150,6 +1203,7 @@
  *  @wfd: descriptor to write
  *  @mtu: transport mtu: 0 - default
  */
+LIB_SYMBOL
 int FdOBEX_TransportSetup(obex_t *self, int rfd, int wfd, int mtu)
 {
 	DEBUG(4, "\n");
@@ -1174,6 +1228,7 @@
  *  An easier connect function to connect to a discovered interface (currently
  *  USB OBEX only). 
  */
+LIB_SYMBOL
 int OBEX_InterfaceConnect(obex_t *self, obex_interface_t *intf)
 {
 	DEBUG(4, "\n");
@@ -1207,6 +1262,7 @@
  *
  *  Gets a list of OBEX interfaces, or NULL if there are none.
  */
+LIB_SYMBOL
 int OBEX_FindInterfaces(obex_t *self, obex_interface_t **interfaces)
 {
 	DEBUG(4, "\n");
@@ -1235,6 +1291,7 @@
  *  Frees memory allocated to OBEX interface structures after it has been 
  *  allocated by OBEX_FindInterfaces.
  */
+LIB_SYMBOL
 void OBEX_FreeInterfaces(obex_t *self)
 {
 	DEBUG(4, "\n");
Index: openobex-anoncvs/configure.in
===================================================================
--- openobex-anoncvs.orig/configure.in	2007-01-10 13:23:20.665872172 +0100
+++ openobex-anoncvs/configure.in	2007-01-10 13:44:28.553110172 +0100
@@ -21,6 +21,7 @@
 
 AC_PROG_LIBTOOL
 
+AC_VISIBILITY
 AC_CANONICAL_HOST
 
 AC_PATH_WIN32
Index: openobex-anoncvs/lib/Makefile.am
===================================================================
--- openobex-anoncvs.orig/lib/Makefile.am	2007-01-10 13:27:43.238281922 +0100
+++ openobex-anoncvs/lib/Makefile.am	2007-01-10 13:27:57.071146422 +0100
@@ -17,6 +17,8 @@
 	irda.h irda_wrap.h \
 	usbobex.c usbobex.h
 
+libopenobex_la_CFLAGS = @CFLAG_VISIBILITY@
+
 libopenobex_la_LDFLAGS = \
 	-no-undefined \
 	-version-info 4:0:3 \
Index: openobex-anoncvs/acinclude.m4
===================================================================
--- openobex-anoncvs.orig/acinclude.m4	2007-01-10 13:44:41.909944922 +0100
+++ openobex-anoncvs/acinclude.m4	2007-01-10 13:44:44.674117672 +0100
@@ -128,6 +128,17 @@
 	AC_SUBST(GLIB_GENMARSHAL)
 ])
 
+AC_DEFUN([AC_VISIBILITY], [
+	case $host in
+	*-*-mingw32*)
+		AC_SUBST(CFLAG_VISIBILITY)
+		;;
+	*)
+		gl_VISIBILITY
+		;;
+	esac
+])
+
 AC_DEFUN([AC_ARG_OPENOBEX], [
 	fortify_enable=yes
 	irda_enable=yes
Index: openobex-anoncvs/lib/Makefile.am
===================================================================
--- openobex-anoncvs.orig/lib/Makefile.am	2007-01-10 13:27:35.797816922 +0100
+++ openobex-anoncvs/lib/Makefile.am	2007-01-10 13:27:43.238281922 +0100
@@ -18,7 +18,7 @@
 	usbobex.c usbobex.h
 
 libopenobex_la_LDFLAGS = \
-	-no-undefined
+	-no-undefined \
 	-version-info 4:0:3 \
 	-export-symbols $(top_srcdir)/lib/obex.sym
 
Index: openobex-anoncvs/lib/databuffer.c
===================================================================
--- openobex-anoncvs.orig/lib/databuffer.c	2006-12-31 16:30:15.602272126 +0100
+++ openobex-anoncvs/lib/databuffer.c	2007-01-07 11:04:13.234202897 +0100
@@ -33,6 +33,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#include "obex_main.h"
+
 slist_t *slist_append(slist_t *list, void *element) 
 {
 	slist_t *node, *p;
@@ -286,22 +288,14 @@
 
 	n = 0;
 	for (i = 0; i < p->data_size; ++i) {
-#ifndef OBEX_SYSLOG
-		if (n == 0)
-			fprintf(stderr, "%s: ", label);
-		fprintf(stderr, "%02X ", p->data[i]);
-		if (n >= 25 || i == p->data_size - 1) {
-			fprintf(stderr, "\n");
-#else
 		if (n == 0)
-			syslog(LOG_DEBUG, "OpenObex: %s: ", label);
-		syslog(LOG_DEBUG, "%02X ", p->data[i]);
+			log_debug("%s%s:", log_debug_prefix, label);
+		log_debug(" %02X", p->data[i]);
 		if (n >= 25 || i == p->data_size - 1) {
-			syslog(LOG_DEBUG, "\n");
-#endif
-			n = -1;
-		}
-		n++;
+			log_debug("\n");
+			n = 0;
+		} else
+			n++;
 	}
 }
 
Index: openobex-anoncvs/lib/obex_main.h
===================================================================
--- openobex-anoncvs.orig/lib/obex_main.h	2006-12-31 16:31:07.333505126 +0100
+++ openobex-anoncvs/lib/obex_main.h	2007-01-10 13:23:18.093711422 +0100
@@ -61,45 +61,43 @@
 #include "obex_transport.h"
 #include "databuffer.h"
 
-#ifdef OBEX_SYSLOG
+
+#if defined(OBEX_SYSLOG) && !defined(_WIN32)
 #include <syslog.h>
+#define log_debug(format, args...) syslog(LOG_DEBUG, format, ##args)
+#define log_debug_prefix "OpenOBEX: "
+#else
+#include <stdio.h>
+#define log_debug(format, args...) fprintf(stderr, format, ##args)
+#define log_debug_prefix ""
 #endif
 
-/* use 0 for none, 1 for sendbuff, 2 for receivebuff and 3 for both */
-#ifndef OBEX_DUMP
-#define OBEX_DUMP 0
-#endif
 
-/* use 0 for production, 1 for verification, >2 for debug */
-#ifndef OBEX_DEBUG
-#define OBEX_DEBUG 0
+/* use integer:  0 for production
+ *               1 for verification
+ *              >2 for debug
+ */
+#if OBEX_DEBUG
+extern int obex_debug;
+#define DEBUG(n, format, args...) \
+        if (obex_debug >= (n)) \
+          log_debug("%s%s(): " format, log_debug_prefix, __FUNCTION__, ##args)
+#else
+#define DEBUG(n, format, args...)
 #endif
 
-#ifndef _WIN32
 
-#  if OBEX_DEBUG
-extern int obex_debug;
-#    ifdef OBEX_SYSLOG
-#    define DEBUG(n, format, args...) if (obex_debug >= (n)) syslog(LOG_DEBUG, "OpenOBEX: %s(): " format, __FUNCTION__ , ##args)
-#    else
-#    define DEBUG(n, format, args...) if (obex_debug >= (n)) fprintf(stderr, "%s(): " format, __FUNCTION__ , ##args)
-#    endif	/* OBEX_SYSLOG */
-#  else
-#  define DEBUG(n, format, args...)
-#  endif /* OBEX_DEBUG != 0 */
-
-#  if OBEX_DUMP
+/* use bitmask: 0x1 for sendbuff
+ *              0x2 for receivebuff
+ */
+#if OBEX_DUMP
 extern int obex_dump;
-#  define DUMPBUFFER(n, label, msg)	if (obex_dump & (n)) buf_dump(msg, label);
-#  else
-#  define DUMPBUFFER(n, label, msg)
-#  endif /* OBEX_DUMP != 0 */
-
-#else /* _WIN32 */
-#define DEBUG(n, format, args...)
+#define DUMPBUFFER(n, label, msg) \
+        if ((obex_dump & 0x3) & (n)) buf_dump(msg, label);
+#else
 #define DUMPBUFFER(n, label, msg)
+#endif
 
-#endif /* _WIN32 */
 
 #define OBEX_VERSION		0x10      /* OBEX Protocol Version 1.1 */
 
Index: openobex-anoncvs/lib/inobex.c
===================================================================
--- openobex-anoncvs.orig/lib/inobex.c	2007-01-07 11:22:01.680976647 +0100
+++ openobex-anoncvs/lib/inobex.c	2007-01-09 23:35:32.450802897 +0100
@@ -43,12 +43,28 @@
 #include <netinet/in.h>
 #include <fcntl.h>
 #include <sys/socket.h>
+#include <arpa/inet.h>
 #endif /*_WIN32*/
 
 #include "obex_main.h"
 
 #define OBEX_PORT 650
 
+static
+void map_ip4to6 (struct sockaddr_in* in, struct sockaddr_in6* out)
+{
+	out->sin6_family = AF_INET6;
+	out->sin6_port = in->sin_port;
+	out->sin6_flowinfo = 0;
+
+	/* map the IPv4 address to ::FFFF:<ipv4>
+	 * see RFC2373 and RFC2553 for details
+	 */
+	memset(out->sin6_addr.s6_addr,0,10);
+	out->sin6_addr.s6_addr16[10/2] = 0xFFFF;
+	out->sin6_addr.s6_addr32[12/4] = in->sin_addr.s_addr;
+}
+
 /*
  * Function inobex_prepare_connect (self, service)
  *
@@ -57,10 +73,26 @@
  */
 void inobex_prepare_connect(obex_t *self, struct sockaddr *saddr, int addrlen)
 {
-	memcpy(&self->trans.peer, saddr, addrlen);
-	/* Override to be safe... */
-	self->trans.peer.inet.sin_family = AF_INET;
-	self->trans.peer.inet.sin_port = htons(OBEX_PORT);
+	struct sockaddr_in6 addr = {
+		.sin6_family = AF_INET6,
+		.sin6_port = htons(OBEX_PORT),
+		.sin6_addr = IN6ADDR_LOOPBACK_INIT,
+		.sin6_flowinfo = 0
+	};
+	if (saddr == NULL)
+		saddr = (struct sockaddr*)(&addr);
+	else
+		switch (saddr->sa_family){
+		case AF_INET6:
+			break;
+		case AF_INET:
+			map_ip4to6((struct sockaddr_in*)saddr,&addr);
+			/* no break */
+		default:
+			saddr = (struct sockaddr*)(&addr);
+			break;
+	}
+	memcpy(&self->trans.peer.inet6, saddr, sizeof(self->trans.self.inet6));
 }
 
 /*
@@ -69,12 +101,29 @@
  *    Prepare for INET-listen
  *
  */
-void inobex_prepare_listen(obex_t *self)
+void inobex_prepare_listen(obex_t *self, struct sockaddr *saddr, int addrlen)
 {
+	struct sockaddr_in6 addr = {
+		.sin6_family = AF_INET6,
+		.sin6_port = htons(OBEX_PORT),
+		.sin6_addr = IN6ADDR_ANY_INIT,
+		.sin6_flowinfo = 0
+	};
 	/* Bind local service */
-	self->trans.self.inet.sin_family = AF_INET;
-	self->trans.self.inet.sin_port = htons(OBEX_PORT);
-	self->trans.self.inet.sin_addr.s_addr = INADDR_ANY;
+	if (saddr == NULL)
+		saddr = (struct sockaddr*)(&addr);
+	else
+		switch (saddr->sa_family) {
+		case AF_INET6:
+			break;
+		case AF_INET:
+			map_ip4to6((struct sockaddr_in*)saddr,&addr);
+			/* no break */
+		default:
+			saddr = (struct sockaddr*)(&addr);
+			break;
+		}
+	memcpy(&self->trans.self.inet6, saddr, sizeof(self->trans.self.inet6));
 }
 
 /*
@@ -87,7 +136,7 @@
 {
 	DEBUG(4, "\n");
 
-	self->serverfd = obex_create_socket(self, AF_INET);
+	self->serverfd = obex_create_socket(self, AF_INET6);
 	if(self->serverfd < 0) {
 		DEBUG(0, "Cannot create server-socket\n");
 		return -1;
@@ -95,9 +144,8 @@
 
 	//printf("TCP/IP listen %d %X\n", self->trans.self.inet.sin_port,
 	//       self->trans.self.inet.sin_addr.s_addr);
-	if (bind(self->serverfd, (struct sockaddr*) &self->trans.self.inet,
-		 sizeof(struct sockaddr_in))) 
-	{
+	if (bind(self->serverfd, (struct sockaddr*) &self->trans.self.inet6,
+		 sizeof(struct sockaddr_in6))) {
 		DEBUG(0, "bind() Failed\n");
 		return -1;
 	}
@@ -121,10 +169,11 @@
  */
 int inobex_accept(obex_t *self)
 {
-	socklen_t addrlen = sizeof(struct sockaddr_in);
+	socklen_t addrlen = sizeof(struct sockaddr_in6);
 
-	self->fd = accept(self->serverfd, (struct sockaddr *) 
-		&self->trans.peer.inet, &addrlen);
+	self->fd = accept(self->serverfd,
+			  (struct sockaddr *)&self->trans.peer.inet6,
+			  &addrlen);
 
 	if(self->fd < 0)
 		return -1;
@@ -143,7 +192,7 @@
  */
 int inobex_connect_request(obex_t *self)
 {
-	unsigned char *addr;
+	char addr[INET6_ADDRSTRLEN];
 	int ret;
 
 	self->fd = obex_create_socket(self, AF_INET);
@@ -151,18 +200,22 @@
 		return -1;
 
 	/* Set these just in case */
-	self->trans.peer.inet.sin_family = AF_INET;
-	if (self->trans.peer.inet.sin_port == 0)
-		self->trans.peer.inet.sin_port = htons(OBEX_PORT);
-
-	addr = (unsigned char *) &self->trans.peer.inet.sin_addr.s_addr;
-
-	DEBUG(2, "peer addr = %d.%d.%d.%d\n",
-		addr[0], addr[1], addr[2], addr[3]);
+	if (self->trans.peer.inet6.sin6_port == 0)
+		self->trans.peer.inet6.sin6_port = htons(OBEX_PORT);
 
+#ifndef _WIN32
+	if (!inet_ntop(AF_INET6,&self->trans.peer.inet6.sin6_addr,
+		       addr,sizeof(addr))) {
+		DEBUG(4, "Adress problem\n");
+		obex_delete_socket(self, self->fd);
+		self->fd = -1;
+		return -1;
+	}
+	DEBUG(2, "peer addr = [%s]:%u\n",addr,ntohs(self->trans.peer.inet6.sin6_port));
+#endif
 
-	ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.inet, 
-		      sizeof(struct sockaddr_in));
+	ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.inet6,
+		      sizeof(struct sockaddr_in6));
 	if (ret < 0) {
 		DEBUG(4, "Connect failed\n");
 		obex_delete_socket(self, self->fd);
Index: openobex-anoncvs/lib/obex.c
===================================================================
--- openobex-anoncvs.orig/lib/obex.c	2007-01-07 11:18:46.164757647 +0100
+++ openobex-anoncvs/lib/obex.c	2007-01-09 23:35:38.335170647 +0100
@@ -941,47 +941,99 @@
 }
 
 /**
- * InOBEX_ServerRegister - Start listening for incoming connections
+ * TcpOBEX_ServerRegister - Start listening for incoming TCP connections
  * @self: OBEX handle
+ * @addr: Address to bind to (*:650 if NULL)
+ * @addrlen: Length of address structure
  *
- * An easier server function to use for TCP/IP (InOBEX) only.
+ * An easier server function to use for TCP/IP (TcpOBEX) only.
+ * It supports IPv4 (AF_INET) and IPv6 (AF_INET6).
  *
  * Returns -1 on error.
  */
-int InOBEX_ServerRegister(obex_t *self)
+int TcpOBEX_ServerRegister(obex_t* self, struct sockaddr *addr, int addrlen)
 {
 	DEBUG(3, "\n");
 
+	errno = EINVAL;
 	obex_return_val_if_fail(self != NULL, -1);
 
-	inobex_prepare_listen(self);
+	inobex_prepare_listen(self,addr,addrlen);
 	return obex_transport_listen(self);
 }
 
 /**
- * InOBEX_TransportConnect - Connect Inet transport
+ * TcpOBEX_TransportConnect - Connect TCP transport
+ * @self: OBEX handle
+ * @addr: Address to connect to (localhost:650 if NULL)
+ * @addrlen: Length of address structure
+ *
+ * An easier connect function to use for TCP/IP (TcpOBEX) only.
+ * It supports IPv4 (AF_INET) and IPv6 (AF_INET6).
+ *
+ * Returns -1 on error.
+ */
+int TcpOBEX_TransportConnect(obex_t *self, struct sockaddr *addr, int addrlen)
+{
+     	DEBUG(4, "\n");
+
+	errno = EINVAL;
+	obex_return_val_if_fail(self != NULL, -1);
+
+	if (self->object)	{
+		DEBUG(1, "We are busy.\n");
+		errno = EBUSY;
+		return -1;
+	}
+
+	inobex_prepare_connect(self, addr, addrlen);
+	return obex_transport_connect_request(self);
+}
+/**
+ * InOBEX_ServerRegister - Start listening for incoming connections
+ * @self: OBEX handle
+ *
+ * An easier server function to use for TCP/IP (InOBEX) only.
+ *
+ * This function is deprecated, use TcpOBEX_ServerRegister() instead.
+ *
+ * Returns -1 on error.
+ */
+int InOBEX_ServerRegister(obex_t *self)
+{
+	DEBUG(3, "\n");
+	return TcpOBEX_ServerRegister(self,NULL,0);
+}
+
+/**
+ * InOBEX_TransportConnect - Connect Inet transport (deprecated)
  * @self: OBEX handle
+ * @saddr: Address to connect to
+ * @addrlen: Length of address
  *
  * An easier connect function to use for TCP/IP (InOBEX) only.
  *
- * Note : I would like feedback on this API to know which input
- * parameter make most sense. Thanks...
+ * This function is deprecated, use TcpOBEX_TransportConnect() instead.
+ *
+ * Returns -1 on error.
  */
 int InOBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen)
 {
      	DEBUG(4, "\n");
 
+	errno = EINVAL;
 	obex_return_val_if_fail(self != NULL, -1);
 
 	if (self->object)	{
 		DEBUG(1, "We are busy.\n");
-		return -EBUSY;
+		errno = EBUSY;
+		return -1;
 	}
 
+	errno = EINVAL;
 	obex_return_val_if_fail(saddr != NULL, -1);
 
-	inobex_prepare_connect(self, saddr, addrlen);
-	return obex_transport_connect_request(self);
+	return TcpOBEX_TransportConnect(self,saddr,addrlen);
 }
 
 /**
Index: openobex-anoncvs/lib/obex_transport.h
===================================================================
--- openobex-anoncvs.orig/lib/obex_transport.h	2007-01-07 11:24:12.833173147 +0100
+++ openobex-anoncvs/lib/obex_transport.h	2007-01-09 23:35:16.441802397 +0100
@@ -32,6 +32,7 @@
 
 #ifdef _WIN32
 #include <winsock2.h>
+#include <ws2tcpip.h>
 #else
 #include <netinet/in.h>
 #endif
@@ -63,7 +64,7 @@
 #ifdef HAVE_IRDA
 	struct sockaddr_irda irda;
 #endif /*HAVE_IRDA*/
-	struct sockaddr_in   inet;
+	struct sockaddr_in6  inet6;
 #ifdef HAVE_BLUETOOTH
 #ifdef HAVE_BLUETOOTH_LINUX
 	struct sockaddr_rc   rfcomm;
Index: openobex-anoncvs/lib/inobex.h
===================================================================
--- openobex-anoncvs.orig/lib/inobex.h	2007-01-07 13:51:27.297292647 +0100
+++ openobex-anoncvs/lib/inobex.h	2007-01-07 13:51:30.641501647 +0100
@@ -31,7 +31,7 @@
 #define INOBEX_H
 
 void inobex_prepare_connect(obex_t *self, struct sockaddr *saddr, int addrlen);
-void inobex_prepare_listen(obex_t *self);
+void inobex_prepare_listen(obex_t *self, struct sockaddr *saddr, int addrlen);
 int inobex_listen(obex_t *self);
 int inobex_accept(obex_t *self);
 int inobex_connect_request(obex_t *self);
Index: openobex-anoncvs/include/obex.h
===================================================================
--- openobex-anoncvs.orig/include/obex.h	2007-01-07 15:47:10.875239147 +0100
+++ openobex-anoncvs/include/obex.h	2007-01-09 23:35:38.275166897 +0100
@@ -116,7 +116,13 @@
 char* OBEX_GetResponseMessage(obex_t *self, int rsp);
 
 /*
- * InOBEX API (TCP/IP)
+ * TcpOBEX API (IPv4/IPv6)
+ */
+ int TcpOBEX_ServerRegister(obex_t* self, struct sockaddr *addr, int addrlen);
+ int TcpOBEX_TransportConnect(obex_t *self, struct sockaddr *addr, int addrlen);
+
+/*
+ * InOBEX API (deprecated)
  */
  int InOBEX_ServerRegister(obex_t *self);
  int InOBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen);
Index: openobex-anoncvs/lib/obex.sym
===================================================================
--- openobex-anoncvs.orig/lib/obex.sym	2007-01-09 23:35:53.100093397 +0100
+++ openobex-anoncvs/lib/obex.sym	2007-01-09 23:36:06.592936647 +0100
@@ -33,6 +33,8 @@
 OBEX_CharToUnicode
 OBEX_ResponseToString
 OBEX_GetResponseMessage
+TcpOBEX_ServerRegister
+TcpOBEX_TransportConnect
 InOBEX_ServerRegister
 InOBEX_TransportConnect
 IrOBEX_ServerRegister
Index: openobex-anoncvs/lib/obex_main.h
===================================================================
--- openobex-anoncvs.orig/lib/obex_main.h	2007-01-07 11:26:51.163068147 +0100
+++ openobex-anoncvs/lib/obex_main.h	2007-01-08 23:26:23.440829397 +0100
@@ -33,11 +33,18 @@
 
 #include <time.h>
 
-#ifndef _WIN32
+#ifdef _WIN32
+#include <winsock2.h>
+#define socket_t SOCKET
+
+#else /* _WIN32 */
 #include <sys/time.h>
 #include <sys/socket.h>
 #include <sys/types.h>
-#endif
+#define socket_t int
+#define INVALID_SOCKET -1
+
+#endif /* _WIN32 */
 
 /* Forward decl */
 typedef struct obex obex_t;
@@ -120,9 +127,9 @@
 	uint16_t mtu_rx;			/* Maximum OBEX RX packet size */
 	uint16_t mtu_tx_max;		/* Maximum TX we can accept */
 
-	int fd;			/* Socket descriptor */
-	int serverfd;
-	int writefd;		/* write descriptor - only OBEX_TRANS_FD */
+	socket_t fd;		/* Socket descriptor */
+	socket_t serverfd;
+	socket_t writefd;	/* write descriptor - only OBEX_TRANS_FD */
 	unsigned int state;
 	
 	int keepserver;		/* Keep server alive */
@@ -145,8 +152,8 @@
 };
 
 
-int obex_create_socket(obex_t *self, int domain);
-int obex_delete_socket(obex_t *self, int fd);
+socket_t obex_create_socket(obex_t *self, int domain);
+int obex_delete_socket(obex_t *self, socket_t fd);
 
 void obex_deliver_event(obex_t *self, int event, int cmd, int rsp, int del);
 int obex_data_indication(obex_t *self, uint8_t *buf, int buflen);
Index: openobex-anoncvs/lib/obex_main.c
===================================================================
--- openobex-anoncvs.orig/lib/obex_main.c	2007-01-07 11:26:51.131066147 +0100
+++ openobex-anoncvs/lib/obex_main.c	2007-01-08 23:13:46.541526147 +0100
@@ -80,9 +80,10 @@
  *    Create socket if needed.
  *
  */
-int obex_create_socket(obex_t *self, int domain)
+socket_t obex_create_socket(obex_t *self, int domain)
 {
-	int fd, proto;
+	socket_t fd;
+	int proto;
 	DEBUG(4, "\n");
 
 	proto = 0;
@@ -102,7 +103,7 @@
  *    Close socket if opened.
  *
  */
-int obex_delete_socket(obex_t *self, int fd)
+int obex_delete_socket(obex_t *self, socket_t fd)
 {
 	int ret;
 
Index: openobex-anoncvs/lib/irobex.c
===================================================================
--- openobex-anoncvs.orig/lib/irobex.c	2007-01-07 11:26:51.099064147 +0100
+++ openobex-anoncvs/lib/irobex.c	2007-01-08 23:23:08.824666647 +0100
@@ -131,7 +131,7 @@
 	DEBUG(3, "\n");
 
 	self->serverfd = obex_create_socket(self, AF_IRDA);
-	if(self->serverfd < 0) {
+	if(self->serverfd == INVALID_SOCKET) {
 		DEBUG(0, "Error creating socket\n");
 		return -1;
 	}
@@ -175,7 +175,7 @@
 
 out_freesock:
 	obex_delete_socket(self, self->serverfd);
-	self->serverfd = -1;
+	self->serverfd = INVALID_SOCKET;
 	return -1;
 }
 
@@ -197,7 +197,7 @@
 	self->fd = accept(self->serverfd, (struct sockaddr *) &self->trans.peer.irda,
  			  &addrlen);
 
-	if (self->fd < 0) {
+	if (self->fd == INVALID_SOCKET) {
 		return -1;
 	}
 
@@ -349,9 +349,9 @@
 
 	DEBUG(4, "\n");
 
-	if(self->fd < 0)	{
+	if(self->fd  == INVALID_SOCKET) {
 		self->fd = obex_create_socket(self, AF_IRDA);
-		if(self->fd < 0)
+		if(self->fd == INVALID_SOCKET)
 			return -1;
 	}
 
@@ -391,7 +391,7 @@
 
 out_freesock:
 	obex_delete_socket(self, self->fd);
-	self->fd = -1;
+	self->fd = INVALID_SOCKET;
 	return ret;	
 }
 
@@ -408,7 +408,7 @@
 	ret = obex_delete_socket(self, self->fd);
 	if(ret < 0)
 		return ret;
-	self->fd = -1;
+	self->fd = INVALID_SOCKET;
 	return ret;	
 }
 
@@ -425,7 +425,7 @@
 	int ret;
 	DEBUG(4, "\n");
 	ret = obex_delete_socket(self, self->serverfd);
-	self->serverfd = -1;
+	self->serverfd = INVALID_SOCKET;
 	return ret;	
 }
 
Index: openobex-anoncvs/lib/btobex.c
===================================================================
--- openobex-anoncvs.orig/lib/btobex.c	2007-01-07 11:26:51.039060397 +0100
+++ openobex-anoncvs/lib/btobex.c	2007-01-08 23:26:02.187501147 +0100
@@ -118,7 +118,7 @@
 	DEBUG(3, "\n");
 
 	self->serverfd = obex_create_socket(self, AF_BLUETOOTH);
-	if(self->serverfd < 0) {
+	if (self->serverfd == INVALID_SOCKET) {
 		DEBUG(0, "Error creating socket\n");
 		return -1;
 	}
@@ -141,7 +141,7 @@
 
 out_freesock:
 	obex_delete_socket(self, self->serverfd);
-	self->serverfd = -1;
+	self->serverfd = INVALID_SOCKET;
 #endif /* _WIN32 */
 	return -1;
 }
@@ -165,7 +165,7 @@
 	self->fd = accept(self->serverfd, (struct sockaddr *) &self->trans.peer.rfcomm,
  			  &addrlen);
 
-	if (self->fd < 0) {
+	if (self->fd == INVALID_SOCKET) {
 		return -1;
 	}
 
@@ -189,9 +189,9 @@
 
 	DEBUG(4, "\n");
 
-	if(self->fd < 0)	{
+	if(self->fd == INVALID_SOCKET) {
 		self->fd = obex_create_socket(self, AF_BLUETOOTH);
-		if(self->fd < 0)
+		if(self->fd == INVALID_SOCKET)
 			return -1;
 	}
 
@@ -205,7 +205,7 @@
 
 	ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.rfcomm,
 		      sizeof(struct sockaddr_rc));
-	if (ret < 0) {
+	if (ret  == INVALID_SOCKET) {
 		DEBUG(4, "ret=%d\n", ret);
 		goto out_freesock;
 	}
@@ -219,7 +219,7 @@
 
 out_freesock:
 	obex_delete_socket(self, self->fd);
-	self->fd = -1;
+	self->fd = INVALID_SOCKET;
 #endif /* _WIN32 */
 	return ret;	
 }
@@ -238,7 +238,7 @@
 	ret = obex_delete_socket(self, self->fd);
 	if(ret < 0)
 		return ret;
-	self->fd = -1;
+	self->fd = INVALID_SOCKET;
 #endif /* _WIN32 */
 	return ret;	
 }
@@ -257,7 +257,7 @@
 #ifndef _WIN32
 	DEBUG(4, "\n");
 	ret = obex_delete_socket(self, self->serverfd);
-	self->serverfd = -1;
+	self->serverfd = INVALID_SOCKET;
 #endif /* _WIN32 */
 	return ret;	
 }
Index: openobex-anoncvs/lib/inobex.c
===================================================================
--- openobex-anoncvs.orig/lib/inobex.c	2007-01-08 23:16:17.578965397 +0100
+++ openobex-anoncvs/lib/inobex.c	2007-01-08 23:24:09.508459147 +0100
@@ -137,7 +137,7 @@
 	DEBUG(4, "\n");
 
 	self->serverfd = obex_create_socket(self, AF_INET6);
-	if(self->serverfd < 0) {
+	if(self->serverfd == INVALID_SOCKET) {
 		DEBUG(0, "Cannot create server-socket\n");
 		return -1;
 	}
@@ -175,7 +175,7 @@
 			  (struct sockaddr *)&self->trans.peer.inet6,
 			  &addrlen);
 
-	if(self->fd < 0)
+	if(self->fd == INVALID_SOCKET)
 		return -1;
 
 	/* Just use the default MTU for now */
@@ -196,7 +196,7 @@
 	int ret;
 
 	self->fd = obex_create_socket(self, AF_INET);
-	if(self->fd < 0)
+	if(self->fd == INVALID_SOCKET)
 		return -1;
 
 	/* Set these just in case */
@@ -208,7 +208,7 @@
 		       addr,sizeof(addr))) {
 		DEBUG(4, "Adress problem\n");
 		obex_delete_socket(self, self->fd);
-		self->fd = -1;
+		self->fd = INVALID_SOCKET;
 		return -1;
 	}
 	DEBUG(2, "peer addr = [%s]:%u\n",addr,ntohs(self->trans.peer.inet6.sin6_port));
@@ -216,10 +216,10 @@
 
 	ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.inet6,
 		      sizeof(struct sockaddr_in6));
-	if (ret < 0) {
+	if (ret == INVALID_SOCKET) {
 		DEBUG(4, "Connect failed\n");
 		obex_delete_socket(self, self->fd);
-		self->fd = -1;
+		self->fd = INVALID_SOCKET;
 		return ret;
 	}
 
@@ -242,7 +242,7 @@
 	ret = obex_delete_socket(self, self->fd);
 	if(ret < 0)
 		return ret;
-	self->fd = -1;
+	self->fd = INVALID_SOCKET;
 	return ret;	
 }
 
@@ -259,6 +259,6 @@
 	int ret;
 	DEBUG(4, "\n");
 	ret = obex_delete_socket(self, self->serverfd);
-	self->serverfd = -1;
+	self->serverfd = INVALID_SOCKET;
 	return ret;	
 }
Index: openobex-anoncvs/lib/obex.c
===================================================================
--- openobex-anoncvs.orig/lib/obex.c	2007-01-08 23:15:07.850607647 +0100
+++ openobex-anoncvs/lib/obex.c	2007-01-08 23:15:32.312136397 +0100
@@ -39,7 +39,7 @@
 
 #ifdef _WIN32
 #include <winsock2.h>
-#define ESOCKTNOSUPPORT 1
+#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
 #ifdef DLL_EXPORT
 #define LIB_SYMBOL __declspec(dllexport)
 #endif
@@ -51,7 +51,7 @@
 #ifdef HAVE_VISIBILITY
 #define LIB_SYMBOL __attribute__ ((visibility("default")))
 #endif
-#endif
+#endif /* _WIN32 */
 
 #ifndef LIB_SYMBOL
 #define LIB_SYMBOL
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Openobex-users mailing list
[email protected]
http://lists.sourceforge.net/lists/listinfo/openobex-users

Reply via email to