From cb0ed84d4022e0fba6aaa9e99e258d8d507a90e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 28 Nov 2012 16:28:28 +0100 Subject: [PATCH] Fix compilation on Android with the bionic C library --- gio/glocalfileinfo.c | 2 + gio/gresolver.c | 137 +++++++++++++++++++++++++++++ gio/gthreadedresolver.c | 7 ++ gio/tests/gtlsconsoleinteraction.c | 10 ++- glib/galloca.h | 4 +- glib/gstrfuncs.c | 14 +++ glib/gutils.c | 6 ++ gmodule/gmodule-dl.c | 4 + 8 files changed, 182 insertions(+), 2 deletions(-) diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index 9c974953c..cd69c95c3 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -1094,6 +1094,7 @@ lookup_uid_data (uid_t uid) if (pwbufp->pw_name != NULL && pwbufp->pw_name[0] != 0) data->user_name = convert_pwd_string_to_utf8 (pwbufp->pw_name); +#ifndef __BIONIC__ gecos = pwbufp->pw_gecos; if (gecos) @@ -1103,6 +1104,7 @@ lookup_uid_data (uid_t uid) *comma = 0; data->real_name = convert_pwd_string_to_utf8 (gecos); } +#endif } /* Default fallbacks */ diff --git a/gio/gresolver.c b/gio/gresolver.c index 718dc48ca..e92715752 100644 --- a/gio/gresolver.c +++ b/gio/gresolver.c @@ -258,7 +258,9 @@ g_resolver_maybe_reload (GResolver *resolver) if (st.st_mtime != resolver->priv->resolv_conf_timestamp) { resolver->priv->resolv_conf_timestamp = st.st_mtime; +#ifndef __BIONIC__ res_init (); +#endif g_signal_emit (resolver, signals[RELOAD], 0); } } @@ -970,6 +972,141 @@ _g_resolver_name_from_nameinfo (GInetAddress *address, #if defined(G_OS_UNIX) +#ifdef __BIONIC__ +/* Copy from bionic/libc/private/arpa_nameser_compat.h + * and bionic/libc/private/arpa_nameser.h */ +typedef struct { + unsigned id :16; /* query identification number */ +#if BYTE_ORDER == BIG_ENDIAN + /* fields in third byte */ + unsigned qr: 1; /* response flag */ + unsigned opcode: 4; /* purpose of message */ + unsigned aa: 1; /* authoritive answer */ + unsigned tc: 1; /* truncated message */ + unsigned rd: 1; /* recursion desired */ + /* fields in fourth byte */ + unsigned ra: 1; /* recursion available */ + unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ + unsigned ad: 1; /* authentic data from named */ + unsigned cd: 1; /* checking disabled by resolver */ + unsigned rcode :4; /* response code */ +#endif +#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN + /* fields in third byte */ + unsigned rd :1; /* recursion desired */ + unsigned tc :1; /* truncated message */ + unsigned aa :1; /* authoritive answer */ + unsigned opcode :4; /* purpose of message */ + unsigned qr :1; /* response flag */ + /* fields in fourth byte */ + unsigned rcode :4; /* response code */ + unsigned cd: 1; /* checking disabled by resolver */ + unsigned ad: 1; /* authentic data from named */ + unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ + unsigned ra :1; /* recursion available */ +#endif + /* remaining bytes */ + unsigned qdcount :16; /* number of question entries */ + unsigned ancount :16; /* number of answer entries */ + unsigned nscount :16; /* number of authority entries */ + unsigned arcount :16; /* number of resource entries */ +} HEADER; + +#define NS_INT32SZ 4 /* #/bytes of data in a uint32_t */ +#define NS_INT16SZ 2 /* #/bytes of data in a uint16_t */ + +#define NS_GET16(s, cp) do { \ + const u_char *t_cp = (const u_char *)(cp); \ + (s) = ((uint16_t)t_cp[0] << 8) \ + | ((uint16_t)t_cp[1]) \ + ; \ + (cp) += NS_INT16SZ; \ +} while (/*CONSTCOND*/0) + +#define NS_GET32(l, cp) do { \ + const u_char *t_cp = (const u_char *)(cp); \ + (l) = ((uint32_t)t_cp[0] << 24) \ + | ((uint32_t)t_cp[1] << 16) \ + | ((uint32_t)t_cp[2] << 8) \ + | ((uint32_t)t_cp[3]) \ + ; \ + (cp) += NS_INT32SZ; \ +} while (/*CONSTCOND*/0) + +#define GETSHORT NS_GET16 +#define GETLONG NS_GET32 + +#define C_IN 1 + +/* From bionic/libc/private/resolv_private.h */ +int dn_expand(const u_char *, const u_char *, const u_char *, char *, int); +#define dn_skipname __dn_skipname +int dn_skipname(const u_char *, const u_char *); + +/* From bionic/libc/private/arpa_nameser_compat.h */ +#define T_MX ns_t_mx +#define T_TXT ns_t_txt +#define T_SOA ns_t_soa +#define T_NS ns_t_ns + +/* From bionic/libc/private/arpa_nameser.h */ +typedef enum __ns_type { + ns_t_invalid = 0, /* Cookie. */ + ns_t_a = 1, /* Host address. */ + ns_t_ns = 2, /* Authoritative server. */ + ns_t_md = 3, /* Mail destination. */ + ns_t_mf = 4, /* Mail forwarder. */ + ns_t_cname = 5, /* Canonical name. */ + ns_t_soa = 6, /* Start of authority zone. */ + ns_t_mb = 7, /* Mailbox domain name. */ + ns_t_mg = 8, /* Mail group member. */ + ns_t_mr = 9, /* Mail rename name. */ + ns_t_null = 10, /* Null resource record. */ + ns_t_wks = 11, /* Well known service. */ + ns_t_ptr = 12, /* Domain name pointer. */ + ns_t_hinfo = 13, /* Host information. */ + ns_t_minfo = 14, /* Mailbox information. */ + ns_t_mx = 15, /* Mail routing information. */ + ns_t_txt = 16, /* Text strings. */ + ns_t_rp = 17, /* Responsible person. */ + ns_t_afsdb = 18, /* AFS cell database. */ + ns_t_x25 = 19, /* X_25 calling address. */ + ns_t_isdn = 20, /* ISDN calling address. */ + ns_t_rt = 21, /* Router. */ + ns_t_nsap = 22, /* NSAP address. */ + ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ + ns_t_sig = 24, /* Security signature. */ + ns_t_key = 25, /* Security key. */ + ns_t_px = 26, /* X.400 mail mapping. */ + ns_t_gpos = 27, /* Geographical position (withdrawn). */ + ns_t_aaaa = 28, /* Ip6 Address. */ + ns_t_loc = 29, /* Location Information. */ + ns_t_nxt = 30, /* Next domain (security). */ + ns_t_eid = 31, /* Endpoint identifier. */ + ns_t_nimloc = 32, /* Nimrod Locator. */ + ns_t_srv = 33, /* Server Selection. */ + ns_t_atma = 34, /* ATM Address */ + ns_t_naptr = 35, /* Naming Authority PoinTeR */ + ns_t_kx = 36, /* Key Exchange */ + ns_t_cert = 37, /* Certification record */ + ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ + ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ + ns_t_sink = 40, /* Kitchen sink (experimentatl) */ + ns_t_opt = 41, /* EDNS0 option (meta-RR) */ + ns_t_apl = 42, /* Address prefix list (RFC 3123) */ + ns_t_tkey = 249, /* Transaction key */ + ns_t_tsig = 250, /* Transaction signature. */ + ns_t_ixfr = 251, /* Incremental zone transfer. */ + ns_t_axfr = 252, /* Transfer zone of authority. */ + ns_t_mailb = 253, /* Transfer mailbox records. */ + ns_t_maila = 254, /* Transfer mail agent records. */ + ns_t_any = 255, /* Wildcard match. */ + ns_t_zxfr = 256, /* BIND-specific, nonstandard. */ + ns_t_max = 65536 +} ns_type; + +#endif + static gboolean parse_short (guchar **p, guchar *end, diff --git a/gio/gthreadedresolver.c b/gio/gthreadedresolver.c index b0af4056f..f979c1b07 100644 --- a/gio/gthreadedresolver.c +++ b/gio/gthreadedresolver.c @@ -202,6 +202,13 @@ free_records (GList *records) g_list_free_full (records, (GDestroyNotify) g_variant_unref); } +#if defined(G_OS_UNIX) +#ifdef __BIONIC__ +#define C_IN 1 +int res_query(const char *, int, int, u_char *, int); +#endif +#endif + static void do_lookup_records (GTask *task, gpointer source_object, diff --git a/gio/tests/gtlsconsoleinteraction.c b/gio/tests/gtlsconsoleinteraction.c index 717a83c5f..81e9119fc 100644 --- a/gio/tests/gtlsconsoleinteraction.c +++ b/gio/tests/gtlsconsoleinteraction.c @@ -40,8 +40,12 @@ G_DEFINE_TYPE (GTlsConsoleInteraction, g_tls_console_interaction, G_TYPE_TLS_INTERACTION); -#ifdef G_OS_WIN32 +#if defined(G_OS_WIN32) || defined(__BIONIC__) /* win32 doesn't have getpass() */ +#include +#ifndef BUFSIZ +#define BUFSIZ 8192 +#endif static gchar * getpass (const gchar *prompt) { @@ -53,7 +57,11 @@ getpass (const gchar *prompt) for (i = 0; i < BUFSIZ - 1; ++i) { +#ifdef __BIONIC__ + buf[i] = getc (stdin); +#else buf[i] = _getch (); +#endif if (buf[i] == '\r') break; } diff --git a/glib/galloca.h b/glib/galloca.h index 1ecdf65c0..a18a75cdd 100644 --- a/glib/galloca.h +++ b/glib/galloca.h @@ -33,7 +33,9 @@ #include -#ifdef __GNUC__ +#if defined(__BIONIC__) && defined (GLIB_HAVE_ALLOCA_H) +# include +#elif defined(__GNUC__) /* GCC does the right thing */ # undef alloca # define alloca(size) __builtin_alloca (size) diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 9d192a3bf..2e4f6ae13 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -703,7 +703,9 @@ g_ascii_strtod (const gchar *nptr, gchar *fail_pos; gdouble val; +#ifndef __BIONIC__ struct lconv *locale_data; +#endif const char *decimal_point; int decimal_point_len; const char *p, *decimal_point_pos; @@ -714,9 +716,14 @@ g_ascii_strtod (const gchar *nptr, fail_pos = NULL; +#ifndef __BIONIC__ locale_data = localeconv (); decimal_point = locale_data->decimal_point; decimal_point_len = strlen (decimal_point); +#else + decimal_point = "."; + decimal_point_len = 1; +#endif g_assert (decimal_point_len != 0); @@ -907,7 +914,9 @@ g_ascii_formatd (gchar *buffer, return buffer; #else +#ifndef __BIONIC__ struct lconv *locale_data; +#endif const char *decimal_point; int decimal_point_len; gchar *p; @@ -938,9 +947,14 @@ g_ascii_formatd (gchar *buffer, _g_snprintf (buffer, buf_len, format, d); +#ifndef __BIONIC__ locale_data = localeconv (); decimal_point = locale_data->decimal_point; decimal_point_len = strlen (decimal_point); +#else + decimal_point = "."; + decimal_point_len = 1; +#endif g_assert (decimal_point_len != 0); diff --git a/glib/gutils.c b/glib/gutils.c index 8997329bd..d0415604c 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -830,14 +830,19 @@ g_get_any_init_do (void) if (!pw) { +#ifndef __BIONIC__ setpwent (); +#endif pw = getpwuid (getuid ()); +#ifndef __BIONIC__ endpwent (); +#endif } if (pw) { g_user_name = g_strdup (pw->pw_name); +#ifndef __BIONIC__ if (pw->pw_gecos && *pw->pw_gecos != '\0') { gchar **gecos_fields; @@ -851,6 +856,7 @@ g_get_any_init_do (void) g_strfreev (gecos_fields); g_strfreev (name_parts); } +#endif if (!g_home_dir) g_home_dir = g_strdup (pw->pw_dir); diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c index 035b2a9e7..a606f17e8 100644 --- a/gmodule/gmodule-dl.c +++ b/gmodule/gmodule-dl.c @@ -113,7 +113,11 @@ _g_module_self (void) * are required on some systems. */ +#ifdef __BIONIC__ + handle = RTLD_DEFAULT; +#else handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY); +#endif if (!handle) g_module_set_error (fetch_dlerror (TRUE));