Send connman mailing list submissions to
        connman@lists.01.org

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
        connman-requ...@lists.01.org

You can reach the person managing the list at
        connman-ow...@lists.01.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."


Today's Topics:

   1. [PATCH 0/8] Connman changes for Android. (Naveen Singh)
   2. [PATCH 1/8] configure.ac: Introduce the notion of android
      (Naveen Singh)
   3. [PATCH 2/8] configure.ac: Remove hard check of ns_initparse
      (Naveen Singh)
   4. [PATCH 4/8] Makefile.am:libresolv.so and librt.so to be
      included only in Linux build (Naveen Singh)
   5. [PATCH 3/8] resolver: Adding ns_parse.c for android
      compilation (Naveen Singh)
   6. [PATCH 5/8] Removing the definition of in6_ifreq and
      in6_pktinfo (Naveen Singh)


----------------------------------------------------------------------

Message: 1
Date: Wed, 21 Sep 2016 15:59:05 -0700
From: Naveen Singh <nasi...@google.com>
To: connman@lists.01.org
Cc: Naveen Singh <nasi...@google.com>
Subject: [PATCH 0/8] Connman changes for Android.
Message-ID: <1474498753-120726-1-git-send-email-nasi...@google.com>

These are the set of 8 patches required for connman to compile
for android.
Patch 1 - Detect Android in configure.ac
Patch 2 - Remove hard check for ns_initparse in configure.ac
Patch 3 - Add the local definition of ns_* functions in connman
Patch 4 - Add libraries based on build
Patch 5 - Get rid of definitions of in6_ifreq and in6_pktinfo
Patch 6 - Add the definition of ether_arp in connman for Android
Patch 7 - Adding android specific code in gweb/gresolv.c
Patch 8 - Include android header file to get definition of MAXDNSSRCH

Naveen Singh (8):
  configure.ac: Introduce the notion of android
  configure.ac: Remove hard check of ns_initparse
  resolver: Adding ns_parse.c for android compilation
  Makefile.am:libresolv.so and librt.so to be included only in Linux
    build
  Removing the definition of in6_ifreq and in6_pktinfo
  struct ether_arp definition is missing in bionic
  gweb/gresolv.c: Adding android specific code in gresolv.c
  resolver: MAXDNSSRCH definition for android

 Makefile.am     |  12 ++-
 configure.ac    |  25 ++++-
 gdhcp/client.c  |  15 +++
 gdhcp/common.c  |   2 +-
 gdhcp/common.h  |   8 --
 gdhcp/ipv4ll.c  |  19 ++++
 gweb/gresolv.c  |  17 +++-
 gweb/ns_parse.c | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/inet.c      |   6 --
 src/resolver.c  |   3 +
 10 files changed, 364 insertions(+), 22 deletions(-)
 create mode 100644 gweb/ns_parse.c

-- 
2.8.0.rc3.226.g39d4020



------------------------------

Message: 2
Date: Wed, 21 Sep 2016 15:59:06 -0700
From: Naveen Singh <nasi...@google.com>
To: connman@lists.01.org
Cc: Naveen Singh <nasi...@google.com>
Subject: [PATCH 1/8] configure.ac: Introduce the notion of android
Message-ID: <1474498753-120726-2-git-send-email-nasi...@google.com>

This change is targeted towards detecting whether connman is compiled
for android. It does this by finding if host option passed to configure
has "android" in it. If it finds it makes two variables ANDROID and
ANDROID_COMPILE as 1. The first variable can be used in Makefile.am for
including different set of libraries (because of difference between
bionic and glibc). The second variable, ANDROID_COMPILE gets added into
config.h and then can be used in C code to conditionally compile android
specific code.
---
 configure.ac | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/configure.ac b/configure.ac
index b477aa1..267f058 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,6 +35,22 @@ AC_PROG_LIBTOOL
 
 gl_CONFIGMAKE_PREP
 
