This is a series of patches to add support to Mono for building against
the Android NDK [0].  Android runs the Linux kernel, but moves many
things around compared to a "normal" desktop Linux distro.

These patches are based against the mono-2-6 branch.

This fourth patch patches mono/support so that it will properly build
and link under Android, largely because many POSIX functions aren't
present under Android (hence the numerous configure checks):

        * dirent.c, grp.c, macros.c, pwd.c, signal.c, sys-statvfs.c, sys-time.c,
          unistd.c: Add #if HAVE_XXX checks for functions which aren't
          provided on Android.

Permission to commit?

- Jon

[0] http://developer.android.com/sdk/ndk/index.html

Index: configure.in
===================================================================
--- configure.in	(revision 155735)
+++ configure.in	(working copy)
@@ -1564,6 +1564,7 @@
 	dnl *** Checks for MonoPosixHelper ***
 	dnl **********************************
 	AC_CHECK_HEADERS(checklist.h)
+	AC_CHECK_HEADERS(pathconf.h)
 	AC_CHECK_HEADERS(fstab.h)
 	AC_CHECK_HEADERS(attr/xattr.h)
 	AC_CHECK_HEADERS(sys/extattr.h)
@@ -1575,13 +1576,15 @@
 	AC_CHECK_HEADERS(sys/mman.h)
 	AC_CHECK_HEADERS(sys/param.h)
 	AC_CHECK_HEADERS(sys/mount.h)
+	AC_CHECK_FUNCS(confstr)
+	AC_CHECK_FUNCS(seekdir telldir)
 	AC_CHECK_FUNCS(getdomainname)
 	AC_CHECK_FUNCS(setdomainname)
-	AC_CHECK_FUNCS(fgetgrent)
-	AC_CHECK_FUNCS(fgetpwent)
-	AC_CHECK_FUNCS(fgetpwent)
+	AC_CHECK_FUNCS(endgrent getgrent fgetgrent setgrent)
+	AC_CHECK_FUNCS(setgroups)
+	AC_CHECK_FUNCS(endpwent getpwent fgetpwent setpwent)
 	AC_CHECK_FUNCS(getfsstat)
-	AC_CHECK_FUNCS(lutimes)
+	AC_CHECK_FUNCS(lutimes futimes)
 	AC_CHECK_FUNCS(mremap)
 	AC_CHECK_FUNCS(remap_file_pages)
 	AC_CHECK_FUNCS(posix_fadvise)
@@ -1589,7 +1592,8 @@
 	AC_CHECK_FUNCS(posix_madvise)
 	AC_CHECK_FUNCS(vsnprintf)
 	AC_CHECK_FUNCS(sendfile)
-	AC_CHECK_FUNCS(sethostid)
+	AC_CHECK_FUNCS(gethostid sethostid)
+	AC_CHECK_FUNCS(sethostname)
 	AC_CHECK_FUNCS(statfs)
 	AC_CHECK_FUNCS(fstatfs)
 	AC_CHECK_FUNCS(statvfs)
@@ -1597,6 +1601,11 @@
 	AC_CHECK_FUNCS(stime)
 	AC_CHECK_FUNCS(strerror_r)
 	AC_CHECK_FUNCS(ttyname_r)
