diff --git a/configure.ac b/configure.ac index 55d1c55b1..fdd3eeb16 100644 --- a/configure.ac +++ b/configure.ac @@ -166,6 +166,17 @@ esac AC_MSG_RESULT([$glib_native_win32]) +AC_MSG_CHECKING([for the Android]) +case $host in + *android*) + glib_native_android="yes" + ;; + *) + glib_native_android="no" + ;; +esac +AC_MSG_RESULT([$glib_native_android]) + AC_SUBST(LIB_EXE_MACHINE_FLAG) glib_have_carbon=no @@ -932,7 +943,7 @@ AC_CHECK_FUNCS(setlocale) # check additional type sizes AC_CHECK_SIZEOF(size_t) -dnl Try to figure out whether gsize, gssize should be long or int +dnl Try to figure out whether gsize should be long or int AC_MSG_CHECKING([for the appropriate definition for size_t]) case $ac_cv_sizeof_size_t in @@ -989,6 +1000,89 @@ int main () AC_MSG_RESULT(unsigned $glib_size_type) +AC_CHECK_SIZEOF(ssize_t) + +dnl Try to figure out whether gssize should be long or int +AC_MSG_CHECKING([for the appropriate definition for ssize_t]) + +case $ac_cv_sizeof_ssize_t in + $ac_cv_sizeof_short) + glib_ssize_type=short + ;; + $ac_cv_sizeof_int) + glib_ssize_type=int + ;; + $ac_cv_sizeof_long) + glib_ssize_type=long + ;; + $ac_cv_sizeof_long_long) + glib_ssize_type='long long' + ;; + $ac_cv_sizeof__int64) + glib_ssize_type='__int64' + ;; + *) AC_MSG_ERROR([No type matching ssize_t in size]) + ;; +esac + +dnl If int/long are the same size, we see which one produces +dnl warnings when used in the location as ssize_t. (This matters +dnl on Android where ssize_t is long and size_t is unsigned int) +dnl +AS_IF([test $ac_cv_sizeof_ssize_t = $ac_cv_sizeof_int && + test $ac_cv_sizeof_ssize_t = $ac_cv_sizeof_long], [ + GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[ +#if defined(_AIX) && !defined(__GNUC__) +#pragma options langlvl=stdc89 +#endif +#include +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +int main () +{ + ssize_t s = 1; + int *size_int = &s; + return (int)*size_int; +} + ]])],glib_ssize_type=int, + [GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[ +#if defined(_AIX) && !defined(__GNUC__) +#pragma options langlvl=stdc89 +#endif +#include +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +int main () +{ + ssize_t s = 1; + long *size_long = &s; + return (int)*size_long; +} + ]])],glib_ssize_type=long)]) +]) + +AC_MSG_RESULT($glib_ssize_type) + # Check for some functions AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk memmem) AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid getresuid) @@ -1071,18 +1165,20 @@ AS_IF([test $glib_native_win32 = yes], [ AC_CHECK_HEADER([wspiapi.h], [WSPIAPI_INCLUDE="#include "]) AC_SUBST(WSPIAPI_INCLUDE) ], [ - AC_MSG_CHECKING([if arpa/nameser_compat.h is needed]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include - #include ], - [int qclass = C_IN;])], - [AC_MSG_RESULT([no])], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include - #include - #include ], - [int qclass = C_IN;])], - [AC_MSG_RESULT([yes]) - NAMESER_COMPAT_INCLUDE="#include "], - [AC_MSG_ERROR([could not compile test program either way])])]) + # Android does not have C_IN in public headers, we define it wherever necessary + AS_IF([test $glib_native_android != yes], [ + AC_MSG_CHECKING([if arpa/nameser_compat.h is needed]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include + #include ], + [int qclass = C_IN;])], + [AC_MSG_RESULT([no])], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include + #include + #include ], + [int qclass = C_IN;])], + [AC_MSG_RESULT([yes]) + NAMESER_COMPAT_INCLUDE="#include "], + [AC_MSG_ERROR([could not compile test program either way])])])]) AC_SUBST(NAMESER_COMPAT_INCLUDE) # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 @@ -1115,6 +1211,19 @@ AS_IF([test $glib_native_win32 = yes], [ AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket, [NETWORK_LIBS="-lsocket $NETWORK_LIBS"], [AC_MSG_ERROR(Could not find socket())])) + save_libs="$LIBS" + LIBS="$LIBS $NETWORK_LIBS" + AC_MSG_CHECKING([for res_init]) + AC_TRY_LINK([#include + #include + #include + #include + ],[ + res_init(); + ],[AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_RES_INIT, 1, [Define to 1 if you have the 'res_init' function.]) + ],[AC_MSG_RESULT([no])]) + LIBS="$save_libs" ]) AC_SUBST(NETWORK_LIBS) @@ -2340,6 +2449,9 @@ fi # b) FreeBSD doesn't do this either. # case $host in + *android*) + G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS" + ;; *-*-freebsd*|*-*-linux*) G_THREAD_LIBS_FOR_GTHREAD="`echo $G_THREAD_LIBS | sed s/-pthread/-lpthread/`" ;; @@ -2958,19 +3070,21 @@ _______EOF #define GLIB_SIZEOF_VOID_P $glib_void_p #define GLIB_SIZEOF_LONG $glib_long #define GLIB_SIZEOF_SIZE_T $glib_size_t +#define GLIB_SIZEOF_SSIZE_T $glib_ssize_t _______EOF cat >>$outfile <<_______EOF -typedef signed $glib_size_type_define gssize; +typedef signed $glib_ssize_type_define gssize; typedef unsigned $glib_size_type_define gsize; #define G_GSIZE_MODIFIER $gsize_modifier -#define G_GSSIZE_FORMAT $gssize_format +#define G_GSSIZE_MODIFIER $gssize_modifier #define G_GSIZE_FORMAT $gsize_format +#define G_GSSIZE_FORMAT $gssize_format #define G_MAXSIZE G_MAXU$glib_msize_type -#define G_MINSSIZE G_MIN$glib_msize_type -#define G_MAXSSIZE G_MAX$glib_msize_type +#define G_MINSSIZE G_MIN$glib_mssize_type +#define G_MAXSSIZE G_MAX$glib_mssize_type typedef gint64 goffset; #define G_MINOFFSET G_MININT64 @@ -3136,9 +3250,9 @@ _______EOF #define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val)) #define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val)) #define GSIZE_TO_LE(val) ((gsize) GUINT${gsizebits}_TO_LE (val)) -#define GSSIZE_TO_LE(val) ((gssize) GINT${gsizebits}_TO_LE (val)) +#define GSSIZE_TO_LE(val) ((gssize) GINT${gssizebits}_TO_LE (val)) #define GSIZE_TO_BE(val) ((gsize) GUINT${gsizebits}_TO_BE (val)) -#define GSSIZE_TO_BE(val) ((gssize) GINT${gsizebits}_TO_BE (val)) +#define GSSIZE_TO_BE(val) ((gssize) GINT${gssizebits}_TO_BE (val)) #define G_BYTE_ORDER $g_byte_order #define GLIB_SYSDEF_POLLIN =$g_pollin @@ -3298,7 +3412,9 @@ $ac_cv_sizeof___int64) ;; esac glib_size_t=$ac_cv_sizeof_size_t +glib_ssize_t=$ac_cv_sizeof_ssize_t glib_size_type_define="$glib_size_type" +glib_ssize_type_define="$glib_ssize_type" glib_void_p=$ac_cv_sizeof_void_p glib_long=$ac_cv_sizeof_long @@ -3306,32 +3422,52 @@ case "$glib_size_type" in short) gsize_modifier='"h"' gsize_format='"hu"' - gssize_format='"hi"' glib_msize_type='SHRT' ;; int) gsize_modifier='""' gsize_format='"u"' - gssize_format='"i"' glib_msize_type='INT' ;; long) gsize_modifier='"l"' gsize_format='"lu"' - gssize_format='"li"' glib_msize_type='LONG' ;; "long long"|__int64) gsize_modifier='"I64"' gsize_format='"I64u"' - gssize_format='"I64i"' glib_msize_type='INT64' ;; esac +case "$glib_ssize_type" in +short) + gssize_modifier='"h"' + gssize_format='"hi"' + glib_mssize_type='SHRT' + ;; +int) + gssize_modifier='""' + gssize_format='"i"' + glib_mssize_type='INT' + ;; +long) + gssize_modifier='"l"' + gssize_format='"li"' + glib_mssize_type='LONG' + ;; +"long long"|__int64) + gssize_modifier='"I64"' + gssize_format='"I64i"' + glib_mssize_type='INT64' + ;; +esac + gintbits=`expr $ac_cv_sizeof_int \* 8` glongbits=`expr $ac_cv_sizeof_long \* 8` gsizebits=`expr $ac_cv_sizeof_size_t \* 8` +gssizebits=`expr $ac_cv_sizeof_ssize_t \* 8` case $ac_cv_sizeof_void_p in $ac_cv_sizeof_int) diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index 92bd35fac..d7a744f80 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -1098,6 +1098,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) @@ -1107,6 +1108,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 5549e4fd2..26d334a10 100644 --- a/gio/gresolver.c +++ b/gio/gresolver.c @@ -244,7 +244,9 @@ g_resolver_maybe_reload (GResolver *resolver) if (st.st_mtime != resolver->priv->resolv_conf_timestamp) { resolver->priv->resolv_conf_timestamp = st.st_mtime; +#ifdef HAVE_RES_INIT res_init (); +#endif g_signal_emit (resolver, signals[RELOAD], 0); } } diff --git a/gio/gthreadedresolver.c b/gio/gthreadedresolver.c index 2332adf4a..37f930cfc 100644 --- a/gio/gthreadedresolver.c +++ b/gio/gthreadedresolver.c @@ -246,6 +246,142 @@ lookup_by_address_finish (GResolver *resolver, #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 /* __BIONIC__ */ + static GVariant * parse_res_srv (guchar *answer, guchar *end, @@ -655,6 +791,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..7e1ed49de 100644 --- a/gio/tests/gtlsconsoleinteraction.c +++ b/gio/tests/gtlsconsoleinteraction.c @@ -23,10 +23,10 @@ #include "config.h" #include +#include #include #ifdef G_OS_WIN32 -#include #include #endif @@ -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 63c080fb1..8ece1b297 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/glib-unix.c b/glib/glib-unix.c index 26f1509e7..b1cade478 100644 --- a/glib/glib-unix.c +++ b/glib/glib-unix.c @@ -23,6 +23,11 @@ #include "config.h" +/* To make bionic export pipe2() */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + #include "glib-unix.h" #include "gmain-internal.h" diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 6fd2ebdf4..950923310 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 76f6c3444..4a4c1a5e8 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -743,14 +743,19 @@ g_get_user_database_entry (void) if (!pw) { +#ifndef __BIONIC__ setpwent (); +#endif pw = getpwuid (getuid ()); +#ifndef __BIONIC__ endpwent (); +#endif } if (pw) { e.user_name = g_strdup (pw->pw_name); +#ifndef __BIONIC__ if (pw->pw_gecos && *pw->pw_gecos != '\0') { gchar **gecos_fields; @@ -764,6 +769,7 @@ g_get_user_database_entry (void) g_strfreev (gecos_fields); g_strfreev (name_parts); } +#endif if (!e.home_dir) e.home_dir = g_strdup (pw->pw_dir); diff --git a/glib/tests/Makefile.am b/glib/tests/Makefile.am index d3fc0b0b8..f6ea5d28c 100644 --- a/glib/tests/Makefile.am +++ b/glib/tests/Makefile.am @@ -122,7 +122,7 @@ gtester-xmllint-check: # check testreport xml with xmllint if present check-am: gtester-xmllint-check -private_LDFLAGS = -pthread +private_LDFLAGS = @G_THREAD_LIBS@ endif 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));