#13795: Initial commit for sflphone-android
includes: libexpat libyaml libdbus-c++ commoncpp ccrtp
libdbus (from android-4.0.4 sources)
TODO:
- git ignores "/jni/sflphone", sflphone repo should be cloned.
- sflphone-android only needs daemon directory. Ideally it should be possible
to clone it without cloning the whole sflphone project.
into sfl-android (commit 6a0fa7a "#13961: Fix cipher handling" has been used here)
- add pjsip-android project as a git submodule
- sflphone-android needs pjsip android project. Ideally daemon git repository
should not embed pjsip. Instead pjsip should be clone from official repositories.
Considering this, structure should have three distincts git repos:
sflphone-android/.git
sflphone-android/jni/ccrtp-1.8.0-android
sflphone-android/jni/commoncpp2-1.8.1-android
sflphone-android/jni/dbus
sflphone-android/jni/libdbus-c++-0.9.0-android
sflphone-android/jni/libexpat
sflphone-android/jni/libyaml
sflphone-android/jni/sflphone-daemon/.git
sflphone-android/jni/sflphone-daemon/src/audio
sflphone-android/jni/sflphone-daemon/src/config
sflphone-android/jni/sflphone-daemon/src/dbus
sflphone-android/jni/sflphone-daemon/src/history
sflphone-android/jni/sflphone-daemon/src/hooks
sflphone-android/jni/sflphone-daemon/src/iax
sflphone-android/jni/sflphone-daemon/src/sip
sflphone-android/jni/sflphone-daemon/src/video
sflphone-android/jni/pjsip-android/.git
Signed-off-by: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
diff --git a/jni/commoncpp2-1.8.1-android/src/nat.cpp b/jni/commoncpp2-1.8.1-android/src/nat.cpp
new file mode 100644
index 0000000..62840c9
--- /dev/null
+++ b/jni/commoncpp2-1.8.1-android/src/nat.cpp
@@ -0,0 +1,392 @@
+// Copyright (C) 2004-2010 TintaDigital - STI, LDA.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+//
+// This exception applies only to the code released under the name GNU
+// Common C++. If you copy code from other releases into a copy of GNU
+// Common C++, as the General Public License permits, the exception does
+// not apply to the code that you add in this way. To avoid misleading
+// anyone as to the status of such modified files, you must delete
+// this exception notice from them.
+//
+// If you write modifications of your own for GNU Common C++, it is your choice
+// whether to permit this exception to apply to your modifications.
+// If you do not wish that, delete this exception notice.
+//
+
+/**
+ * @file nat.c
+ * @short Network Address Translation interface implementation.
+ * @author Ricardo Gameiro <rgameiro at tintadigital dot com>
+ **/
+
+#include <cc++/config.h>
+#include "nat.h"
+
+#ifdef CCXX_NAT
+# ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+# endif
+# ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+# endif
+# ifdef HAVE_NAT_NETFILTER // Linux
+# ifdef HAVE_LIMITS_H
+# include <limits.h>
+# endif
+# ifdef HAVE_LINUX_NETFILTER_IPV4_H
+# include <linux/netfilter_ipv4.h>
+# endif
+# ifdef HAVE_LINUX_NETFILTER_IPV6_H
+# include <linux/netfilter_ipv6.h>
+# endif
+# else
+# ifdef HAVE_NET_IP6_H
+# include <netinet/ip6.h>
+# endif
+# ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+# endif
+# ifdef HAVE_NET_IF_H
+# include <net/if.h>
+# endif
+# ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+# endif
+# ifdef HAVE_IOCTL_H
+# include <ioctl.h>
+# endif
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+# ifdef HAVE_ERRNO_H
+# include <errno.h>
+# endif
+# ifdef HAVE_NAT_IPF // Solaris, *BSD (except OpenBSD), HP-UX
+# ifdef HAVE_NETINET_IP_COMPAT_H
+# include <netinet/ip_compat.h>
+# endif
+# ifdef HAVE_IP_COMPAT_H
+# include <ip_compat.h>
+# endif
+# ifdef HAVE_NETINET_IP_FIL_COMPAT_H
+# include <netinet/ip_fil_compat.h>
+# endif
+# ifdef HAVE_IP_FIL_COMPAT_H
+# include <ip_fil_compat.h>
+# endif
+# ifdef HAVE_NETINET_IP_FIL_H
+# include <netinet/ip_fil.h>
+# endif
+# ifdef HAVE_IP_FIL_H
+# include <ip_fil.h>
+# endif
+# ifdef HAVE_NETINET_IP_NAT_H
+# include <netinet/ip_nat.h>
+# endif
+# ifdef HAVE_IP_NAT_H
+# include <ip_nat.h>
+# endif
+# endif
+# ifdef HAVE_NAT_PF // OpenBSD
+# ifdef HAVE_NET_PFVAR_H
+# include <net/pfvar.h>
+# endif
+# endif
+# endif
+#endif
+
+#ifdef CCXX_NAMESPACES
+namespace ost {
+#endif
+
+#ifdef HAVE_NAT_NETFILTER
+# define NAT_SYSCALL "getsockopt"
+# define NAT_DEVICE ""
+#else
+# define NAT_SYSCALL "ioctl"
+# if defined(HAVE_NAT_IPF) && defined(IPL_NAT)
+# define NAT_DEVICE IPL_NAT
+# else
+# ifdef HAVE_NAT_PF
+# define NAT_DEVICE "/dev/pf"
+# endif
+# endif
+#endif
+
+#ifndef NAT_DEVICE
+#define NAT_DEVICE ""
+#endif
+
+#ifdef CCXX_NAT
+
+const char * natmsg[] = {
+ "nat lookup successful",
+ "nat address not in table",
+ "nat not supported/implemented",
+ "unable to open device "NAT_DEVICE,
+ "unable to get socket name",
+ "unable to get peer name",
+ "unable to get socket type",
+ "unable to lookup, nat "NAT_SYSCALL" failed",
+ "unkown nat error code"
+};
+
+#ifdef HAVE_NAT_NETFILTER // Linux
+natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat )
+{
+ struct sockaddr_in local;
+ socklen_t nlen = sizeof( *nat ), llen = sizeof( local );
+
+ if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) )
+ return natSocknameErr;
+
+ memset( &nat->sin_addr.s_addr, 0, sizeof( nat->sin_addr.s_addr ) );
+ if( getsockopt( sfd, SOL_IP, SO_ORIGINAL_DST, ( struct sockaddr * ) nat, &nlen) )
+ return natIFaceErr;
+
+ if( local.sin_addr.s_addr == nat->sin_addr.s_addr )
+ return natSearchErr;
+
+ nat->sin_family = local.sin_family;
+
+ return natOK;
+}
+
+#ifdef CCXX_IPV6
+natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat )
+{
+ struct sockaddr_in6 local;
+ socklen_t llen = sizeof( local ), nlen = sizeof( *nat );
+
+ if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) )
+ return natSocknameErr;
+
+ memset( &nat->sin6_addr.s6_addr, 0, sizeof( nat->sin6_addr.s6_addr ) );
+ if( getsockopt( sfd, SOL_IP, SO_ORIGINAL_DST, ( struct sockaddr * ) nat, &nlen) )
+ return natIFaceErr;
+
+ if( local.sin6_addr.s6_addr == nat->sin6_addr.s6_addr )
+ return natSearchErr;
+
+ nat->sin6_family = local.sin6_family;
+
+ return natOK;
+}
+#endif
+#endif
+
+#ifdef HAVE_NAT_IPF // Solaris, *BSD (except OpenBSD), HP-UX, etc.
+natResult natv4Lookup( int sfd, struct sockaddr_in * nat )
+{
+ static int natfd = -1;
+ struct sockaddr_in local, peer;
+ socklen_t nlen = sizeof( *nat ), llen = sizeof( local ), plen = sizeof( peer );
+ int socktype;
+ socklen_t stlen = sizeof( socktype );
+ struct natlookup nlu;
+ int nres;
+
+ if( natfd < 0 )
+ if( ( natfd = open( NAT_DEVICE, O_RDONLY, 0 ) ) < 0 )
+ return natDevUnavail;
+
+ if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) )
+ return natSocknameErr;
+ if( getpeername( sfd, ( struct sockaddr * ) &peer, &plen ) )
+ return natPeernameErr;
+ if( getsockopt( sfd, SOL_SOCKET, SO_TYPE, ( int * ) &socktype, &stlen ) )
+ return natSockTypeErr;
+
+ memset( &nlu.nl_realip.s_addr, 0, sizeof( nlu.nl_realip.s_addr ) );
+ nlu.nl_inip = local.sin_addr;
+ nlu.nl_inport = local.sin_port;
+ nlu.nl_outip = peer.sin_addr;
+ nlu.nl_outport = peer.sin_port;
+ nlu.nl_flags = ( socktype == SOCK_STREAM ) ? IPN_TCP : IPN_UDP;
+
+ if( 63 == ( SIOCGNATL & 0xff ) ) {
+ struct natlookup * nlup = &nlu;
+ nres = ioctl( natfd, SIOCGNATL, &nlup );
+ } else
+ nres = ioctl( natfd, SIOCGNATL, &nlu );
+
+ if( nres ) {
+ if( errno != ESRCH ) {
+ close( natfd );
+ natfd = -1;
+ return natIFaceErr;
+ } else
+ return natSearchErr;
+ }
+
+ if( local.sin_addr.s_addr == nlu.nl_realip.s_addr )
+ return natSearchErr;
+
+ nat->sin_family = local.sin_family;
+ nat->sin_port = nlu.nl_realport;
+ nat->sin_addr = nlu.nl_realip;
+
+ return natOK;
+}
+
+#ifdef CCXX_IPV6 // IPV6 is not yet supported by IPFilter
+natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat ) {
+ return natNotSupported;
+}
+#endif
+#endif
+
+#ifdef HAVE_NAT_PF // OpenBSD
+natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat ) {
+
+ static int natfd = -1;
+ struct sockaddr_in local, peer;
+ socklen_t nlen = sizeof( *nat ), llen = sizeof( local ), plen = sizeof( peer );
+ int socktype;
+ socklen_t stlen = sizeof( socktype );
+ struct pfioc_natlook nlu;
+ int nres;
+
+ if( natfd < 0 )
+ if( ( natfd = open( NAT_DEVICE, O_RDWR ) ) < 0 )
+ return natDevUnavail;
+
+ if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) )
+ return natSocknameErr;
+ if( getpeername( sfd, ( struct sockaddr * ) &peer, &plen ) )
+ return natPeernameErr;
+ if( getsockopt( sfd, SOL_SOCKET, SO_TYPE, ( int * ) &socktype, &stlen ) )
+ return natSockTypeErr;
+
+ memset( &nlu, 0, sizeof( nlu ) );
+ nlu.daddr.v4.s_addr = local.sin_addr.s_addr;
+ nlu.dport = local.sin_port;
+ nlu.saddr.v4.s_addr = peer.sin_addr.s_addr;
+ nlu.sport = peer.sin_port;
+ nlu.af = AF_INET;
+ nlu.proto = ( socktype == SOCK_STREAM ) ? IPPROTO_TCP : IPROTO_UDP;
+ nlu.direction = PF_OUT;
+
+ if( ioctl( natfd, DIOCNATLOOK, &nlu ) ) {
+ if( errno != ESRCH ) {
+ close( natfd );
+ natfd = -1;
+ return natIFaceErr;
+ } else
+ return natSearchErr;
+ }
+
+ if( local.sin_addr.s_addr == nlu.raddr.v4.s_addr )
+ return natSearchErr;
+
+ nat->sin_family = local.sin_family;
+ nat->sin_port = nlu.rdport;
+ nat->sin_addr = nlu.rdaddr.v4;
+
+ return natOK;
+}
+
+#ifdef CCXX_IPV6
+natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat )
+{
+ static int natfd = -1;
+ struct sockaddr_in6 local, peer;
+ socklen_t nlen = sizeof( *nat ), llen = sizeof( local ), plen = sizeof( peer );
+ int socktype;
+ socklen_t stlen = sizeof( socktype );
+ struct pfioc_natlook nlu;
+ int nres;
+
+ if( natfd < 0 )
+ if( ( natfd = open( NAT_DEVICE, O_RDWR ) ) < 0 )
+ return natDevUnavail;
+
+ if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) )
+ return natSocknameErr;
+ if( getpeername( sfd, ( struct sockaddr * ) &peer, &plen ) )
+ return natPeernameErr;
+ if( getsockopt( sfd, SOL_SOCKET, SO_TYPE, ( int * ) &socktype, &stlen ) )
+ return natSockTypeErr;
+
+ memset( &nlu, 0, sizeof( nlu ) );
+ nlu.daddr.v6.s6_addr = local.sin6_addr.s6_addr;
+ nlu.dport = local.sin6_port;
+ nlu.saddr.v6.s6_addr = peer.sin6_addr.s6_addr;
+ nlu.sport = peer.sin6_port;
+ nlu.af = AF_INET6;
+ nlu.proto = ( socktype == SOCK_STREAM ) ? IPPROTO_TCP : IPROTO_UDP;
+ nlu.direction = PF_OUT;
+
+ if( ioctl( natfd, DIOCNATLOOK, &nlu ) ) {
+ if( errno != ESRCH ) {
+ close( natfd );
+ natfd = -1;
+ return natIFaceErr;
+ } else
+ return natSearchErr;
+ }
+
+ if( local.sin6_addr.s6_addr == nlu.raddr.v6.s6_addr )
+ return natSearchErr;
+
+ nat->sin6_family = local.sin6_family;
+ nat->sin6_flowinfo = local.sin6_flowinfo;
+ nat->sin6_port = nlu.rdport;
+ nat->sin6_addr = nlu.rdaddr.v6;
+
+ return natOK;
+}
+#endif
+#endif
+
+const char * natErrorString( natResult res )
+{
+ return (char *)natmsg[ ( res >= natOK && res <= natIFaceErr ) ? res : natUnkownErr ];
+}
+
+#else
+natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat )
+{
+ return natNotSupported;
+}
+
+#ifdef CCXX_IPV6
+natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat )
+{
+ return natNotSupported;
+}
+#endif
+
+const char * natErrorString( natResult res )
+{
+ return "nat support not included";
+}
+
+#endif
+
+#ifdef CCXX_NAMESPACES
+}
+#endif
+