+	AC_CHECK_FUNCS(psignal)
+	AC_CHECK_FUNCS(getlogin_r)
+	AC_CHECK_FUNCS(lockf)
+	AC_CHECK_FUNCS(swab)
+	AC_CHECK_FUNCS(setusershell endusershell)
 	AC_CHECK_SIZEOF(size_t)
 	AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
 		[#include <sys/types.h>
@@ -1632,6 +1641,14 @@
 		[struct dirent.d_off, struct dirent.d_reclen, struct dirent.d_type],,, 
 		[#include <sys/types.h>
 		 #include <dirent.h>])
+	AC_CHECK_MEMBERS(
+		[struct passwd.pw_gecos],,, 
+		[#include <sys/types.h>
+		 #include <pwd.h>])
+	AC_CHECK_MEMBERS(
+		[struct statfs.f_flags],,, 
+		[#include <sys/types.h>
+		 #include <sys/vfs.h>])
 
 	dnl Favour xattr through glibc, but use libattr if we have to
 	AC_CHECK_FUNC(lsetxattr, ,
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 155735)
+++ ChangeLog	(working copy)
@@ -1,3 +1,13 @@
+2010-04-19  Jonathan Pryor  <jpr...@novell.com>
+
+	* configure.in: Use AC_CHECK_LIB() to check for pthread instead of
+	  just blindly linking to -lpthread, as Android includes pthread
+	  support within libc and doesn't provide a separate libpthread.
+	  Add header, structure member, and function checks as Android doesn't
+	  provide all the headers, structure members, and functions that a
+	  "full" Linux distro includes.  Android provides <malloc.h>, so check
+	  for it and define HAVE_USR_INCLUDE_MALLOC_H when present.
+
 2010-04-19  Zoltan Varga  <var...@gmail.com>
 
 	* configure.in: Add a --enable-minimal=normalization option to disable support
Index: support/dirent.c
===================================================================
--- support/dirent.c	(revision 155735)
+++ support/dirent.c	(working copy)
@@ -29,6 +29,7 @@
 
 G_BEGIN_DECLS
 
+#if HAVE_SEEKDIR
 gint32
 Mono_Posix_Syscall_seekdir (void *dir, mph_off_t offset)
 {
@@ -38,12 +39,15 @@
 
 	return 0;
 }
+#endif  /* def HAVE_SEEKDIR */
 
+#if HAVE_TELLDIR
 mph_off_t
 Mono_Posix_Syscall_telldir (void *dir)
 {
 	return telldir ((DIR*) dir);
 }
+#endif  /* def HAVE_TELLDIR */
 
 static void
 copy_dirent (struct Mono_Posix_Syscall__Dirent *to, struct dirent *from)
Index: support/grp.c
===================================================================
--- support/grp.c	(revision 155735)
+++ support/grp.c	(working copy)
@@ -226,6 +226,7 @@
 }
 #endif /* ndef HAVE_GETGRGID_R */
 
+#if HAVE_GETGRENT
 gint32
 Mono_Posix_Syscall_getgrent (struct Mono_Posix_Syscall__Group *grbuf)
 {
@@ -247,6 +248,7 @@
 	}
 	return 0;
 }
+#endif  /* def HAVE_GETGRENT */
 
 #ifdef HAVE_FGETGRENT
 gint32
@@ -272,13 +274,16 @@
 }
 #endif /* ndef HAVE_FGETGRENT */
 
+#if HAVE_SETGROUPS
 gint32
 Mono_Posix_Syscall_setgroups (mph_size_t size, mph_gid_t *list)
 {
 	mph_return_if_size_t_overflow (size);
 	return setgroups ((size_t) size, list);
 }
+#endif  /* def HAVE_SETGROUPS */
 
+#if HAVE_SETGRENT
 int
 Mono_Posix_Syscall_setgrent (void)
 {
@@ -289,13 +294,16 @@
 	mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE);
 	return 0;
 }
+#endif  /* def HAVE_SETGRENT */
 
+#if HAVE_ENDGRENT
 int
 Mono_Posix_Syscall_endgrent (void)
 {
 	endgrent();
 	return 0;
 }
+#endif  /* def HAVE_ENDGRENT */
 
 
 G_END_DECLS
Index: support/ChangeLog
===================================================================
--- support/ChangeLog	(revision 155735)
+++ support/ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2010-04-19  Jonathan Pryor  <jpr...@novell.com>
+
+	* dirent.c, grp.c, macros.c, pwd.c, signal.c, sys-statvfs.c, sys-time.c,
+	  unistd.c: Add #if HAVE_XXX checks for functions which aren't
+	  provided on Android.
+
 2010-04-15  Jonathan Pryor  <jpr...@novell.com>
 
 	* Makefile.am: Revert previous linkage against libmono.so, as lupus
Index: support/sys-statvfs.c
===================================================================
--- support/sys-statvfs.c	(revision 155735)
+++ support/sys-statvfs.c	(working copy)
@@ -14,8 +14,14 @@
 #include "mph.h"
 #include "map.h"
 
+#ifdef HAVE_PATHCONF_H
+#include <pathconf.h>
+#endif
+
 #ifdef HAVE_SYS_STATVFS_H
 #include <sys/statvfs.h>
+#elif defined (HAVE_STATFS) || defined (HAVE_FSTATFS)
+#include <sys/vfs.h>
 #endif /* def HAVE_SYS_STATVFS_H */
 
 #ifdef HAVE_GETFSSTAT
@@ -142,8 +148,10 @@
 	// so this shouldn't lose anything.
 	memcpy (&to->f_fsid, &from->f_fsid, sizeof(to->f_fsid));
 
+#if HAVE_STRUCT_STATFS_F_FLAGS
 	if (Mono_Posix_ToMountFlags (from->f_flags, &to->f_flag) != 0)
 		return -1;
+#endif  /* def HAVE_STRUCT_STATFS_F_FLAGS */
 
 	return 0;
 }
@@ -165,9 +173,11 @@
 	// so this shouldn't lose anything.
 	memcpy (&to->f_fsid, &from->f_fsid, sizeof(to->f_fsid));
 
+#if HAVE_STRUCT_STATFS_F_FLAGS
 	if (Mono_Posix_FromMountFlags (from->f_flag, &flag) != 0)
 		return -1;
 	to->f_flags = flag;
+#endif  /* def HAVE_STRUCT_STATFS_F_FLAGS */
 
 	return 0;
 }
