Fredrik Fornwall
8 years ago
53 changed files with 11 additions and 5077 deletions
@ -1,35 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/dlfcn.h ./usr/include/dlfcn.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/dlfcn.h 2016-03-03 16:54:24.000000000 -0500
|
|||
+++ ./usr/include/dlfcn.h 2016-04-17 23:55:55.901040258 -0400
|
|||
@@ -49,22 +49,22 @@
|
|||
extern void* dlsym(void* handle, const char* symbol); |
|||
extern int dladdr(const void* addr, Dl_info *info); |
|||
|
|||
-enum {
|
|||
+/* Termux modification: Use #define for these instead of an enum
|
|||
+ to improve compatibility with ifdef checks. */
|
|||
#if defined(__LP64__) |
|||
- RTLD_NOW = 2,
|
|||
+# define RTLD_NOW 2
|
|||
#else |
|||
- RTLD_NOW = 0,
|
|||
+# define RTLD_NOW 0
|
|||
#endif |
|||
- RTLD_LAZY = 1,
|
|||
+#define RTLD_LAZY 1
|
|||
|
|||
- RTLD_LOCAL = 0,
|
|||
+# define RTLD_LOCAL 0
|
|||
#if defined(__LP64__) |
|||
- RTLD_GLOBAL = 0x00100,
|
|||
+# define RTLD_GLOBAL 0x00100
|
|||
#else |
|||
- RTLD_GLOBAL = 2,
|
|||
+# define RTLD_GLOBAL 2
|
|||
#endif |
|||
- RTLD_NOLOAD = 4,
|
|||
-};
|
|||
+#define RTLD_NOLOAD 4
|
|||
|
|||
#if defined (__LP64__) |
|||
#define RTLD_DEFAULT ((void*) 0) |
@ -1,17 +0,0 @@ |
|||
Avoid defining constants which causes at least dpkg build to think that |
|||
sync_file_range(2) is available - which it is not. |
|||
|
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/fcntl.h ./usr/include/fcntl.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/fcntl.h 2014-10-14 22:53:49.000000000 -0400
|
|||
+++ ./usr/include/fcntl.h 2014-12-16 05:51:38.371338608 -0500
|
|||
@@ -59,10 +59,6 @@
|
|||
#define SPLICE_F_MORE 4 |
|||
#define SPLICE_F_GIFT 8 |
|||
|
|||
-#define SYNC_FILE_RANGE_WAIT_BEFORE 1
|
|||
-#define SYNC_FILE_RANGE_WRITE 2
|
|||
-#define SYNC_FILE_RANGE_WAIT_AFTER 4
|
|||
-
|
|||
extern int creat(const char*, mode_t); |
|||
extern int creat64(const char*, mode_t); |
|||
extern int fallocate64(int, int, off64_t, off64_t); |
@ -1,24 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/grp.h ./usr/include/grp.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/grp.h 2014-10-14 22:53:49.000000000 -0400
|
|||
+++ ./usr/include/grp.h 2014-12-14 15:33:15.715243224 -0500
|
|||
@@ -54,13 +54,13 @@
|
|||
struct group *getgrgid(gid_t); |
|||
struct group *getgrnam(const char *); |
|||
#if __POSIX_VISIBLE >= 200112 || __XPG_VISIBLE |
|||
-struct group *getgrent(void);
|
|||
-void setgrent(void);
|
|||
-void endgrent(void);
|
|||
-int getgrgid_r(gid_t, struct group *, char *,
|
|||
- size_t, struct group **);
|
|||
-int getgrnam_r(const char *, struct group *, char *,
|
|||
- size_t, struct group **);
|
|||
+static struct group *getgrent(void) { return 0; }
|
|||
+static void setgrent(void) {}
|
|||
+static void endgrent(void) {}
|
|||
+static int getgrgid_r(gid_t gid, struct group * grp, char * buf,
|
|||
+ size_t buflen, struct group ** result) { *result = 0; return 0; }
|
|||
+static int getgrnam_r(const char * name, struct group * grp, char * buf,
|
|||
+ size_t buflen, struct group ** result) { *result = 0; return 0; }
|
|||
#endif |
|||
|
|||
int getgrouplist (const char *user, gid_t group, |
@ -1,18 +0,0 @@ |
|||
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/netinet/in.h.html: |
|||
|
|||
"The <netinet/in.h> header shall define the following types: |
|||
in_port_t |
|||
Equivalent to the type uint16_t as defined in <inttypes.h>" |
|||
|
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-19/arch-arm/usr/include/netinet/in.h ./usr/include/netinet/in.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-19/arch-arm/usr/include/netinet/in.h 2012-08-21 07:23:12.000000000 +0200
|
|||
+++ ./usr/include/netinet/in.h 2014-07-06 04:31:37.563233271 +0200
|
|||
@@ -41,6 +41,8 @@
|
|||
|
|||
#define INET_ADDRSTRLEN 16 |
|||
|
|||
+typedef uint16_t in_port_t;
|
|||
+
|
|||
extern int bindresvport (int sd, struct sockaddr_in *sin); |
|||
|
|||
static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; |
@ -1,18 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/linux/fcntl.h ./usr/include/linux/fcntl.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/linux/fcntl.h 2014-10-14 22:53:49.000000000 -0400
|
|||
+++ ./usr/include/linux/fcntl.h 2015-10-19 17:17:56.309373308 -0400
|
|||
@@ -41,6 +41,14 @@
|
|||
#define AT_SYMLINK_NOFOLLOW 0x100 |
|||
#define AT_REMOVEDIR 0x200 |
|||
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ |
|||
+
|
|||
+/* Termux patch: This flag is not supported on Android 6.0+, and should not
|
|||
+ be needed since there are not setuid binaries. Define AT_EACCESS to 0 to
|
|||
+ avoid packages defining their own AT_EACCESS (which e.g. coreutil does)
|
|||
+ since that will only result in errors. See:
|
|||
+ https://android.googlesource.com/platform/bionic/+/3577825%5E!/ */
|
|||
+#define AT_EACCESS 0
|
|||
+
|
|||
#define AT_SYMLINK_FOLLOW 0x400 |
|||
#define AT_NO_AUTOMOUNT 0x800 |
|||
#define AT_EMPTY_PATH 0x1000 |
@ -1,20 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/malloc.h ./usr/include/malloc.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/malloc.h 2016-09-29 14:42:26.000000000 +0200
|
|||
+++ ./usr/include/malloc.h 2017-01-19 02:48:15.961754659 +0100
|
|||
@@ -27,12 +27,12 @@
|
|||
|
|||
__BEGIN_DECLS |
|||
|
|||
-extern void* malloc(size_t byte_count) __mallocfunc __wur __attribute__((alloc_size(1)));
|
|||
-extern void* calloc(size_t item_count, size_t item_size) __mallocfunc __wur __attribute__((alloc_size(1,2)));
|
|||
-extern void* realloc(void* p, size_t byte_count) __wur __attribute__((alloc_size(2)));
|
|||
+extern void* malloc(size_t byte_count) __mallocfunc __wur;
|
|||
+extern void* calloc(size_t item_count, size_t item_size) __mallocfunc __wur;
|
|||
+extern void* realloc(void* p, size_t byte_count) __wur;
|
|||
extern void free(void* p); |
|||
|
|||
-extern void* memalign(size_t alignment, size_t byte_count) __mallocfunc __wur __attribute__((alloc_size(2)));
|
|||
+extern void* memalign(size_t alignment, size_t byte_count) __mallocfunc __wur;
|
|||
extern size_t malloc_usable_size(const void* p); |
|||
|
|||
#ifndef STRUCT_MALLINFO_DECLARED |
@ -1,41 +0,0 @@ |
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/paths.h 2016-10-09 16:37:54.394746195 +0530
|
|||
+++ ./usr/include/paths.h 2016-10-21 23:28:38.689411903 +0530
|
|||
@@ -33,12 +33,12 @@
|
|||
#define _PATHS_H_ |
|||
|
|||
/* Default search path. */ |
|||
-#define _PATH_DEFPATH "/usr/bin:/bin"
|
|||
+#define _PATH_DEFPATH "@TERMUX_PREFIX@/bin:@TERMUX_PREFIX@/bin/applets"
|
|||
/* All standard utilities path. */ |
|||
#define _PATH_STDPATH \ |
|||
- "/usr/bin:/bin:/usr/sbin:/sbin"
|
|||
+ _PATH_DEFPATH
|
|||
|
|||
-#define _PATH_BSHELL "/system/bin/sh"
|
|||
+#define _PATH_BSHELL "@TERMUX_PREFIX@/bin/sh"
|
|||
#define _PATH_CONSOLE "/dev/console" |
|||
#define _PATH_CSHELL "/bin/csh" |
|||
#define _PATH_DEVDB "/var/run/dev.db" |
|||
@@ -51,7 +51,7 @@
|
|||
#define _PATH_MAN "/usr/share/man" |
|||
#define _PATH_MEM "/dev/mem" |
|||
#define _PATH_MNTTAB "/etc/fstab" |
|||
-#define _PATH_MOUNTED "/etc/mtab"
|
|||
+#define _PATH_MOUNTED "/proc/mounts"
|
|||
#define _PATH_NOLOGIN "/etc/nologin" |
|||
#define _PATH_PRESERVE "/var/lib" |
|||
#define _PATH_RWHODIR "/var/spool/rwho" |
|||
@@ -66,9 +66,9 @@
|
|||
|
|||
/* Provide trailing slash, since mostly used for building pathnames. */ |
|||
#define _PATH_DEV "/dev/" |
|||
-#define _PATH_TMP "/tmp/"
|
|||
-#define _PATH_VARDB "/var/db/"
|
|||
-#define _PATH_VARRUN "/var/run/"
|
|||
-#define _PATH_VARTMP "/var/tmp/"
|
|||
+#define _PATH_TMP "@TERMUX_PREFIX@/tmp/"
|
|||
+#define _PATH_VARDB "@TERMUX_PREFIX@/var/db/"
|
|||
+#define _PATH_VARRUN "@TERMUX_PREFIX@/var/run/"
|
|||
+#define _PATH_VARTMP "@TERMUX_PREFIX@/var/tmp/"
|
|||
|
|||
#endif /* !_PATHS_H_ */ |
@ -1,68 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/pwd.h ./usr/include/pwd.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/pwd.h 2017-02-27 17:27:10.000000000 +0100
|
|||
+++ ./usr/include/pwd.h 2017-03-05 13:28:19.227658358 +0100
|
|||
@@ -65,6 +65,10 @@
|
|||
#include <sys/cdefs.h> |
|||
#include <sys/types.h> |
|||
|
|||
+/* For access() and realpath(): */
|
|||
+#include <unistd.h>
|
|||
+#include <stdlib.h>
|
|||
+
|
|||
#define _PATH_PASSWD "/etc/passwd" |
|||
#define _PATH_MASTERPASSWD "/etc/master.passwd" |
|||
#define _PATH_MASTERPASSWD_LOCK "/etc/ptmp" |
|||
@@ -119,7 +123,52 @@
|
|||
int getpwnam_r(const char*, struct passwd*, char*, size_t, struct passwd**); |
|||
int getpwuid_r(uid_t, struct passwd*, char*, size_t, struct passwd**); |
|||
|
|||
-void endpwent(void);
|
|||
+static void android_setup_pwd(struct passwd* pw) {
|
|||
+ static char realpath_buffer[4096/*PATH_MAX*/];
|
|||
+ char* result = realpath("@TERMUX_HOME@/.termux/shell", realpath_buffer);
|
|||
+ if (result == NULL || access(realpath_buffer, X_OK) == -1) {
|
|||
+ char const* bash_path = "@TERMUX_PREFIX@/bin/bash";
|
|||
+ if (access(bash_path, X_OK) != -1) pw->pw_shell = (char*) bash_path;
|
|||
+ else pw->pw_shell = "@TERMUX_PREFIX@/bin/sh";
|
|||
+ } else {
|
|||
+ pw->pw_shell = realpath_buffer;
|
|||
+ }
|
|||
+ pw->pw_dir = "@TERMUX_HOME@";
|
|||
+ pw->pw_passwd = "*";
|
|||
+#ifdef __LP64__
|
|||
+ pw->pw_gecos = ""; /* Avoid NULL field. */
|
|||
+#endif
|
|||
+}
|
|||
+
|
|||
+static struct passwd* android_polyfill_getpwuid(uid_t t) {
|
|||
+ struct passwd* pw = getpwuid(t);
|
|||
+ if (pw == NULL) return NULL;
|
|||
+ android_setup_pwd(pw);
|
|||
+ return pw;
|
|||
+}
|
|||
+
|
|||
+static struct passwd* android_polyfill_getpwnam(const char* name) {
|
|||
+ struct passwd* pw = getpwnam(name);
|
|||
+ if (pw == NULL) return NULL;
|
|||
+ android_setup_pwd(pw);
|
|||
+ return pw;
|
|||
+}
|
|||
+
|
|||
+static int android_polyfill_getpwuid_r(uid_t uid,
|
|||
+ struct passwd *pwd,
|
|||
+ char *buffer,
|
|||
+ size_t bufsize,
|
|||
+ struct passwd **result) {
|
|||
+ int ret = getpwuid_r(uid, pwd, buffer, bufsize, result);
|
|||
+ if (ret != 0) return ret;
|
|||
+ android_setup_pwd(pwd);
|
|||
+ return 0;
|
|||
+}
|
|||
+
|
|||
+#define getpwnam android_polyfill_getpwnam
|
|||
+#define getpwuid android_polyfill_getpwuid
|
|||
+#define getpwuid_r android_polyfill_getpwuid_r
|
|||
+static void endpwent(void) { /* Do nothing. */ }
|
|||
struct passwd* getpwent(void); |
|||
int setpwent(void); |
|||
|
@ -1,78 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/stdio.h ./usr/include/stdio.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/stdio.h 2016-03-03 16:54:24.000000000 -0500
|
|||
+++ ./usr/include/stdio.h 2016-04-11 06:54:22.893930847 -0400
|
|||
@@ -52,6 +52,10 @@
|
|||
#include <stdarg.h> |
|||
#include <stddef.h> |
|||
|
|||
+#include <string.h> /* For strcpy(3) used by ctermid() */
|
|||
+#include <asm/fcntl.h> /* For O_RDWR and other O_* constants */
|
|||
+#include <stdlib.h> /* For arc4random() */
|
|||
+
|
|||
#define __need_NULL |
|||
#include <stddef.h> |
|||
|
|||
@@ -193,7 +196,7 @@
|
|||
|
|||
/* System V/ANSI C; this is the wrong way to do this, do *not* use these. */ |
|||
#if __BSD_VISIBLE || __XPG_VISIBLE |
|||
-#define P_tmpdir "/tmp/"
|
|||
+#define P_tmpdir "@TERMUX_PREFIX@/tmp/"
|
|||
#endif |
|||
#define L_tmpnam 1024 /* XXX must be == PATH_MAX */ |
|||
#define TMP_MAX 308915776 |
|||
@@ -257,7 +260,6 @@
|
|||
int setvbuf(FILE * __restrict, char * __restrict, int, size_t); |
|||
int sscanf(const char * __restrict, const char * __restrict, ...) |
|||
__scanflike(2, 3); |
|||
-FILE *tmpfile(void);
|
|||
int ungetc(int, FILE *); |
|||
int vfprintf(FILE * __restrict, const char * __restrict, __va_list) |
|||
__printflike(2, 0); |
|||
@@ -371,6 +373,16 @@
|
|||
#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) |
|||
#endif /* __BSD_VISIBLE */ |
|||
|
|||
+/* Needed by gnulibs freading() */
|
|||
+#define __sferror(p) (((p)->_flags & __SERR) != 0)
|
|||
+
|
|||
+/* Used by perl, fish, and others */
|
|||
+static __inline__ char* ctermid(char* s) {
|
|||
+ if (s == 0) return (char*) "/dev/tty";
|
|||
+ strcpy(s, "/dev/tty");
|
|||
+ return s;
|
|||
+}
|
|||
+
|
|||
#if defined(__BIONIC_FORTIFY) |
|||
|
|||
__BEGIN_DECLS |
|||
@@ -462,4 +474,29 @@
|
|||
|
|||
#endif /* defined(__BIONIC_FORTIFY) */ |
|||
|
|||
+__BEGIN_DECLS
|
|||
+
|
|||
+extern int open(const char*, int, ...);
|
|||
+extern pid_t getpid();
|
|||
+extern int unlink(const char*);
|
|||
+static __inline__ FILE* tmpfile() {
|
|||
+ int p = getpid();
|
|||
+ char* path;
|
|||
+ int i;
|
|||
+ for (i = 0; i < 100; i++) {
|
|||
+ unsigned int r = arc4random();
|
|||
+ if (asprintf(&path, "@TERMUX_PREFIX@/tmp/tmpfile.%d-%u", p, r) == -1) return NULL;
|
|||
+ int fd = open(path, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE, 0600);
|
|||
+ free(path);
|
|||
+ if (fd >= 0) {
|
|||
+ FILE* result = fdopen(fd, "w+");
|
|||
+ unlink(path);
|
|||
+ return result;
|
|||
+ }
|
|||
+ }
|
|||
+ return NULL;
|
|||
+}
|
|||
+
|
|||
+__END_DECLS
|
|||
+
|
|||
#endif /* _STDIO_H_ */ |
@ -1,14 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/stdlib.h ./usr/include/stdlib.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/stdlib.h 2016-03-03 16:54:24.000000000 -0500
|
|||
+++ ./usr/include/stdlib.h 2016-03-22 16:38:58.589340159 -0400
|
|||
@@ -161,8 +161,8 @@
|
|||
extern int wctomb(char *, wchar_t); |
|||
extern size_t wcstombs(char *, const wchar_t *, size_t); |
|||
|
|||
-extern size_t __ctype_get_mb_cur_max(void);
|
|||
-#define MB_CUR_MAX __ctype_get_mb_cur_max()
|
|||
+/* Termux modification: Always utf-8. */
|
|||
+#define MB_CUR_MAX 4
|
|||
|
|||
__END_DECLS |
|||
|
@ -1,18 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/string.h ./usr/include/string.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/string.h 2014-12-02 22:38:31.000000000 -0500
|
|||
+++ ./usr/include/string.h 2015-05-08 23:00:18.591924680 -0400
|
|||
@@ -289,6 +289,14 @@
|
|||
|
|||
#endif /* defined(__BIONIC_FORTIFY) */ |
|||
|
|||
+/* Termux: Patched support for GNU extension function mempcpy(3): */
|
|||
+#if defined(_GNU_SOURCE) && defined(TERMUX_EXPOSE_MEMPCPY)
|
|||
+static void* mempcpy(void* dest, void const* src, size_t n)
|
|||
+{
|
|||
+ return memcpy(dest, src, n) + n;
|
|||
+}
|
|||
+#endif
|
|||
+
|
|||
__END_DECLS |
|||
|
|||
#endif /* _STRING_H_ */ |
@ -1,5 +0,0 @@ |
|||
diff -Nur /Users/fornwall/lib/android-ndk/platforms/android-18/arch-arm/usr/include/sys/fcntl.h ./usr/include/sys/fcntl.h
|
|||
--- /Users/fornwall/lib/android-ndk/platforms/android-18/arch-arm/usr/include/sys/fcntl.h 1970-01-01 01:00:00.000000000 +0100
|
|||
+++ ./usr/include/sys/fcntl.h 2014-01-27 08:44:34.000000000 +0100
|
|||
@@ -0,0 +1 @@
|
|||
+#include <fcntl.h>
|
@ -1,12 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/sys/limits.h ./usr/include/sys/limits.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/sys/limits.h 2016-09-29 14:42:26.000000000 -0400
|
|||
+++ ./usr/include/sys/limits.h 2017-01-07 01:23:19.004048281 -0500
|
|||
@@ -116,7 +116,7 @@
|
|||
/* Bionic-specific definitions */ |
|||
|
|||
#define _POSIX_VERSION 200112L /* Posix C language bindings version */ |
|||
-#define _POSIX2_VERSION -1 /* we don't support Posix command-line tools */
|
|||
+#define _POSIX2_VERSION 200809 /* Termux change to avoid coreutils obsolete breakage */
|
|||
#define _POSIX2_C_VERSION _POSIX_VERSION |
|||
#define _XOPEN_VERSION 500 /* by Posix definition */ |
|||
#define _XOPEN_XCU_VERSION -1 /* we don't support command-line utilities */ |
@ -1,22 +0,0 @@ |
|||
Mosh needs fd_set to be const*. And native code used by the nio4r gem (used by Rails 5) needs fd_mask. |
|||
|
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/select.h ./usr/include/sys/select.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/select.h 2014-10-14 22:53:49.000000000 -0400
|
|||
+++ ./usr/include/sys/select.h 2015-07-23 19:19:06.375287284 -0400
|
|||
@@ -38,6 +38,7 @@
|
|||
__BEGIN_DECLS |
|||
|
|||
#define FD_SETSIZE 1024 |
|||
+typedef unsigned long fd_mask;
|
|||
#define NFDBITS (8 * sizeof(unsigned long)) |
|||
#define __FDSET_LONGS (FD_SETSIZE/NFDBITS) |
|||
|
|||
@@ -54,7 +55,7 @@
|
|||
#if defined(__BIONIC_FORTIFY) |
|||
extern void __FD_CLR_chk(int, fd_set*, size_t); |
|||
extern void __FD_SET_chk(int, fd_set*, size_t); |
|||
-extern int __FD_ISSET_chk(int, fd_set*, size_t);
|
|||
+extern int __FD_ISSET_chk(int, fd_set const*, size_t);
|
|||
#define FD_CLR(fd, set) __FD_CLR_chk(fd, set, __bos(set)) |
|||
#define FD_SET(fd, set) __FD_SET_chk(fd, set, __bos(set)) |
|||
#define FD_ISSET(fd, set) __FD_ISSET_chk(fd, set, __bos(set)) |
@ -1,13 +0,0 @@ |
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/stat.h 2016-10-12 15:11:58.000000000 +0530
|
|||
+++ ./usr/include/sys/stat.h 2016-12-03 21:17:42.104829064 +0530
|
|||
@@ -136,6 +136,10 @@
|
|||
#define st_mtimensec st_mtime_nsec |
|||
#define st_ctimensec st_ctime_nsec |
|||
|
|||
+#define S_IREAD S_IRUSR
|
|||
+#define S_IWRITE S_IWUSR
|
|||
+#define S_IEXEC S_IXUSR
|
|||
+
|
|||
#ifdef __USE_BSD |
|||
/* Permission macros provided by glibc for compatibility with BSDs. */ |
|||
#define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO) /* 0777 */ |
@ -1,17 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/wait.h ./usr/include/sys/wait.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/wait.h 2014-10-14 22:53:49.000000000 -0400
|
|||
+++ ./usr/include/sys/wait.h 2015-08-06 18:52:27.784988266 -0400
|
|||
@@ -44,10 +44,13 @@
|
|||
#define WIFEXITED(s) (WTERMSIG(s) == 0) |
|||
#define WIFSTOPPED(s) (WTERMSIG(s) == 0x7f) |
|||
#define WIFSIGNALED(s) (WTERMSIG((s)+1) >= 2) |
|||
+#define WIFCONTINUED(s) ((s) == 0xffff)
|
|||
|
|||
extern pid_t wait(int *); |
|||
extern pid_t waitpid(pid_t, int *, int); |
|||
extern pid_t wait4(pid_t, int *, int, struct rusage *); |
|||
+/* Termux addition: Add wait3() declaration used by busybox. Available in libc for 32-bit only. */
|
|||
+static pid_t wait3(int* status, int options, struct rusage* rusage) { return wait4(-1, status, options, rusage); }
|
|||
|
|||
/* Posix states that idtype_t should be an enumeration type, but |
|||
* the kernel headers define P_ALL, P_PID and P_PGID as constant macros |
@ -1,111 +0,0 @@ |
|||
Add <arpa/ftp.h> for some ftp defines which some packages needs. |
|||
|
|||
diff -Nur /Users/fornwall/lib/android-ndk/platforms/android-18/arch-arm/usr/include/arpa/ftp.h ./usr/include/arpa/ftp.h
|
|||
--- /Users/fornwall/lib/android-ndk/platforms/android-18/arch-arm/usr/include/arpa/ftp.h 1970-01-01 01:00:00.000000000 +0100
|
|||
+++ ./usr/include/arpa/ftp.h 2014-02-07 02:07:52.000000000 +0100
|
|||
@@ -0,0 +1,105 @@
|
|||
+/*
|
|||
+ * Copyright (c) 1983, 1989, 1993
|
|||
+ * The Regents of the University of California. All rights reserved.
|
|||
+ *
|
|||
+ * Redistribution and use in source and binary forms, with or without
|
|||
+ * modification, are permitted provided that the following conditions
|
|||
+ * are met:
|
|||
+ * 1. Redistributions of source code must retain the above copyright
|
|||
+ * notice, this list of conditions and the following disclaimer.
|
|||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|||
+ * notice, this list of conditions and the following disclaimer in the
|
|||
+ * documentation and/or other materials provided with the distribution.
|
|||
+ * 4. Neither the name of the University nor the names of its contributors
|
|||
+ * may be used to endorse or promote products derived from this software
|
|||
+ * without specific prior written permission.
|
|||
+ *
|
|||
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|||
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|||
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|||
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|||
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|||
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|||
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|||
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|||
+ * SUCH DAMAGE.
|
|||
+ *
|
|||
+ * @(#)ftp.h 8.1 (Berkeley) 6/2/93
|
|||
+ */
|
|||
+
|
|||
+#ifndef _ARPA_FTP_H
|
|||
+#define _ARPA_FTP_H 1
|
|||
+
|
|||
+/* Definitions for FTP; see RFC-765. */
|
|||
+
|
|||
+/*
|
|||
+ * Reply codes.
|
|||
+ */
|
|||
+#define PRELIM 1 /* positive preliminary */
|
|||
+#define COMPLETE 2 /* positive completion */
|
|||
+#define CONTINUE 3 /* positive intermediate */
|
|||
+#define TRANSIENT 4 /* transient negative completion */
|
|||
+#define ERROR 5 /* permanent negative completion */
|
|||
+
|
|||
+/*
|
|||
+ * Type codes
|
|||
+ */
|
|||
+#define TYPE_A 1 /* ASCII */
|
|||
+#define TYPE_E 2 /* EBCDIC */
|
|||
+#define TYPE_I 3 /* image */
|
|||
+#define TYPE_L 4 /* local byte size */
|
|||
+
|
|||
+#ifdef FTP_NAMES
|
|||
+char *typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local" };
|
|||
+#endif
|
|||
+
|
|||
+/*
|
|||
+ * Form codes
|
|||
+ */
|
|||
+#define FORM_N 1 /* non-print */
|
|||
+#define FORM_T 2 /* telnet format effectors */
|
|||
+#define FORM_C 3 /* carriage control (ASA) */
|
|||
+#ifdef FTP_NAMES
|
|||
+char *formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control" };
|
|||
+#endif
|
|||
+
|
|||
+/*
|
|||
+ * Structure codes
|
|||
+ */
|
|||
+#define STRU_F 1 /* file (no record structure) */
|
|||
+#define STRU_R 2 /* record structure */
|
|||
+#define STRU_P 3 /* page structure */
|
|||
+#ifdef FTP_NAMES
|
|||
+char *strunames[] = {"0", "File", "Record", "Page" };
|
|||
+#endif
|
|||
+
|
|||
+/*
|
|||
+ * Mode types
|
|||
+ */
|
|||
+#define MODE_S 1 /* stream */
|
|||
+#define MODE_B 2 /* block */
|
|||
+#define MODE_C 3 /* compressed */
|
|||
+#ifdef FTP_NAMES
|
|||
+char *modenames[] = {"0", "Stream", "Block", "Compressed" };
|
|||
+#endif
|
|||
+
|
|||
+/*
|
|||
+ * Record Tokens
|
|||
+ */
|
|||
+#define REC_ESC '\377' /* Record-mode Escape */
|
|||
+#define REC_EOR '\001' /* Record-mode End-of-Record */
|
|||
+#define REC_EOF '\002' /* Record-mode End-of-File */
|
|||
+
|
|||
+/*
|
|||
+ * Block Header
|
|||
+ */
|
|||
+#define BLK_EOR 0x80 /* Block is End-of-Record */
|
|||
+#define BLK_EOF 0x40 /* Block is End-of-File */
|
|||
+#define BLK_ERRORS 0x20 /* Block is suspected of containing errors */
|
|||
+#define BLK_RESTART 0x10 /* Block is Restart Marker */
|
|||
+
|
|||
+#define BLK_BYTECOUNT 2 /* Bytes in this block */
|
|||
+
|
|||
+#endif /* arpa/ftp.h */
|
@ -1,88 +0,0 @@ |
|||
The <arpa/tftp.h> header is needed by inetutils. |
|||
|
|||
diff -N -a -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/arpa/tftp.h ./usr/include/arpa/tftp.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/arpa/tftp.h 1969-12-31 19:00:00.000000000 -0500
|
|||
+++ ./usr/include/arpa/tftp.h 2015-05-12 15:40:31.648145474 -0400
|
|||
@@ -0,0 +1,82 @@
|
|||
+/*
|
|||
+ * Copyright (c) 1983, 1993
|
|||
+ * The Regents of the University of California. All rights reserved.
|
|||
+ *
|
|||
+ * Redistribution and use in source and binary forms, with or without
|
|||
+ * modification, are permitted provided that the following conditions
|
|||
+ * are met:
|
|||
+ * 1. Redistributions of source code must retain the above copyright
|
|||
+ * notice, this list of conditions and the following disclaimer.
|
|||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|||
+ * notice, this list of conditions and the following disclaimer in the
|
|||
+ * documentation and/or other materials provided with the distribution.
|
|||
+ * 4. Neither the name of the University nor the names of its contributors
|
|||
+ * may be used to endorse or promote products derived from this software
|
|||
+ * without specific prior written permission.
|
|||
+ *
|
|||
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|||
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|||
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|||
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|||
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|||
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|||
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|||
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|||
+ * SUCH DAMAGE.
|
|||
+ *
|
|||
+ * @(#)tftp.h 8.1 (Berkeley) 6/2/93
|
|||
+ */
|
|||
+
|
|||
+#ifndef _ARPA_TFTP_H
|
|||
+#define _ARPA_TFTP_H 1
|
|||
+
|
|||
+/*
|
|||
+ * Trivial File Transfer Protocol (IEN-133)
|
|||
+ */
|
|||
+#define SEGSIZE 512 /* data segment size */
|
|||
+
|
|||
+/*
|
|||
+ * Packet types.
|
|||
+ */
|
|||
+#define RRQ 01 /* read request */
|
|||
+#define WRQ 02 /* write request */
|
|||
+#define DATA 03 /* data packet */
|
|||
+#define ACK 04 /* acknowledgement */
|
|||
+#define ERROR 05 /* error code */
|
|||
+
|
|||
+struct tftphdr {
|
|||
+ short th_opcode; /* packet type */
|
|||
+ union {
|
|||
+ char tu_padding[3]; /* sizeof() compat */
|
|||
+ struct {
|
|||
+ union {
|
|||
+ unsigned short tu_block; /* block # */
|
|||
+ short tu_code; /* error code */
|
|||
+ } __attribute__ ((__packed__)) th_u3;
|
|||
+ char tu_data[0]; /* data or error string */
|
|||
+ } __attribute__ ((__packed__)) th_u2;
|
|||
+ char tu_stuff[0]; /* request packet stuff */
|
|||
+ } __attribute__ ((__packed__)) th_u1;
|
|||
+} __attribute__ ((__packed__));
|
|||
+
|
|||
+#define th_block th_u1.th_u2.th_u3.tu_block
|
|||
+#define th_code th_u1.th_u2.th_u3.tu_code
|
|||
+#define th_stuff th_u1.tu_stuff
|
|||
+#define th_data th_u1.th_u2.tu_data
|
|||
+#define th_msg th_u1.th_u2.tu_data
|
|||
+
|
|||
+/*
|
|||
+ * Error codes.
|
|||
+ */
|
|||
+#define EUNDEF 0 /* not defined */
|
|||
+#define ENOTFOUND 1 /* file not found */
|
|||
+#define EACCESS 2 /* access violation */
|
|||
+#define ENOSPACE 3 /* disk full or allocation exceeded */
|
|||
+#define EBADOP 4 /* illegal TFTP operation */
|
|||
+#define EBADID 5 /* unknown transfer ID */
|
|||
+#define EEXISTS 6 /* file already exists */
|
|||
+#define ENOUSER 7 /* no such user */
|
|||
+
|
|||
+#endif /* arpa/tftp.h */
|
File diff suppressed because it is too large
@ -1,607 +0,0 @@ |
|||
/*
|
|||
* Copyright (c) 1995, 1999 |
|||
* Berkeley Software Design, Inc. All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions |
|||
* are met: |
|||
* 1. Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
* ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE |
|||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|||
* SUCH DAMAGE. |
|||
* |
|||
* BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp |
|||
*/ |
|||
/*
|
|||
Copyright (c) 2013, Kenneth MacKay |
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, |
|||
are permitted provided that the following conditions are met: |
|||
* Redistributions of source code must retain the above copyright notice, this |
|||
list of conditions and the following disclaimer. |
|||
* Redistributions in binary form must reproduce the above copyright notice, |
|||
this list of conditions and the following disclaimer in the documentation |
|||
and/or other materials provided with the distribution. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
|||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
|||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifndef _IFADDRS_H_ |
|||
#define _IFADDRS_H_ |
|||
|
|||
struct ifaddrs { |
|||
struct ifaddrs *ifa_next; |
|||
char *ifa_name; |
|||
unsigned int ifa_flags; |
|||
struct sockaddr *ifa_addr; |
|||
struct sockaddr *ifa_netmask; |
|||
struct sockaddr *ifa_dstaddr; |
|||
void *ifa_data; |
|||
}; |
|||
|
|||
/*
|
|||
* This may have been defined in <net/if.h>. Note that if <net/if.h> is |
|||
* to be included it must be included before this header file. |
|||
*/ |
|||
#ifndef ifa_broadaddr |
|||
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ |
|||
#endif |
|||
|
|||
#include <sys/cdefs.h> |
|||
|
|||
__BEGIN_DECLS |
|||
static int getifaddrs(struct ifaddrs **ifap); |
|||
static void freeifaddrs(struct ifaddrs *ifa); |
|||
__END_DECLS |
|||
|
|||
#endif |
|||
|
|||
|
|||
#include <string.h> |
|||
#include <stdlib.h> |
|||
#include <stddef.h> |
|||
#include <errno.h> |
|||
#include <unistd.h> |
|||
#include <sys/socket.h> |
|||
#include <netpacket/packet.h> |
|||
#include <net/if_arp.h> |
|||
#include <netinet/in.h> |
|||
#include <linux/netlink.h> |
|||
#include <linux/rtnetlink.h> |
|||
|
|||
typedef struct NetlinkList { |
|||
struct NetlinkList *m_next; |
|||
struct nlmsghdr *m_data; |
|||
unsigned int m_size; |
|||
} NetlinkList; |
|||
|
|||
static int netlink_socket(void) |
|||
{ |
|||
int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); |
|||
if (l_socket < 0) return -1; |
|||
|
|||
struct sockaddr_nl l_addr; |
|||
memset(&l_addr, 0, sizeof(l_addr)); |
|||
l_addr.nl_family = AF_NETLINK; |
|||
if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) { |
|||
close(l_socket); |
|||
return -1; |
|||
} |
|||
|
|||
return l_socket; |
|||
} |
|||
|
|||
static int netlink_send(int p_socket, int p_request) |
|||
{ |
|||
struct { |
|||
struct nlmsghdr m_hdr; |
|||
struct rtgenmsg m_msg; |
|||
} l_data; |
|||
|
|||
memset(&l_data, 0, sizeof(l_data)); |
|||
|
|||
l_data.m_hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)); |
|||
l_data.m_hdr.nlmsg_type = p_request; |
|||
l_data.m_hdr.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; |
|||
l_data.m_hdr.nlmsg_pid = 0; |
|||
l_data.m_hdr.nlmsg_seq = p_socket; |
|||
l_data.m_msg.rtgen_family = AF_UNSPEC; |
|||
|
|||
struct sockaddr_nl l_addr; |
|||
memset(&l_addr, 0, sizeof(l_addr)); |
|||
l_addr.nl_family = AF_NETLINK; |
|||
return (sendto(p_socket, &l_data.m_hdr, l_data.m_hdr.nlmsg_len, 0, (struct sockaddr *)&l_addr, sizeof(l_addr))); |
|||
} |
|||
|
|||
static int netlink_recv(int p_socket, void *p_buffer, size_t p_len) |
|||
{ |
|||
struct msghdr l_msg; |
|||
struct iovec l_iov = { p_buffer, p_len }; |
|||
struct sockaddr_nl l_addr; |
|||
|
|||
for (;;) { |
|||
l_msg.msg_name = (void *)&l_addr; |
|||
l_msg.msg_namelen = sizeof(l_addr); |
|||
l_msg.msg_iov = &l_iov; |
|||
l_msg.msg_iovlen = 1; |
|||
l_msg.msg_control = NULL; |
|||
l_msg.msg_controllen = 0; |
|||
l_msg.msg_flags = 0; |
|||
int l_result = recvmsg(p_socket, &l_msg, 0); |
|||
|
|||
if (l_result < 0) { |
|||
if (errno == EINTR) { |
|||
continue; |
|||
} |
|||
return -2; |
|||
} |
|||
|
|||
if (l_msg.msg_flags & MSG_TRUNC) { |
|||
/* Buffer was too small. */ |
|||
return -1; |
|||
} |
|||
return l_result; |
|||
} |
|||
} |
|||
|
|||
static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done) |
|||
{ |
|||
size_t l_size = 4096; |
|||
void *l_buffer = NULL; |
|||
|
|||
for(;;) { |
|||
free(l_buffer); |
|||
l_buffer = malloc(l_size); |
|||
if (l_buffer == NULL) return NULL; |
|||
|
|||
int l_read = netlink_recv(p_socket, l_buffer, l_size); |
|||
*p_size = l_read; |
|||
if (l_read == -2) { |
|||
free(l_buffer); |
|||
return NULL; |
|||
} |
|||
if (l_read >= 0) { |
|||
pid_t l_pid = getpid(); |
|||
struct nlmsghdr *l_hdr; |
|||
for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) { |
|||
if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) continue; |
|||
|
|||
if(l_hdr->nlmsg_type == NLMSG_DONE) { |
|||
*p_done = 1; |
|||
break; |
|||
} |
|||
|
|||
if(l_hdr->nlmsg_type == NLMSG_ERROR) { |
|||
free(l_buffer); |
|||
return NULL; |
|||
} |
|||
} |
|||
return (struct nlmsghdr*)l_buffer; |
|||
} |
|||
|
|||
l_size *= 2; |
|||
} |
|||
} |
|||
|
|||
static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size) |
|||
{ |
|||
NetlinkList *l_item = (NetlinkList*)malloc(sizeof(NetlinkList)); |
|||
if (l_item == NULL) return NULL; |
|||
|
|||
l_item->m_next = NULL; |
|||
l_item->m_data = p_data; |
|||
l_item->m_size = p_size; |
|||
return l_item; |
|||
} |
|||
|
|||
static void freeResultList(NetlinkList *p_list) |
|||
{ |
|||
NetlinkList *l_cur; |
|||
while (p_list) { |
|||
l_cur = p_list; |
|||
p_list = p_list->m_next; |
|||
free(l_cur->m_data); |
|||
free(l_cur); |
|||
} |
|||
} |
|||
|
|||
static NetlinkList *getResultList(int p_socket, int p_request) |
|||
{ |
|||
if (netlink_send(p_socket, p_request) < 0) return NULL; |
|||
|
|||
NetlinkList *l_list = NULL; |
|||
NetlinkList *l_end = NULL; |
|||
int l_size; |
|||
int l_done = 0; |
|||
while (!l_done) { |
|||
struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done); |
|||
if (!l_hdr) { |
|||
freeResultList(l_list); |
|||
return NULL; |
|||
} |
|||
|
|||
NetlinkList *l_item = newListItem(l_hdr, l_size); |
|||
if (!l_item) { |
|||
freeResultList(l_list); |
|||
return NULL; |
|||
} |
|||
if (!l_list) { |
|||
l_list = l_item; |
|||
} else { |
|||
l_end->m_next = l_item; |
|||
} |
|||
l_end = l_item; |
|||
} |
|||
return l_list; |
|||
} |
|||
|
|||
static size_t maxSize(size_t a, size_t b) |
|||
{ |
|||
return (a > b ? a : b); |
|||
} |
|||
|
|||
static size_t calcAddrLen(sa_family_t p_family, int p_dataSize) |
|||
{ |
|||
switch (p_family) { |
|||
case AF_INET: |
|||
return sizeof(struct sockaddr_in); |
|||
case AF_INET6: |
|||
return sizeof(struct sockaddr_in6); |
|||
case AF_PACKET: |
|||
return maxSize(sizeof(struct sockaddr_ll), offsetof(struct sockaddr_ll, sll_addr) + p_dataSize); |
|||
default: |
|||
return maxSize(sizeof(struct sockaddr), offsetof(struct sockaddr, sa_data) + p_dataSize); |
|||
} |
|||
} |
|||
|
|||
static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size) |
|||
{ |
|||
switch (p_family) { |
|||
case AF_INET: |
|||
memcpy(&((struct sockaddr_in*)p_dest)->sin_addr, p_data, p_size); |
|||
break; |
|||
case AF_INET6: |
|||
memcpy(&((struct sockaddr_in6*)p_dest)->sin6_addr, p_data, p_size); |
|||
break; |
|||
case AF_PACKET: |
|||
memcpy(((struct sockaddr_ll*)p_dest)->sll_addr, p_data, p_size); |
|||
((struct sockaddr_ll*)p_dest)->sll_halen = p_size; |
|||
break; |
|||
default: |
|||
memcpy(p_dest->sa_data, p_data, p_size); |
|||
break; |
|||
} |
|||
p_dest->sa_family = p_family; |
|||
} |
|||
|
|||
static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry) |
|||
{ |
|||
if (!*p_resultList) { |
|||
*p_resultList = p_entry; |
|||
} else { |
|||
struct ifaddrs *l_cur = *p_resultList; |
|||
while(l_cur->ifa_next) { |
|||
l_cur = l_cur->ifa_next; |
|||
} |
|||
l_cur->ifa_next = p_entry; |
|||
} |
|||
} |
|||
|
|||
static int interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList) |
|||
{ |
|||
struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr); |
|||
|
|||
size_t l_nameSize = 0; |
|||
size_t l_addrSize = 0; |
|||
size_t l_dataSize = 0; |
|||
|
|||
size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); |
|||
struct rtattr *l_rta; |
|||
for (l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { |
|||
void *l_rtaData = RTA_DATA(l_rta); |
|||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); |
|||
switch (l_rta->rta_type) { |
|||
case IFLA_ADDRESS: |
|||
case IFLA_BROADCAST: |
|||
l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize)); |
|||
break; |
|||
case IFLA_IFNAME: |
|||
l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); |
|||
break; |
|||
case IFLA_STATS: |
|||
l_dataSize += NLMSG_ALIGN(l_rtaSize); |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
struct ifaddrs *l_entry = (struct ifaddrs*)malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); |
|||
if (l_entry == NULL) return -1; |
|||
memset(l_entry, 0, sizeof(struct ifaddrs)); |
|||
l_entry->ifa_name = (char*)""; |
|||
|
|||
char *l_index = ((char *)l_entry) + sizeof(struct ifaddrs); |
|||
char *l_name = l_index + sizeof(int); |
|||
char *l_addr = l_name + l_nameSize; |
|||
char *l_data = l_addr + l_addrSize; |
|||
|
|||
/* Save the interface index so we can look it up when handling the addresses. */ |
|||
memcpy(l_index, &l_info->ifi_index, sizeof(int)); |
|||
|
|||
l_entry->ifa_flags = l_info->ifi_flags; |
|||
|
|||
l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); |
|||
for (l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { |
|||
void *l_rtaData = RTA_DATA(l_rta); |
|||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); |
|||
switch (l_rta->rta_type) { |
|||
case IFLA_ADDRESS: |
|||
case IFLA_BROADCAST: |
|||
{ |
|||
size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize); |
|||
makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); |
|||
((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index; |
|||
((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type; |
|||
if (l_rta->rta_type == IFLA_ADDRESS) { |
|||
l_entry->ifa_addr = (struct sockaddr *)l_addr; |
|||
} else { |
|||
l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; |
|||
} |
|||
l_addr += NLMSG_ALIGN(l_addrLen); |
|||
break; |
|||
} |
|||
case IFLA_IFNAME: |
|||
strncpy(l_name, (char*)l_rtaData, l_rtaDataSize); |
|||
l_name[l_rtaDataSize] = '\0'; |
|||
l_entry->ifa_name = l_name; |
|||
break; |
|||
case IFLA_STATS: |
|||
memcpy(l_data, l_rtaData, l_rtaDataSize); |
|||
l_entry->ifa_data = l_data; |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
addToEnd(p_resultList, l_entry); |
|||
return 0; |
|||
} |
|||
|
|||
static struct ifaddrs *findInterface(int p_index, struct ifaddrs **p_links, int p_numLinks) |
|||
{ |
|||
int l_num = 0; |
|||
struct ifaddrs *l_cur = *p_links; |
|||
while (l_cur && l_num < p_numLinks) { |
|||
char *l_indexPtr = ((char *)l_cur) + sizeof(struct ifaddrs); |
|||
int l_index; |
|||
memcpy(&l_index, l_indexPtr, sizeof(int)); |
|||
if(l_index == p_index) return l_cur; |
|||
|
|||
l_cur = l_cur->ifa_next; |
|||
++l_num; |
|||
} |
|||
return NULL; |
|||
} |
|||
|
|||
static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList, int p_numLinks) |
|||
{ |
|||
struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); |
|||
struct ifaddrs *l_interface = findInterface(l_info->ifa_index, p_resultList, p_numLinks); |
|||
|
|||
if (l_info->ifa_family == AF_PACKET) return 0; |
|||
|
|||
size_t l_nameSize = 0; |
|||
size_t l_addrSize = 0; |
|||
int l_addedNetmask = 0; |
|||
|
|||
size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); |
|||
struct rtattr *l_rta; |
|||
for (l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { |
|||
void *l_rtaData = RTA_DATA(l_rta); |
|||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); |
|||
|
|||
switch (l_rta->rta_type) { |
|||
case IFA_ADDRESS: |
|||
case IFA_LOCAL: |
|||
if ((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) { |
|||
/* Make room for netmask. */ |
|||
l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); |
|||
l_addedNetmask = 1; |
|||
} |
|||
case IFA_BROADCAST: |
|||
l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); |
|||
break; |
|||
case IFA_LABEL: |
|||
l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
struct ifaddrs *l_entry = (struct ifaddrs*)malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); |
|||
if (l_entry == NULL) return -1; |
|||
memset(l_entry, 0, sizeof(struct ifaddrs)); |
|||
l_entry->ifa_name = (l_interface ? l_interface->ifa_name : (char*)""); |
|||
|
|||
char *l_name = ((char *)l_entry) + sizeof(struct ifaddrs); |
|||
char *l_addr = l_name + l_nameSize; |
|||
|
|||
l_entry->ifa_flags = l_info->ifa_flags; |
|||
if (l_interface) { |
|||
l_entry->ifa_flags |= l_interface->ifa_flags; |
|||
} |
|||
|
|||
l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); |
|||
for (l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) { |
|||
void *l_rtaData = RTA_DATA(l_rta); |
|||
size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); |
|||
switch (l_rta->rta_type) { |
|||
case IFA_ADDRESS: |
|||
case IFA_BROADCAST: |
|||
case IFA_LOCAL: |
|||
{ |
|||
size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize); |
|||
makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); |
|||
if (l_info->ifa_family == AF_INET6) { |
|||
if (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) { |
|||
((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index; |
|||
} |
|||
} |
|||
|
|||
if (l_rta->rta_type == IFA_ADDRESS) { |
|||
/* Apparently in a point-to-point network IFA_ADDRESS contains
|
|||
the dest address and IFA_LOCAL contains the local address. */ |
|||
if(l_entry->ifa_addr) { |
|||
l_entry->ifa_dstaddr = (struct sockaddr *)l_addr; |
|||
} else { |
|||
l_entry->ifa_addr = (struct sockaddr *)l_addr; |
|||
} |
|||
} else if (l_rta->rta_type == IFA_LOCAL) { |
|||
if(l_entry->ifa_addr) { |
|||
l_entry->ifa_dstaddr = l_entry->ifa_addr; |
|||
} |
|||
l_entry->ifa_addr = (struct sockaddr *)l_addr; |
|||
} else { |
|||
l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; |
|||
} |
|||
l_addr += NLMSG_ALIGN(l_addrLen); |
|||
break; |
|||
} |
|||
case IFA_LABEL: |
|||
strncpy(l_name, (char*)l_rtaData, l_rtaDataSize); |
|||
l_name[l_rtaDataSize] = '\0'; |
|||
l_entry->ifa_name = l_name; |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6)) { |
|||
unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128); |
|||
unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen); |
|||
char l_mask[16] = {0}; |
|||
unsigned i; |
|||
for (i=0; i<(l_prefix/8); ++i) { |
|||
l_mask[i] = 0xff; |
|||
} |
|||
if (l_prefix % 8) { |
|||
l_mask[i] = 0xff << (8 - (l_prefix % 8)); |
|||
} |
|||
|
|||
makeSockaddr(l_entry->ifa_addr->sa_family, (struct sockaddr *)l_addr, l_mask, l_maxPrefix / 8); |
|||
l_entry->ifa_netmask = (struct sockaddr *)l_addr; |
|||
} |
|||
|
|||
addToEnd(p_resultList, l_entry); |
|||
return 0; |
|||
} |
|||
|
|||
static int interpretLinks(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList) |
|||
{ |
|||
int l_numLinks = 0; |
|||
pid_t l_pid = getpid(); |
|||
for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { |
|||
unsigned int l_nlsize = p_netlinkList->m_size; |
|||
struct nlmsghdr *l_hdr; |
|||
for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) |
|||
{ |
|||
if ((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) continue; |
|||
|
|||
if (l_hdr->nlmsg_type == NLMSG_DONE) break; |
|||
|
|||
if (l_hdr->nlmsg_type == RTM_NEWLINK) { |
|||
if(interpretLink(l_hdr, p_resultList) == -1) return -1; |
|||
++l_numLinks; |
|||
} |
|||
} |
|||
} |
|||
return l_numLinks; |
|||
} |
|||
|
|||
static int interpretAddrs(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks) |
|||
{ |
|||
pid_t l_pid = getpid(); |
|||
for (; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { |
|||
unsigned int l_nlsize = p_netlinkList->m_size; |
|||
struct nlmsghdr *l_hdr; |
|||
for (l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { |
|||
if ((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) continue; |
|||
|
|||
if (l_hdr->nlmsg_type == NLMSG_DONE) break; |
|||
|
|||
if (l_hdr->nlmsg_type == RTM_NEWADDR) { |
|||
if (interpretAddr(l_hdr, p_resultList, p_numLinks) == -1) return -1; |
|||
} |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
static int getifaddrs(struct ifaddrs **ifap) |
|||
{ |
|||
if (!ifap) return -1; |
|||
*ifap = NULL; |
|||
|
|||
int l_socket = netlink_socket(); |
|||
if (l_socket < 0) { |
|||
return -1; |
|||
} |
|||
|
|||
NetlinkList *l_linkResults = getResultList(l_socket, RTM_GETLINK); |
|||
if (!l_linkResults) { |
|||
close(l_socket); |
|||
return -1; |
|||
} |
|||
|
|||
NetlinkList *l_addrResults = getResultList(l_socket, RTM_GETADDR); |
|||
if (!l_addrResults) { |
|||
close(l_socket); |
|||
freeResultList(l_linkResults); |
|||
return -1; |
|||
} |
|||
|
|||
int l_result = 0; |
|||
int l_numLinks = interpretLinks(l_socket, l_linkResults, ifap); |
|||
if (l_numLinks == -1 || interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1) { |
|||
l_result = -1; |
|||
} |
|||
|
|||
freeResultList(l_linkResults); |
|||
freeResultList(l_addrResults); |
|||
close(l_socket); |
|||
return l_result; |
|||
} |
|||
|
|||
static void freeifaddrs(struct ifaddrs *ifa) |
|||
{ |
|||
struct ifaddrs *l_cur; |
|||
while (ifa) { |
|||
l_cur = ifa; |
|||
ifa = ifa->ifa_next; |
|||
free(l_cur); |
|||
} |
|||
} |
@ -1,13 +0,0 @@ |
|||
Fix problem where <linux/route.h> needed <sys/socket.h> to compile. |
|||
|
|||
diff -u -r /Users/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/linux/route.h ./usr/include/linux/route.h
|
|||
--- /Users/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/linux/route.h 2014-10-15 04:53:49.000000000 +0200
|
|||
+++ ./usr/include/linux/route.h 2014-12-14 20:10:13.000000000 +0100
|
|||
@@ -18,6 +18,7 @@
|
|||
****************************************************************************/ |
|||
#ifndef _LINUX_ROUTE_H |
|||
#define _LINUX_ROUTE_H |
|||
+#include <sys/socket.h> /* for struct sockaddr */
|
|||
#include <linux/if.h> |
|||
#include <linux/compiler.h> |
|||
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ |
@ -1,14 +0,0 @@ |
|||
Needed by util-linux. |
|||
|
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/ttydefaults.h ./usr/include/sys/ttydefaults.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/sys/ttydefaults.h 2016-06-01 12:53:26.000000000 -0400
|
|||
+++ ./usr/include/sys/ttydefaults.h 2016-06-22 06:29:26.247578626 -0400
|
|||
@@ -46,7 +46,7 @@
|
|||
* Defaults on "first" open. |
|||
*/ |
|||
#define TTYDEF_IFLAG (BRKINT | ICRNL | IMAXBEL | IXON | IXANY) |
|||
-#define TTYDEF_OFLAG (OPOST | ONLCR | OXTABS)
|
|||
+#define TTYDEF_OFLAG (OPOST | ONLCR | XTABS)
|
|||
#define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL) |
|||
#define TTYDEF_CFLAG (CREAD | CS8 | HUPCL) |
|||
#define TTYDEF_SPEED (B9600) |
@ -1,17 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/sys/user.h ./usr/include/sys/user.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm64/usr/include/sys/user.h 2014-12-08 21:59:41.000000000 -0500
|
|||
+++ ./usr/include/sys/user.h 2016-01-08 20:08:08.327228220 -0500
|
|||
@@ -99,6 +99,13 @@
|
|||
int u_debugreg[8]; |
|||
}; |
|||
|
|||
+/* Needed by binutils on x86 */
|
|||
+/* http://osxr.org/android/source/bionic/libc/kernel/arch-x86/asm/user_32.h#0089 */
|
|||
+#define NBPG PAGE_SIZE
|
|||
+#define UPAGES 1
|
|||
+#define HOST_TEXT_START_ADDR (u.start_code)
|
|||
+#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
|
|||
+
|
|||
#elif defined(__x86_64__) |
|||
|
|||
struct user_fpregs_struct { |
@ -1,4 +0,0 @@ |
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/syscall.h 2016-12-03 21:40:40.033159200 +0530
|
|||
+++ ./usr/include/syscall.h 2016-12-03 19:52:16.226951188 +0530
|
|||
@@ -0,0 +1 @@
|
|||
+#include <sys/syscall.h>
|
@ -1,114 +0,0 @@ |
|||
/*
|
|||
* Copyright (c) 1987, 1993 |
|||
* The Regents of the University of California. All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions |
|||
* are met: |
|||
* 1. Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* 2. Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* 4. Neither the name of the University nor the names of its contributors |
|||
* may be used to endorse or promote products derived from this software |
|||
* without specific prior written permission. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
|||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|||
* SUCH DAMAGE. |
|||
* |
|||
* @(#)sysexits.h 8.1 (Berkeley) 6/2/93 |
|||
*/ |
|||
|
|||
#ifndef _SYSEXITS_H |
|||
#define _SYSEXITS_H 1 |
|||
|
|||
/*
|
|||
* SYSEXITS.H -- Exit status codes for system programs. |
|||
* |
|||
* This include file attempts to categorize possible error |
|||
* exit statuses for system programs, notably delivermail |
|||
* and the Berkeley network. |
|||
* |
|||
* Error numbers begin at EX__BASE to reduce the possibility of |
|||
* clashing with other exit statuses that random programs may |
|||
* already return. The meaning of the codes is approximately |
|||
* as follows: |
|||
* |
|||
* EX_USAGE -- The command was used incorrectly, e.g., with |
|||
* the wrong number of arguments, a bad flag, a bad |
|||
* syntax in a parameter, or whatever. |
|||
* EX_DATAERR -- The input data was incorrect in some way. |
|||
* This should only be used for user's data & not |
|||
* system files. |
|||
* EX_NOINPUT -- An input file (not a system file) did not |
|||
* exist or was not readable. This could also include |
|||
* errors like "No message" to a mailer (if it cared |
|||
* to catch it). |
|||
* EX_NOUSER -- The user specified did not exist. This might |
|||
* be used for mail addresses or remote logins. |
|||
* EX_NOHOST -- The host specified did not exist. This is used |
|||
* in mail addresses or network requests. |
|||
* EX_UNAVAILABLE -- A service is unavailable. This can occur |
|||
* if a support program or file does not exist. This |
|||
* can also be used as a catchall message when something |
|||
* you wanted to do doesn't work, but you don't know |
|||
* why. |
|||
* EX_SOFTWARE -- An internal software error has been detected. |
|||
* This should be limited to non-operating system related |
|||
* errors as possible. |
|||
* EX_OSERR -- An operating system error has been detected. |
|||
* This is intended to be used for such things as "cannot |
|||
* fork", "cannot create pipe", or the like. It includes |
|||
* things like getuid returning a user that does not |
|||
* exist in the passwd file. |
|||
* EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp, |
|||
* etc.) does not exist, cannot be opened, or has some |
|||
* sort of error (e.g., syntax error). |
|||
* EX_CANTCREAT -- A (user specified) output file cannot be |
|||
* created. |
|||
* EX_IOERR -- An error occurred while doing I/O on some file. |
|||
* EX_TEMPFAIL -- temporary failure, indicating something that |
|||
* is not really an error. In sendmail, this means |
|||
* that a mailer (e.g.) could not create a connection, |
|||
* and the request should be reattempted later. |
|||
* EX_PROTOCOL -- the remote system returned something that |
|||
* was "not possible" during a protocol exchange. |
|||
* EX_NOPERM -- You did not have sufficient permission to |
|||
* perform the operation. This is not intended for |
|||
* file system problems, which should use NOINPUT or |
|||
* CANTCREAT, but rather for higher level permissions. |
|||
*/ |
|||
|
|||
#define EX_OK 0 /* successful termination */ |
|||
|
|||
#define EX__BASE 64 /* base value for error messages */ |
|||
|
|||
#define EX_USAGE 64 /* command line usage error */ |
|||
#define EX_DATAERR 65 /* data format error */ |
|||
#define EX_NOINPUT 66 /* cannot open input */ |
|||
#define EX_NOUSER 67 /* addressee unknown */ |
|||
#define EX_NOHOST 68 /* host name unknown */ |
|||
#define EX_UNAVAILABLE 69 /* service unavailable */ |
|||
#define EX_SOFTWARE 70 /* internal software error */ |
|||
#define EX_OSERR 71 /* system error (e.g., can't fork) */ |
|||
#define EX_OSFILE 72 /* critical OS file missing */ |
|||
#define EX_CANTCREAT 73 /* can't create (user) output file */ |
|||
#define EX_IOERR 74 /* input/output error */ |
|||
#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ |
|||
#define EX_PROTOCOL 76 /* remote error in protocol */ |
|||
#define EX_NOPERM 77 /* permission denied */ |
|||
#define EX_CONFIG 78 /* configuration error */ |
|||
|
|||
#define EX__MAX 78 /* maximum listed value */ |
|||
|
|||
#endif /* sysexits.h */ |
@ -1,77 +0,0 @@ |
|||
diff -Nur /Users/fornwall/lib/android-ndk/platforms/android-18/arch-arm/usr/include/syslog.h ./usr/include/syslog.h
|
|||
--- /Users/fornwall/lib/android-ndk/platforms/android-18/arch-arm/usr/include/syslog.h 2012-08-21 07:23:12.000000000 +0200
|
|||
+++ ./usr/include/syslog.h 2014-01-29 17:51:55.000000000 +0100
|
|||
@@ -31,6 +31,8 @@
|
|||
#include <stdio.h> |
|||
#include <sys/cdefs.h> |
|||
#include <stdarg.h> |
|||
+#include <android/log.h> /* for __android_log_vprint() */
|
|||
+#include <unistd.h> /* for getpid() */
|
|||
|
|||
__BEGIN_DECLS |
|||
|
|||
@@ -111,6 +112,64 @@
|
|||
extern void syslog_r(int, struct syslog_data *, const char *, ...); |
|||
extern void vsyslog_r(int, struct syslog_data *, const char *, va_list); |
|||
|
|||
+extern /*const*/ char* __progname;
|
|||
+static __inline__ void android_polyfill_openlog(const char* a, int b, int c) {
|
|||
+ (void) a;
|
|||
+ (void) b;
|
|||
+ (void) c;
|
|||
+}
|
|||
+static __inline__ void android_polyfill_closelog() {}
|
|||
+
|
|||
+static __inline__ void android_polyfill_vsyslog(int syslog_priority, char const* format, va_list ap)
|
|||
+{
|
|||
+ android_LogPriority a = ANDROID_LOG_ERROR;
|
|||
+ switch (syslog_priority) {
|
|||
+ case LOG_WARNING: a = ANDROID_LOG_WARN; break;
|
|||
+ case LOG_NOTICE : a = ANDROID_LOG_INFO; break;
|
|||
+ case LOG_INFO: a = ANDROID_LOG_INFO; break;
|
|||
+ case LOG_DEBUG: a = ANDROID_LOG_DEBUG; break;
|
|||
+ }
|
|||
+ char* syslog_text;
|
|||
+ if (vasprintf(&syslog_text, format, ap) == -1) {
|
|||
+ __android_log_vprint(a, "syslog", format, ap);
|
|||
+ return;
|
|||
+ }
|
|||
+ __android_log_print(a, "syslog", "%s - %s", __progname, syslog_text);
|
|||
+ free(syslog_text);
|
|||
+}
|
|||
+
|
|||
+static __inline__ void android_polyfill_syslog(int priority, const char* format, ...)
|
|||
+{
|
|||
+ va_list myargs;
|
|||
+ va_start(myargs, format);
|
|||
+ android_polyfill_vsyslog(priority, format, myargs);
|
|||
+ va_end(myargs);
|
|||
+}
|
|||
+
|
|||
+static __inline__ void android_polyfill_syslog_r(int syslog_priority, void* d, const char* format, ...)
|
|||
+{
|
|||
+ (void) d;
|
|||
+ va_list myargs;
|
|||
+ va_start(myargs, format);
|
|||
+ android_polyfill_vsyslog(syslog_priority, format, myargs);
|
|||
+ va_end(myargs);
|
|||
+}
|
|||
+
|
|||
+static __inline__ void android_polyfill_vsyslog_r(int syslog_priority, void* d, const char* fmt, va_list ap)
|
|||
+{
|
|||
+ (void) d;
|
|||
+ android_polyfill_vsyslog(syslog_priority, fmt, ap);
|
|||
+}
|
|||
+
|
|||
+#define openlog android_polyfill_openlog
|
|||
+#define closelog android_polyfill_closelog
|
|||
+
|
|||
+#define syslog android_polyfill_syslog
|
|||
+#define syslog_r android_polyfill_syslog_r
|
|||
+
|
|||
+#define vsyslog android_polyfill_vsyslog
|
|||
+#define vsyslog_r android_polyfill_vsyslog_r
|
|||
+
|
|||
__END_DECLS |
|||
|
|||
#endif /* _SYSLOG_H */ |
@ -1,12 +0,0 @@ |
|||
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/termios.h ./usr/include/termios.h
|
|||
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/termios.h 2014-10-14 22:53:49.000000000 -0400
|
|||
+++ ./usr/include/termios.h 2015-05-15 18:23:49.264331535 -0400
|
|||
@@ -49,6 +49,8 @@
|
|||
int tcsendbreak(int, int); |
|||
int tcsetattr(int, int, const struct termios*); |
|||
|
|||
+#define _POSIX_VDISABLE 0
|
|||
+
|
|||
__END_DECLS |
|||
|
|||
#endif /* _TERMIOS_H_ */ |
Loading…
Reference in new issue