Hi,
attached are 3 patches. The Win32 patchset is posted in a seperate mail and
depend on the patches below.
soname.patch (essential!):
a one-liner to fix a bug in CVS
debug-output.patch (optional):
cleanup and "not-really-optional for win32"
tcpobex.patch (needs testing):
adds IPv6 support (with transparent IPv4 support)
adds TcpOBEX_* and keeps InOBEX_* (as wrapper) for compatibility
server part usuably as non-root user
HS
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-17 22:57:21.489816639 +0100
+++ openobex-anoncvs/lib/inobex.c 2007-01-22 21:42:25.050249904 +0100
@@ -43,12 +43,31 @@
#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;
+ if (in->sin_port == 0)
+ out->sin6_port = htons(OBEX_PORT);
+ else
+ 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,sizeof(out->sin6_addr.s6_addr));
+ 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 +76,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.s6_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 +104,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.s6_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 +139,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 +147,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 +172,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 +195,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 +203,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-17 22:57:21.529819139 +0100
+++ openobex-anoncvs/lib/obex.c 2007-01-22 21:43:04.532717404 +0100
@@ -941,47 +941,110 @@
}
/**
+ * 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 (TcpOBEX) only.
+ * It supports IPv4 (AF_INET) and IPv6 (AF_INET6).
+ *
+ * Returns -1 on error.
+ */
+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,addr,addrlen);
+ return obex_transport_listen(self);
+}
+
+/**
+ * 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");
- obex_return_val_if_fail(self != NULL, -1);
+ /* The old implementation only listened to IPv4.
+ * Thus, the following implements that for compatibiltiy.
+ * You can get IPv6 only with the TcpOBEX API.
+ */
+ struct sockaddr_in addr = {
+ .sin_family = AF_INET,
+ .sin_port = 0, /* automatically gets sets right */
+ .sin_addr.s_addr = INADDR_ANY
+ };
- inobex_prepare_listen(self);
- return obex_transport_listen(self);
+ return TcpOBEX_ServerRegister(self,(struct sockaddr*)&addr,sizeof(addr));
}
/**
- * InOBEX_TransportConnect - Connect Inet transport
+ * 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-17 22:57:21.573821889 +0100
+++ openobex-anoncvs/lib/obex_transport.h 2007-01-22 21:42:24.422210654 +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-17 22:57:21.617824639 +0100
+++ openobex-anoncvs/lib/inobex.h 2007-01-17 22:57:29.678328389 +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-17 22:57:21.713830639 +0100
+++ openobex-anoncvs/include/obex.h 2007-01-22 21:42:25.502278154 +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-17 22:57:21.665827639 +0100
+++ openobex-anoncvs/lib/obex.sym 2007-01-17 22:57:29.762333639 +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/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
-------------------------------------------------------------------------
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