Index: support/unistd.c
===================================================================
--- support/unistd.c	(revision 155735)
+++ support/unistd.c	(working copy)
@@ -116,6 +116,7 @@
 	return sysconf (name);
 }
 
+#if HAVE_CONFSTR
 mph_size_t
 Mono_Posix_Syscall_confstr (int name, char *buf, mph_size_t len)
 {
@@ -124,6 +125,7 @@
 		return -1;
 	return confstr (name, buf, (size_t) len);
 }
+#endif  /* def HAVE_CONFSTR */
 
 #ifdef HAVE_TTYNAME_R
 gint32
@@ -145,12 +147,14 @@
 	return r;
 }
 
+#if HAVE_GETLOGIN_R
 gint32
 Mono_Posix_Syscall_getlogin_r (char *buf, mph_size_t len)
 {
 	mph_return_if_size_t_overflow (len);
 	return getlogin_r (buf, (size_t) len);
 }
+#endif  /* def HAVE_GETLOGIN_R */
 
 gint32
 Mono_Posix_Syscall_gethostname (char *buf, mph_size_t len)
@@ -159,18 +163,22 @@
 	return gethostname (buf, (size_t) len);
 }
 
+#if HAVE_SETHOSTNAME
 gint32
 Mono_Posix_Syscall_sethostname (const char *name, mph_size_t len)
 {
 	mph_return_if_size_t_overflow (len);
 	return sethostname (name, (size_t) len);
 }
+#endif  /* def HAVE_SETHOSTNAME */
 
+#if HAVE_GETHOSTID
 gint64
 Mono_Posix_Syscall_gethostid (void)
 {
 	return gethostid ();
 }
+#endif  /* def HAVE_GETHOSTID */
 
 #ifdef HAVE_SETHOSTID
 gint32
@@ -204,12 +212,17 @@
 }
 #endif /* def HAVE_SETDOMAINNAME */
 
+/* Android implements truncate, but doesn't declare it.
+ * Result is a warning during compilation, so skip it.
+ */
+#ifndef PLATFORM_ANDROID
 gint32
 Mono_Posix_Syscall_truncate (const char *path, mph_off_t length)
 {
 	mph_return_if_off_t_overflow (length);
 	return truncate (path, (off_t) length);
 }
+#endif
 
 gint32
 Mono_Posix_Syscall_ftruncate (int fd, mph_off_t length)
@@ -218,6 +231,7 @@
 	return ftruncate (fd, (off_t) length);
 }
 
+#if HAVE_LOCKF
 gint32
 Mono_Posix_Syscall_lockf (int fd, int cmd, mph_off_t len)
 {
@@ -226,7 +240,9 @@
 		return -1;
 	return lockf (fd, cmd, (off_t) len);
 }
+#endif  /* def HAVE_LOCKF */
 
+#if HAVE_SWAB
 int
 Mono_Posix_Syscall_swab (void *from, void *to, mph_ssize_t n)
 {
@@ -235,20 +251,25 @@
 	swab (from, to, (ssize_t) n);
 	return 0;
 }
+#endif  /* def HAVE_SWAB */
 
+#if HAVE_SETUSERSHELL
 int
 Mono_Posix_Syscall_setusershell (void)
 {
 	setusershell ();
 	return 0;
 }
+#endif  /* def HAVE_SETUSERSHELL */
 
+#if HAVE_ENDUSERSHELL
 int
 Mono_Posix_Syscall_endusershell (void)
 {
 	endusershell ();
 	return 0;
 }
+#endif  /* def HAVE_ENDUSERSHELL */
 
 int
 Mono_Posix_Syscall_sync (void)
