|
|
f66a1df |
--- openobex-1.3/lib/inobex.c 2006-02-12 10:51:14.000000000 +0100
|
|
|
f66a1df |
+++ openobex-1.3mzk/lib/inobex.c 2007-08-28 11:27:12.000000000 +0200
|
|
|
f66a1df |
@@ -6,7 +6,7 @@
|
|
|
f66a1df |
* Status: Experimental.
|
|
|
f66a1df |
* Author: Dag Brattli <dagb@cs.uit.no>
|
|
|
f66a1df |
* Created at: Sat Apr 17 16:50:35 1999
|
|
|
f66a1df |
- * CVS ID: $Id: inobex.c,v 1.16 2006/02/12 09:51:14 holtmann Exp $
|
|
|
f66a1df |
+ * CVS ID: $Id: inobex.c 297 2007-01-25 00:23:37Z holtmann $
|
|
|
f66a1df |
*
|
|
|
f66a1df |
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
|
|
f66a1df |
*
|
|
|
f66a1df |
@@ -35,19 +35,51 @@
|
|
|
f66a1df |
#include <string.h>
|
|
|
f66a1df |
|
|
|
f66a1df |
#ifdef _WIN32
|
|
|
f66a1df |
-#include <winsock.h>
|
|
|
f66a1df |
+#include <winsock2.h>
|
|
|
f66a1df |
+#include <ws2tcpip.h>
|
|
|
f66a1df |
#else
|
|
|
f66a1df |
|
|
|
f66a1df |
#include <sys/types.h>
|
|
|
f66a1df |
#include <netinet/in.h>
|
|
|
f66a1df |
#include <fcntl.h>
|
|
|
f66a1df |
#include <sys/socket.h>
|
|
|
f66a1df |
+#include <arpa/inet.h>
|
|
|
f66a1df |
#endif /*_WIN32*/
|
|
|
f66a1df |
|
|
|
f66a1df |
#include "obex_main.h"
|
|
|
f66a1df |
|
|
|
f66a1df |
#define OBEX_PORT 650
|
|
|
f66a1df |
|
|
|
f66a1df |
+static void map_ip4to6(struct sockaddr_in *in, struct sockaddr_in6 *out)
|
|
|
f66a1df |
+{
|
|
|
f66a1df |
+ out->sin6_family = AF_INET6;
|
|
|
f66a1df |
+ if (in->sin_port == 0)
|
|
|
f66a1df |
+ out->sin6_port = htons(OBEX_PORT);
|
|
|
f66a1df |
+ else
|
|
|
f66a1df |
+ out->sin6_port = in->sin_port;
|
|
|
f66a1df |
+ out->sin6_flowinfo = 0;
|
|
|
f66a1df |
+
|
|
|
f66a1df |
+ /* default, matches IN6ADDR_ANY */
|
|
|
f66a1df |
+ memset(out->sin6_addr.s6_addr, 0, sizeof(out->sin6_addr.s6_addr));
|
|
|
f66a1df |
+ switch (in->sin_addr.s_addr) {
|
|
|
f66a1df |
+ case INADDR_ANY:
|
|
|
f66a1df |
+ /* does not work, so use IN6ADDR_ANY
|
|
|
f66a1df |
+ * which includes INADDR_ANY
|
|
|
f66a1df |
+ */
|
|
|
f66a1df |
+ break;
|
|
|
f66a1df |
+ default:
|
|
|
f66a1df |
+ /* map the IPv4 address to [::FFFF:<ipv4>]
|
|
|
f66a1df |
+ * see RFC2373 and RFC2553 for details
|
|
|
f66a1df |
+ */
|
|
|
f66a1df |
+ out->sin6_addr.s6_addr16[10/2] = 0xFFFF;
|
|
|
f66a1df |
+ out->sin6_addr.s6_addr[12] = (in->sin_addr.s_addr >> 0) & 0xFF;
|
|
|
f66a1df |
+ out->sin6_addr.s6_addr[13] = (in->sin_addr.s_addr >> 8) & 0xFF;
|
|
|
f66a1df |
+ out->sin6_addr.s6_addr[14] = (in->sin_addr.s_addr >> 16) & 0xFF;
|
|
|
f66a1df |
+ out->sin6_addr.s6_addr[15] = (in->sin_addr.s_addr >> 24) & 0xFF;
|
|
|
f66a1df |
+ break;
|
|
|
f66a1df |
+ }
|
|
|
f66a1df |
+}
|
|
|
f66a1df |
+
|
|
|
f66a1df |
/*
|
|
|
f66a1df |
* Function inobex_prepare_connect (self, service)
|
|
|
f66a1df |
*
|
|
|
f66a1df |
@@ -56,10 +88,30 @@
|
|
|
f66a1df |
*/
|
|
|
f66a1df |
void inobex_prepare_connect(obex_t *self, struct sockaddr *saddr, int addrlen)
|
|
|
f66a1df |
{
|
|
|
f66a1df |
- memcpy(&self->trans.peer, saddr, addrlen);
|
|
|
f66a1df |
- /* Override to be safe... */
|
|
|
f66a1df |
- self->trans.peer.inet.sin_family = AF_INET;
|
|
|
f66a1df |
- self->trans.peer.inet.sin_port = htons(OBEX_PORT);
|
|
|
f66a1df |
+ struct sockaddr_in6 addr = {
|
|
|
f66a1df |
+ .sin6_family = AF_INET6,
|
|
|
f66a1df |
+ .sin6_port = htons(OBEX_PORT),
|
|
|
f66a1df |
+#ifdef _WIN32
|
|
|
f66a1df |
+ .sin6_addr.s6_addr = IN6ADDR_LOOPBACK_INIT,
|
|
|
f66a1df |
+#else
|
|
|
f66a1df |
+ .sin6_addr = IN6ADDR_LOOPBACK_INIT,
|
|
|
f66a1df |
+#endif
|
|
|
f66a1df |
+ .sin6_flowinfo = 0
|
|
|
f66a1df |
+ };
|
|
|
f66a1df |
+ if (saddr == NULL)
|
|
|
f66a1df |
+ saddr = (struct sockaddr*)(&addr);
|
|
|
f66a1df |
+ else
|
|
|
f66a1df |
+ switch (saddr->sa_family){
|
|
|
f66a1df |
+ case AF_INET6:
|
|
|
f66a1df |
+ break;
|
|
|
f66a1df |
+ case AF_INET:
|
|
|
f66a1df |
+ map_ip4to6((struct sockaddr_in*)saddr,&addr);
|
|
|
f66a1df |
+ /* no break */
|
|
|
f66a1df |
+ default:
|
|
|
f66a1df |
+ saddr = (struct sockaddr*)(&addr);
|
|
|
f66a1df |
+ break;
|
|
|
f66a1df |
+ }
|
|
|
f66a1df |
+ memcpy(&self->trans.peer.inet6, saddr, sizeof(self->trans.self.inet6));
|
|
|
f66a1df |
}
|
|
|
f66a1df |
|
|
|
f66a1df |
/*
|
|
|
f66a1df |
@@ -68,12 +120,33 @@ void inobex_prepare_connect(obex_t *self
|
|
|
f66a1df |
* Prepare for INET-listen
|
|
|
f66a1df |
*
|
|
|
f66a1df |
*/
|
|
|
f66a1df |
-void inobex_prepare_listen(obex_t *self)
|
|
|
f66a1df |
+void inobex_prepare_listen(obex_t *self, struct sockaddr *saddr, int addrlen)
|
|
|
f66a1df |
{
|
|
|
f66a1df |
+ struct sockaddr_in6 addr = {
|
|
|
f66a1df |
+ .sin6_family = AF_INET6,
|
|
|
f66a1df |
+ .sin6_port = htons(OBEX_PORT),
|
|
|
f66a1df |
+#ifdef _WIN32
|
|
|
f66a1df |
+ .sin6_addr.s6_addr = IN6ADDR_ANY_INIT,
|
|
|
f66a1df |
+#else
|
|
|
f66a1df |
+ .sin6_addr = IN6ADDR_ANY_INIT,
|
|
|
f66a1df |
+#endif
|
|
|
f66a1df |
+ .sin6_flowinfo = 0
|
|
|
f66a1df |
+ };
|
|
|
f66a1df |
/* Bind local service */
|
|
|
f66a1df |
- self->trans.self.inet.sin_family = AF_INET;
|
|
|
f66a1df |
- self->trans.self.inet.sin_port = htons(OBEX_PORT);
|
|
|
f66a1df |
- self->trans.self.inet.sin_addr.s_addr = INADDR_ANY;
|
|
|
f66a1df |
+ if (saddr == NULL)
|
|
|
f66a1df |
+ saddr = (struct sockaddr *) &addr;
|
|
|
f66a1df |
+ else
|
|
|
f66a1df |
+ switch (saddr->sa_family) {
|
|
|
f66a1df |
+ case AF_INET6:
|
|
|
f66a1df |
+ break;
|
|
|
f66a1df |
+ case AF_INET:
|
|
|
f66a1df |
+ map_ip4to6((struct sockaddr_in *) saddr, &addr);
|
|
|
f66a1df |
+ /* no break */
|
|
|
f66a1df |
+ default:
|
|
|
f66a1df |
+ saddr = (struct sockaddr *) &addr;
|
|
|
f66a1df |
+ break;
|
|
|
f66a1df |
+ }
|
|
|
f66a1df |
+ memcpy(&self->trans.self.inet6, saddr, sizeof(self->trans.self.inet6));
|
|
|
f66a1df |
}
|
|
|
f66a1df |
|
|
|
f66a1df |
/*
|
|
|
f66a1df |
@@ -86,7 +159,7 @@ int inobex_listen(obex_t *self)
|
|
|
f66a1df |
{
|
|
|
f66a1df |
DEBUG(4, "\n");
|
|
|
f66a1df |
|
|
|
f66a1df |
- self->serverfd = obex_create_socket(self, AF_INET);
|
|
|
f66a1df |
+ self->serverfd = obex_create_socket(self, AF_INET6);
|
|
|
f66a1df |
if(self->serverfd < 0) {
|
|
|
f66a1df |
DEBUG(0, "Cannot create server-socket\n");
|
|
|
f66a1df |
return -1;
|
|
|
f66a1df |
@@ -94,9 +167,8 @@ int inobex_listen(obex_t *self)
|
|
|
f66a1df |
|
|
|
f66a1df |
//printf("TCP/IP listen %d %X\n", self->trans.self.inet.sin_port,
|
|
|
f66a1df |
// self->trans.self.inet.sin_addr.s_addr);
|
|
|
f66a1df |
- if (bind(self->serverfd, (struct sockaddr*) &self->trans.self.inet,
|
|
|
f66a1df |
- sizeof(struct sockaddr_in)))
|
|
|
f66a1df |
- {
|
|
|
f66a1df |
+ if (bind(self->serverfd, (struct sockaddr *) &self->trans.self.inet6,
|
|
|
f66a1df |
+ sizeof(struct sockaddr_in6))) {
|
|
|
f66a1df |
DEBUG(0, "bind() Failed\n");
|
|
|
f66a1df |
return -1;
|
|
|
f66a1df |
}
|
|
|
f66a1df |
@@ -120,10 +192,11 @@ int inobex_listen(obex_t *self)
|
|
|
f66a1df |
*/
|
|
|
f66a1df |
int inobex_accept(obex_t *self)
|
|
|
f66a1df |
{
|
|
|
f66a1df |
- socklen_t addrlen = sizeof(struct sockaddr_in);
|
|
|
f66a1df |
+ socklen_t addrlen = sizeof(struct sockaddr_in6);
|
|
|
f66a1df |
|
|
|
f66a1df |
- self->fd = accept(self->serverfd, (struct sockaddr *)
|
|
|
f66a1df |
- &self->trans.peer.inet, &addrlen);
|
|
|
f66a1df |
+ self->fd = accept(self->serverfd,
|
|
|
f66a1df |
+ (struct sockaddr *) &self->trans.peer.inet6,
|
|
|
f66a1df |
+ &addrlen);
|
|
|
f66a1df |
|
|
|
f66a1df |
if(self->fd < 0)
|
|
|
f66a1df |
return -1;
|
|
|
f66a1df |
@@ -142,26 +215,30 @@ int inobex_accept(obex_t *self)
|
|
|
f66a1df |
*/
|
|
|
f66a1df |
int inobex_connect_request(obex_t *self)
|
|
|
f66a1df |
{
|
|
|
f66a1df |
- unsigned char *addr;
|
|
|
f66a1df |
+ char addr[INET6_ADDRSTRLEN];
|
|
|
f66a1df |
int ret;
|
|
|
f66a1df |
|
|
|
f66a1df |
- self->fd = obex_create_socket(self, AF_INET);
|
|
|
f66a1df |
+ self->fd = obex_create_socket(self, AF_INET6);
|
|
|
f66a1df |
if(self->fd < 0)
|
|
|
f66a1df |
return -1;
|
|
|
f66a1df |
|
|
|
f66a1df |
/* Set these just in case */
|
|
|
f66a1df |
- self->trans.peer.inet.sin_family = AF_INET;
|
|
|
f66a1df |
- if (self->trans.peer.inet.sin_port == 0)
|
|
|
f66a1df |
- self->trans.peer.inet.sin_port = htons(OBEX_PORT);
|
|
|
f66a1df |
-
|
|
|
f66a1df |
- addr = (unsigned char *) &self->trans.peer.inet.sin_addr.s_addr;
|
|
|
f66a1df |
-
|
|
|
f66a1df |
- DEBUG(2, "peer addr = %d.%d.%d.%d\n",
|
|
|
f66a1df |
- addr[0], addr[1], addr[2], addr[3]);
|
|
|
f66a1df |
+ if (self->trans.peer.inet6.sin6_port == 0)
|
|
|
f66a1df |
+ self->trans.peer.inet6.sin6_port = htons(OBEX_PORT);
|
|
|
f66a1df |
|
|
|
f66a1df |
+#ifndef _WIN32
|
|
|
f66a1df |
+ if (!inet_ntop(AF_INET6,&self->trans.peer.inet6.sin6_addr,
|
|
|
f66a1df |
+ addr,sizeof(addr))) {
|
|
|
f66a1df |
+ DEBUG(4, "Adress problem\n");
|
|
|
f66a1df |
+ obex_delete_socket(self, self->fd);
|
|
|
f66a1df |
+ self->fd = -1;
|
|
|
f66a1df |
+ return -1;
|
|
|
f66a1df |
+ }
|
|
|
f66a1df |
+ DEBUG(2, "peer addr = [%s]:%u\n",addr,ntohs(self->trans.peer.inet6.sin6_port));
|
|
|
f66a1df |
+#endif
|
|
|
f66a1df |
|
|
|
f66a1df |
- ret = connect(self->fd, (struct sockaddr*) &self->trans.peer.inet,
|
|
|
f66a1df |
- sizeof(struct sockaddr_in));
|
|
|
f66a1df |
+ ret = connect(self->fd, (struct sockaddr *) &self->trans.peer.inet6,
|
|
|
f66a1df |
+ sizeof(struct sockaddr_in6));
|
|
|
f66a1df |
if (ret < 0) {
|
|
|
f66a1df |
DEBUG(4, "Connect failed\n");
|
|
|
f66a1df |
obex_delete_socket(self, self->fd);
|
|
|
f66a1df |
|
|
|
f66a1df |
--- openobex-1.3/lib/inobex.h 2002-10-28 22:51:18.000000000 +0100
|
|
|
f66a1df |
+++ openobex-1.3mzk/lib/inobex.h 2007-08-24 16:33:00.000000000 +0200
|
|
|
f66a1df |
@@ -6,7 +6,7 @@
|
|
|
f66a1df |
* Status: Experimental.
|
|
|
f66a1df |
* Author: Dag Brattli <dagb@cs.uit.no>
|
|
|
f66a1df |
* Created at: Mon Apr 26 13:55:27 1999
|
|
|
f66a1df |
- * CVS ID: $Id: inobex.h,v 1.7 2002/10/28 21:51:18 holtmann Exp $
|
|
|
f66a1df |
+ * CVS ID: $Id: inobex.h 297 2007-01-25 00:23:37Z holtmann $
|
|
|
f66a1df |
*
|
|
|
f66a1df |
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
|
|
f66a1df |
*
|
|
|
f66a1df |
@@ -31,7 +31,7 @@
|
|
|
f66a1df |
#define INOBEX_H
|
|
|
f66a1df |
|
|
|
f66a1df |
void inobex_prepare_connect(obex_t *self, struct sockaddr *saddr, int addrlen);
|
|
|
f66a1df |
-void inobex_prepare_listen(obex_t *self);
|
|
|
f66a1df |
+void inobex_prepare_listen(obex_t *self, struct sockaddr *saddr, int addrlen);
|
|
|
f66a1df |
int inobex_listen(obex_t *self);
|
|
|
f66a1df |
int inobex_accept(obex_t *self);
|
|
|
f66a1df |
int inobex_connect_request(obex_t *self);
|
|
|
f66a1df |
|
|
|
f66a1df |
--- openobex-1.3/lib/obex.c 2006-05-25 20:09:41.000000000 +0200
|
|
|
f66a1df |
+++ openobex-1.3mzk/lib/obex.c 2007-08-24 16:37:10.000000000 +0200
|
|
|
f66a1df |
@@ -933,7 +933,7 @@ int InOBEX_ServerRegister(obex_t *self)
|
|
|
f66a1df |
|
|
|
f66a1df |
obex_return_val_if_fail(self != NULL, -1);
|
|
|
f66a1df |
|
|
|
f66a1df |
- inobex_prepare_listen(self);
|
|
|
f66a1df |
+ inobex_prepare_listen(self, NULL, 0);
|
|
|
f66a1df |
return obex_transport_listen(self);
|
|
|
f66a1df |
}
|
|
|
f66a1df |
|
|
|
f66a1df |
|
|
|
f66a1df |
--- openobex-1.3/lib/obex_transport.c 2006-05-04 13:24:21.000000000 +0200
|
|
|
f66a1df |
+++ openobex-1.3mzk/lib/obex_transport.c 2007-08-27 15:57:22.000000000 +0200
|
|
|
f66a1df |
@@ -191,6 +191,13 @@ int obex_transport_connect_request(obex_
|
|
|
f66a1df |
break;
|
|
|
f66a1df |
#endif /*HAVE_IRDA*/
|
|
|
f66a1df |
case OBEX_TRANS_INET:
|
|
|
f66a1df |
+ /* needed as compat for apps that call OBEX_TransportConnect
|
|
|
f66a1df |
+ * instead of InOBEX_TransportConnect (e.g. obexftp)
|
|
|
f66a1df |
+ */
|
|
|
f66a1df |
+ if (self->trans.peer.inet6.sin6_family == AF_INET)
|
|
|
f66a1df |
+ inobex_prepare_connect(self,
|
|
|
f66a1df |
+ (struct sockaddr*) &self->trans.peer.inet6,
|
|
|
f66a1df |
+ sizeof(self->trans.peer.inet6));
|
|
|
f66a1df |
ret = inobex_connect_request(self);
|
|
|
f66a1df |
break;
|
|
|
f66a1df |
case OBEX_TRANS_CUSTOM:
|
|
|
f66a1df |
|
|
|
f66a1df |
--- openobex-1.3/lib/obex_transport.h 2006-05-04 13:24:21.000000000 +0200
|
|
|
f66a1df |
+++ openobex-1.3mzk/lib/obex_transport.h 2007-08-27 16:06:51.000000000 +0200
|
|
|
f66a1df |
@@ -53,7 +53,7 @@ typedef union {
|
|
|
f66a1df |
#ifdef HAVE_IRDA
|
|
|
f66a1df |
struct sockaddr_irda irda;
|
|
|
f66a1df |
#endif /*HAVE_IRDA*/
|
|
|
f66a1df |
- struct sockaddr_in inet;
|
|
|
f66a1df |
+ struct sockaddr_in6 inet6;
|
|
|
f66a1df |
#ifdef HAVE_BLUETOOTH
|
|
|
f66a1df |
struct sockaddr_rc rfcomm;
|
|
|
f66a1df |
#endif /*HAVE_BLUETOOTH*/
|