osi: add compat code for glibc

glibc doesn't declare strlcpy(), strlcat() or gettid(). Add a header
of compatibility routines that only get included when compiling on this.

Change-Id: I889ac7f1d22cf7056757890fcff0403107488d62
diff --git a/bta/hf_client/bta_hf_client_act.c b/bta/hf_client/bta_hf_client_act.c
index 4ea5ba6..4cf99c7 100644
--- a/bta/hf_client/bta_hf_client_act.c
+++ b/bta/hf_client/bta_hf_client_act.c
@@ -32,6 +32,7 @@
 #include "bta_sys.h"
 #include "utl.h"
 #include "bt_utils.h"
+#include "osi/include/compat.h"
 #include <string.h>
 
 /*****************************************************************************
diff --git a/bta/hf_client/bta_hf_client_api.c b/bta/hf_client/bta_hf_client_api.c
index b67f140..bb65f3e 100644
--- a/bta/hf_client/bta_hf_client_api.c
+++ b/bta/hf_client/bta_hf_client_api.c
@@ -27,6 +27,7 @@
 #include <string.h>
 #include "bta_hf_client_api.h"
 #include "bta_hf_client_int.h"
+#include "osi/include/compat.h"
 
 /*****************************************************************************
 **  Constants and data types
diff --git a/btif/src/btif_config.c b/btif/src/btif_config.c
index 3c5e1c4..8679e3c 100644
--- a/btif/src/btif_config.c
+++ b/btif/src/btif_config.c
@@ -29,6 +29,7 @@
 #include "btif_config.h"
 #include "btif_config_transcode.h"
 #include "btif_util.h"
+#include "osi/include/compat.h"
 #include "osi/include/config.h"
 #include "btcore/include/module.h"
 #include "osi/include/osi.h"
diff --git a/btif/src/btif_sock_rfc.c b/btif/src/btif_sock_rfc.c
index b2b1eb1..0ece691 100644
--- a/btif/src/btif_sock_rfc.c
+++ b/btif/src/btif_sock_rfc.c
@@ -42,6 +42,7 @@
 #include "btu.h"
 #include "gki.h"
 #include "hcimsgs.h"
+#include "osi/include/compat.h"
 #include "osi/include/list.h"
 #include "osi/include/osi.h"
 #include "osi/include/log.h"
diff --git a/btif/src/btif_storage.c b/btif/src/btif_storage.c
index c8e5264..56b8f5a 100644
--- a/btif/src/btif_storage.c
+++ b/btif/src/btif_storage.c
@@ -42,6 +42,7 @@
 #include "btif_storage.h"
 #include "btif_util.h"
 #include "btcore/include/bdaddr.h"
+#include "osi/include/compat.h"
 #include "osi/include/config.h"
 #include "gki.h"
 #include "osi/include/osi.h"
diff --git a/main/bte_conf.c b/main/bte_conf.c
index 75738e1..2bf61da 100644
--- a/main/bte_conf.c
+++ b/main/bte_conf.c
@@ -23,6 +23,7 @@
 #include <string.h>
 
 #include "bta_api.h"
+#include "osi/include/compat.h"
 #include "osi/include/config.h"
 #include "osi/include/log.h"
 
diff --git a/osi/include/compat.h b/osi/include/compat.h
new file mode 100644
index 0000000..02e13e3
--- /dev/null
+++ b/osi/include/compat.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *
+ *  Copyright 2015 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <features.h>
+#include <sys/types.h>
+
+#if __GLIBC__
+
+/* Get thread identification. */
+pid_t gettid(void);
+
+/* Copy src to string dst of size siz. */
+size_t strlcpy(char *dst, const char *src, size_t siz);
+
+/* Appends src to string dst of size siz. */
+size_t strlcat(char *dst, const char *src, size_t siz);
+
+#endif
diff --git a/osi/src/compat.c b/osi/src/compat.c
new file mode 100644
index 0000000..ea26c18
--- /dev/null
+++ b/osi/src/compat.c
@@ -0,0 +1,131 @@
+/******************************************************************************
+ *
+ *  Copyright 2015 Google, Inc.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+/************************************************************************************
+ *
+ *  Filename:      compat.c
+ *
+ *  Description:   Compatibility functions for non-bionic C libraries
+ *
+ *
+ ***********************************************************************************/
+
+#include <features.h>
+#include <string.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "osi/include/compat.h"
+
+#if __GLIBC__
+pid_t
+gettid(void)
+{
+  return syscall(SYS_gettid);
+}
+#endif
+
+/* These functions from bionic
+ *
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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.
+ */
+
+#if __GLIBC__
+/*
+ * Copy src to string dst of size siz.  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+  char *d = dst;
+  const char *s = src;
+  size_t n = siz;
+
+  /* Copy as many bytes as will fit */
+  if (n != 0) {
+    while (--n != 0) {
+      if ((*d++ = *s++) == '\0')
+        break;
+    }
+  }
+
+  /* Not enough room in dst, add NUL and traverse rest of src */
+  if (n == 0) {
+    if (siz != 0)
+      *d = '\0'; /* NUL-terminate dst */
+    while (*s++)
+      ;
+  }
+
+  return(s - src - 1); /* count does not include NUL */
+}
+#endif
+
+#if __GLIBC__
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left).  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
+ * Returns strlen(src) + MIN(siz, strlen(initial dst)).
+ * If retval >= siz, truncation occurred.
+ */
+size_t
+strlcat(char *dst, const char *src, size_t siz)
+{
+  char *d = dst;
+  const char *s = src;
+  size_t n = siz;
+  size_t dlen;
+
+  /* Find the end of dst and adjust bytes left but don't go past end */
+  while (n-- != 0 && *d != '\0')
+    d++;
+  dlen = d - dst;
+  n = siz - dlen;
+
+  if (n == 0)
+    return (dlen + strlen(s));
+
+  while (*s != '\0') {
+    if (n != 1) {
+      *d++ = *s;
+      n--;
+    }
+
+    s++;
+  }
+
+  *d = '\0';
+
+  return (dlen + (s - src)); /* count does not include NUL */
+}
+#endif
diff --git a/osi/src/thread.c b/osi/src/thread.c
index 1380755..524b28d 100644
--- a/osi/src/thread.c
+++ b/osi/src/thread.c
@@ -26,6 +26,7 @@
 #include <sys/types.h>
 
 #include "osi/include/allocator.h"
+#include "osi/include/compat.h"
 #include "osi/include/fixed_queue.h"
 #include "osi/include/log.h"
 #include "osi/include/reactor.h"
diff --git a/utils/src/bt_utils.c b/utils/src/bt_utils.c
index 1d1dcdd..53a53de 100644
--- a/utils/src/bt_utils.c
+++ b/utils/src/bt_utils.c
@@ -40,6 +40,7 @@
 #include "bt_types.h"
 #include "bt_utils.h"
 #include "btcore/include/module.h"
+#include "osi/include/compat.h"
 #include "osi/include/log.h"
 
 /*******************************************************************************