+android_compile=no
+AC_MSG_CHECKING([check for android])
+
+       case "${host}" in
+               *android*)
+                       android_compile=yes
+               ;;
+       esac
+
+AC_MSG_RESULT(${android_compile})
+AM_CONDITIONAL([ANDROID], test "${android_compile}" = "yes")
+
+if (test "${android_compile}" = "yes"); then
+       AC_DEFINE([ANDROID_COMPILE], 1, [android environment compilation])
+fi
+
 AC_ARG_ENABLE(optimization, AC_HELP_STRING([--disable-optimization],
                        [disable code optimization through compiler]), [
        if (test "${enableval}" = "no"); then
-- 
2.8.0.rc3.226.g39d4020



------------------------------

Message: 3
Date: Wed, 21 Sep 2016 15:59:07 -0700
From: Naveen Singh <nasi...@google.com>
To: connman@lists.01.org
Cc: Naveen Singh <nasi...@google.com>
Subject: [PATCH 2/8] configure.ac: Remove hard check of ns_initparse
Message-ID: <1474498753-120726-3-git-send-email-nasi...@google.com>

AC_CHECK_LIB was performed for ns_initparse in libresolv.so. For android
there is no libresolv.so. This sysmobol exists in libc.so.This change
removes that hard check.
---
 configure.ac | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index 267f058..a5e8bb0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -193,10 +193,13 @@ AM_CONDITIONAL(PPTP_BUILTIN, test "${enable_pptp}" = 
"builtin")
 
 AC_CHECK_HEADERS(resolv.h, dummy=yes,
        AC_MSG_ERROR(resolver header files are required))
-AC_CHECK_LIB(resolv, ns_initparse, dummy=yes, [
-       AC_CHECK_LIB(resolv, __ns_initparse, dummy=yes,
-               AC_MSG_ERROR(resolver library support is required))
+
+if (test "${android_compile}" = "no"); then
+       AC_CHECK_LIB(resolv, ns_initparse, dummy=yes, [
+               AC_CHECK_LIB(resolv, __ns_initparse, dummy=yes,
+                       AC_MSG_ERROR(resolver library support is required))
 ])
+fi
 
 AC_CHECK_HEADERS([execinfo.h])
 AM_CONDITIONAL([BACKTRACE], [test "${ac_cv_header_execinfo_h}" = "yes"])
-- 
2.8.0.rc3.226.g39d4020



------------------------------

Message: 4
Date: Wed, 21 Sep 2016 15:59:09 -0700
From: Naveen Singh <nasi...@google.com>
To: connman@lists.01.org
Cc: Naveen Singh <nasi...@google.com>
Subject: [PATCH 4/8] Makefile.am:libresolv.so and librt.so to be
        included only in Linux build
Message-ID: <1474498753-120726-5-git-send-email-nasi...@google.com>

src_connmand_LDADD was adding libresolv.so and librt.so unconditionally.
Since these libraries are not present in android, this commit include
these libraries only if connman is built for Linux.
---
 Makefile.am | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 7b24eb2..f5edb36 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -130,9 +130,11 @@ src_connmand_SOURCES = $(gdhcp_sources) $(gweb_sources) 
$(backtrace_sources) \
                        src/peer_service.c src/machine.c src/util.c
 
 src_connmand_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \
-                       @GLIB_LIBS@ @DBUS_LIBS@ @GNUTLS_LIBS@ \
-                       -lresolv -ldl -lrt
-
+                       @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ @GNUTLS_LIBS@ \
+                       -ldl
+if !ANDROID
+src_connmand_LDADD += -lresolv -lrt
+endif
 src_connmand_LDFLAGS = -Wl,--export-dynamic \
                                -Wl,--version-script=$(srcdir)/src/connman.ver
 
-- 
2.8.0.rc3.226.g39d4020



------------------------------

Message: 5
Date: Wed, 21 Sep 2016 15:59:08 -0700
From: Naveen Singh <nasi...@google.com>
To: connman@lists.01.org
Cc: Naveen Singh <nasi...@google.com>
Subject: [PATCH 3/8] resolver: Adding ns_parse.c for android
        compilation
Message-ID: <1474498753-120726-4-git-send-email-nasi...@google.com>

gweb/gresolv.c calls ns_initparse and few other ns_* functions. These
functions are part of resolver library in glibc. Bionic libc.so includes
libc_dns.a as a static library. These functions are defined as a part of
libc_dns which is compiled as static library but this library is not
installed as a part of android build. This commit adds a file called
ns_parse.c in gweb directory and implements whatever connman requires.
Makefile.am is modified to include this file only if it detects that
connman is built in Android environment.
---
 Makefile.am     |   4 +
 gweb/ns_parse.c | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 283 insertions(+)
 create mode 100644 gweb/ns_parse.c

diff --git a/Makefile.am b/Makefile.am
index 9c13630..7b24eb2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,6 +43,10 @@ else
 gweb_sources += gweb/giognutls.h gweb/gionotls.c
 endif
 
+if ANDROID
+gweb_sources += gweb/ns_parse.c
+endif
+
 if BACKTRACE
 backtrace_sources = src/backtrace.c
 endif
diff --git a/gweb/ns_parse.c b/gweb/ns_parse.c
new file mode 100644
index 0000000..37ae660
--- /dev/null
+++ b/gweb/ns_parse.c
@@ -0,0 +1,279 @@
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* Import. */
+
+#include <sys/types.h>
+
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+
+#include <errno.h>
+#include <resolv.h>
+#include <string.h>
+#define NS_TYPE_ELT                    0x40 /*%< EDNS0 extended label type */
+#define DNS_LABELTYPE_BITSTRING                0x41
+
+/* Forward. */
+
+static void    setsection(ns_msg *msg, ns_sect sect);
+
+/* Macros. */
+#ifndef __set_errno
+#define __set_errno(err) errno = (err)
+#endif
+#define RETERR(err) do { __set_errno (err); return (-1); } while (0)
+
+/* Public. */
+
+/* These need to be in the same order as the nres.h:ns_flag enum. */
+const struct _ns_flagdata _ns_flagdata[16] = {
+       { 0x8000, 15 },         /*%< qr. */
+       { 0x7800, 11 },         /*%< opcode. */
+       { 0x0400, 10 },         /*%< aa. */
+       { 0x0200, 9 },          /*%< tc. */
+       { 0x0100, 8 },          /*%< rd. */
+       { 0x0080, 7 },          /*%< ra. */
+       { 0x0040, 6 },          /*%< z. */
+       { 0x0020, 5 },          /*%< ad. */
+       { 0x0010, 4 },          /*%< cd. */
+       { 0x000f, 0 },          /*%< rcode. */
+       { 0x0000, 0 },          /*%< expansion (1/6). */
+       { 0x0000, 0 },          /*%< expansion (2/6). */
+       { 0x0000, 0 },          /*%< expansion (3/6). */
+       { 0x0000, 0 },          /*%< expansion (4/6). */
+       { 0x0000, 0 },          /*%< expansion (5/6). */
+       { 0x0000, 0 },          /*%< expansion (6/6). */
+};
+static int
+labellen(const u_char *lp)
+{
+       int bitlen;
+       u_char l = *lp;
+
+       if ((l & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
+               /* should be avoided by the caller */
+               return(-1);
+       }
+
+       if ((l & NS_CMPRSFLGS) == NS_TYPE_ELT) {
+               if (l == DNS_LABELTYPE_BITSTRING) {
+                       if ((bitlen = *(lp + 1)) == 0)
+                               bitlen = 256;
+                       return((bitlen + 7 ) / 8 + 1);
+               }
+               return(-1);     /*%< unknwon ELT */
+       }
+       return(l);
+}
+
+
+/*%
+ *     Advance *ptrptr to skip over the compressed name it points at.
+ *
+ * return:
+ *\li  0 on success, -1 (with errno set) on failure.
+ */
+       int
+ns_name_skip(const u_char **ptrptr, const u_char *eom)
+{
+       const u_char *cp;
+       u_int n;
+       int l;
+
+       cp = *ptrptr;
+       while (cp < eom && (n = *cp++) != 0) {
+               /* Check for indirection. */
+               switch (n & NS_CMPRSFLGS) {
+                       case 0:                 /*%< normal case, n == len */
+                               cp += n;
+                               continue;
+                       case NS_TYPE_ELT: /*%< EDNS0 extended label */
+                               if ((l = labellen(cp - 1)) < 0) {
+                                       __set_errno (EMSGSIZE);
+                                       return(-1);
+                               }
+                               cp += l;
+                               continue;
+                       case NS_CMPRSFLGS:      /*%< indirection */
+                               cp++;
+                               break;
+                       default:                /*%< illegal type */
+                               __set_errno (EMSGSIZE);
+                               return (-1);
+               }
+               break;
+       }
+       if (cp > eom) {
+               __set_errno (EMSGSIZE);
+               return (-1);
+       }
+       *ptrptr = cp;
+       return (0);
+}
+/*
+ * Skip over a compressed domain name. Return the size or -1.
+ */
+int
+dn_skipname(const u_char *ptr, const u_char *eom) {
+       const u_char *saveptr = ptr;
+
+       if (ns_name_skip(&ptr, eom) == -1)
+               return (-1);
+       return (ptr - saveptr);
+}
+#undef ns_msg_getflag
+int ns_msg_getflag(ns_msg handle, int flag) {
+       return(((handle)._flags & _ns_flagdata[flag].mask) >> 
_ns_flagdata[flag].shift);
+}
+
+int
+ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) {
+       const u_char *optr = ptr;
+
+       for ((void)NULL; count > 0; count--) {
+               int b, rdlength;
+
+               b = dn_skipname(ptr, eom);
+               if (b < 0)
+                       RETERR(EMSGSIZE);
+               ptr += b/*Name*/ + NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/;
+               if (section != ns_s_qd) {
+                       if (ptr + NS_INT32SZ + NS_INT16SZ > eom)
+                               RETERR(EMSGSIZE);
+                       ptr += NS_INT32SZ/*TTL*/;
+                       NS_GET16(rdlength, ptr);
+                       ptr += rdlength/*RData*/;
+               }
+       }
+       if (ptr > eom)
+               RETERR(EMSGSIZE);
+       return (ptr - optr);
+}
+
+int
+ns_initparse(const u_char *msg, int msglen, ns_msg *handle) {
+       const u_char *eom = msg + msglen;
+       int i;
+
+       memset(handle, 0x5e, sizeof *handle);
+       handle->_msg = msg;
+       handle->_eom = eom;
+       if (msg + NS_INT16SZ > eom)
+               RETERR(EMSGSIZE);
+       NS_GET16(handle->_id, msg);
+       if (msg + NS_INT16SZ > eom)
+               RETERR(EMSGSIZE);
+       NS_GET16(handle->_flags, msg);
+       for (i = 0; i < ns_s_max; i++) {
+               if (msg + NS_INT16SZ > eom)
+                       RETERR(EMSGSIZE);
+               NS_GET16(handle->_counts[i], msg);
+       }
+       for (i = 0; i < ns_s_max; i++)
+               if (handle->_counts[i] == 0)
+                       handle->_sections[i] = NULL;
+               else {
+                       int b = ns_skiprr(msg, eom, (ns_sect)i,
+                                         handle->_counts[i]);
+
+                       if (b < 0)
+                               return (-1);
+                       handle->_sections[i] = msg;
+                       msg += b;
+               }
+       if (msg != eom)
+               RETERR(EMSGSIZE);
+       setsection(handle, ns_s_max);
+       return (0);
+}
+
+int
+ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
+       int b;
+       int tmp;
+
+       /* Make section right. */
+       tmp = section;
+       if (tmp < 0 || section >= ns_s_max)
+               RETERR(ENODEV);
+       if (section != handle->_sect)
+               setsection(handle, section);
+
+       /* Make rrnum right. */
+       if (rrnum == -1)
+               rrnum = handle->_rrnum;
+       if (rrnum < 0 || rrnum >= handle->_counts[(int)section])
+               RETERR(ENODEV);
+       if (rrnum < handle->_rrnum)
+               setsection(handle, section);
+       if (rrnum > handle->_rrnum) {
+               b = ns_skiprr(handle->_msg_ptr, handle->_eom, section,
+                             rrnum - handle->_rrnum);
+
+               if (b < 0)
+                       return (-1);
+               handle->_msg_ptr += b;
+               handle->_rrnum = rrnum;
+       }
+
+       /* Do the parse. */
+       b = dn_expand(handle->_msg, handle->_eom,
+                     handle->_msg_ptr, rr->name, NS_MAXDNAME);
+       if (b < 0)
+               return (-1);
+       handle->_msg_ptr += b;
+       if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom)
+               RETERR(EMSGSIZE);
+       NS_GET16(rr->type, handle->_msg_ptr);
+       NS_GET16(rr->rr_class, handle->_msg_ptr);
+       if (section == ns_s_qd) {
+               rr->ttl = 0;
+               rr->rdlength = 0;
+               rr->rdata = NULL;
+       } else {
+               if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom)
+                       RETERR(EMSGSIZE);
+               NS_GET32(rr->ttl, handle->_msg_ptr);
+               NS_GET16(rr->rdlength, handle->_msg_ptr);
+               if (handle->_msg_ptr + rr->rdlength > handle->_eom)
+                       RETERR(EMSGSIZE);
+               rr->rdata = handle->_msg_ptr;
+               handle->_msg_ptr += rr->rdlength;
+       }
+       if (++handle->_rrnum > handle->_counts[(int)section])
+               setsection(handle, (ns_sect)((int)section + 1));
+
+       /* All done. */
+       return (0);
+}
+
+/* Private. */
+
+static void
+setsection(ns_msg *msg, ns_sect sect) {
+       msg->_sect = sect;
+       if (sect == ns_s_max) {
+               msg->_rrnum = -1;
+               msg->_msg_ptr = NULL;
+       } else {
+               msg->_rrnum = 0;
+               msg->_msg_ptr = msg->_sections[(int)sect];
+       }
+}
+
+/*! \file */
-- 
2.8.0.rc3.226.g39d4020



------------------------------

Message: 6
Date: Wed, 21 Sep 2016 15:59:10 -0700
From: Naveen Singh <nasi...@google.com>
To: connman@lists.01.org
Cc: Naveen Singh <nasi...@google.com>
Subject: [PATCH 5/8] Removing the definition of in6_ifreq and
        in6_pktinfo
Message-ID: <1474498753-120726-6-git-send-email-nasi...@google.com>

Connman header file (gdhcp/common.h) and src/inet.c explicitly
defines in6_pktinfo and in6_ifreq respectivly. Both of these are
present in netinet/in.h header file. struct in6_pktinfo is defined under #ifdef
__USE_GNU in file. define _GNU_SOURCE on top of gdhcp/common.c for this.
---
 gdhcp/common.c | 2 +-
 gdhcp/common.h | 8 --------
 src/inet.c     | 6 ------
 3 files changed, 1 insertion(+), 15 deletions(-)

diff --git a/gdhcp/common.c b/gdhcp/common.c
index 3817bcc..feab9ed 100644
--- a/gdhcp/common.c
+++ b/gdhcp/common.c
@@ -17,7 +17,7 @@
  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *
  */
-
+#define _GNU_SOURCE
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
diff --git a/gdhcp/common.h b/gdhcp/common.h
index 75abc18..c692799 100644
--- a/gdhcp/common.h
+++ b/gdhcp/common.h
@@ -170,14 +170,6 @@ static const uint8_t dhcp_option_lengths[] = {
        [OPTION_U32]    = 4,
 };
 
-/* already defined within netinet/in.h if using GNU compiler */
-#ifndef __USE_GNU
-struct in6_pktinfo {
-       struct in6_addr ipi6_addr;  /* src/dst IPv6 address */
-       unsigned int ipi6_ifindex;  /* send/recv interface index */
-};
-#endif
-
 uint8_t *dhcp_get_option(struct dhcp_packet *packet, int code);
 uint8_t *dhcpv6_get_option(struct dhcpv6_packet *packet, uint16_t pkt_len,
                        int code, uint16_t *option_len, int *option_count);
diff --git a/src/inet.c b/src/inet.c
index 69ded19..2fdd891 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -330,12 +330,6 @@ done:
        return err;
 }
 
-struct in6_ifreq {
-       struct in6_addr ifr6_addr;
-       __u32 ifr6_prefixlen;
-       unsigned int ifr6_ifindex;
-};
-
 int connman_inet_set_ipv6_address(int index,
                struct connman_ipaddress *ipaddress)
 {
-- 
2.8.0.rc3.226.g39d4020



------------------------------

Subject: Digest Footer

_______________________________________________
connman mailing list
connman@lists.01.org
https://lists.01.org/mailman/listinfo/connman


------------------------------

End of connman Digest, Vol 11, Issue 24
***************************************

Reply via email to