Index: support/sys-time.c
===================================================================
--- support/sys-time.c	(revision 155735)
+++ support/sys-time.c	(working copy)
@@ -124,6 +124,7 @@
 }
 #endif /* def HAVE_LUTIMES */
 
+#if HAVE_FUTIMES
 gint32
 Mono_Posix_Syscall_futimes(int fd, struct Mono_Posix_Timeval *tv)
 {
@@ -134,6 +135,7 @@
 
 	return futimes (fd, ptv);
 }
+#endif  /* def HAVE_FUTIMES */
 
 G_END_DECLS
 
Index: support/signal.c
===================================================================
--- support/signal.c	(revision 155735)
+++ support/signal.c	(working copy)
@@ -120,6 +120,7 @@
 	#define mph_int_set(p,o,n) do { *(p) = n; } while (0)
 #endif
 
+#if HAVE_PSIGNAL
 int
 Mono_Posix_Syscall_psignal (int sig, const char* s)
 {
@@ -127,6 +128,7 @@
 	psignal (sig, s);
 	return errno == 0 ? 0 : -1;
 }
+#endif  /* def HAVE_PSIGNAL */
 
 #define NUM_SIGNALS 64
 static signal_info signals[NUM_SIGNALS];
Index: support/macros.c
===================================================================
--- support/macros.c	(revision 155735)
+++ support/macros.c	(working copy)
@@ -99,6 +99,7 @@
 	return strdup (e->d_name);
 }
 
+#if HAVE_GETPWNAM_R
 int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid,
 	char **account,
 	char **password,
@@ -145,3 +146,5 @@
 
 	return 0;
 }
+#endif  /* def HAVE_GETPWNAM_R */
+
Index: support/pwd.c
===================================================================
--- support/pwd.c	(revision 155735)
+++ support/pwd.c	(working copy)
@@ -22,7 +22,9 @@
 passwd_offsets[] = {
 	MPH_STRING_OFFSET (struct passwd, pw_name,    MPH_STRING_OFFSET_PTR),
 	MPH_STRING_OFFSET (struct passwd, pw_passwd,  MPH_STRING_OFFSET_PTR),
+#if HAVE_STRUCT_PASSWD_PW_GECOS
 	MPH_STRING_OFFSET (struct passwd, pw_gecos,   MPH_STRING_OFFSET_PTR),
+#endif  /* def HAVE_STRUCT_PASSWD_PW_GECOS */
 	MPH_STRING_OFFSET (struct passwd, pw_dir,     MPH_STRING_OFFSET_PTR),
 	MPH_STRING_OFFSET (struct passwd, pw_shell,   MPH_STRING_OFFSET_PTR)
 };
@@ -31,7 +33,9 @@
 mph_passwd_offsets[] = {
 	MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_name,    MPH_STRING_OFFSET_PTR),
 	MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_passwd,  MPH_STRING_OFFSET_PTR),
+#if HAVE_STRUCT_PASSWD_PW_GECOS
 	MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_gecos,   MPH_STRING_OFFSET_PTR),
+#endif  /* def HAVE_STRUCT_PASSWD_PW_GECOS */
 	MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_dir,     MPH_STRING_OFFSET_PTR),
 	MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Passwd, pw_shell,   MPH_STRING_OFFSET_PTR)
 };
@@ -187,6 +191,7 @@
 }
 #endif /* ndef HAVE_GETPWUID_R */
 
+#if HAVE_GETPWENT
 gint32
 Mono_Posix_Syscall_getpwent (struct Mono_Posix_Syscall__Passwd *pwbuf)
 {
@@ -208,6 +213,7 @@
 	}
 	return 0;
 }
+#endif  /* def HAVE_GETPWENT */
 
 #ifdef HAVE_FGETPWENT
 gint32
@@ -233,6 +239,7 @@
 }
 #endif /* ndef HAVE_FGETPWENT */
 
+#if HAVE_SETPWENT
 int
 Mono_Posix_Syscall_setpwent (void)
 {
@@ -243,7 +250,9 @@
 	mph_return_if_val_in_list5(errno, EIO, EMFILE, ENFILE, ENOMEM, ERANGE);
 	return 0;
 }
+#endif  /* def HAVE_SETPWENT */
 
+#if HAVE_ENDPWENT
 int
 Mono_Posix_Syscall_endpwent (void)
 {
@@ -253,6 +262,7 @@
 		return -1;
 	return 0;
 }
+#endif  /* def HAVE_ENDPWENT */
 
 G_END_DECLS
 
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to