cb9e3a9ac9
The pw_getcos field on struct passwd is defined on 64-bit builds but is NULL which programs does not handle (at least no openssh which crashes). Initialize this field to "" to avoid this.
56 lines
2.1 KiB
Diff
56 lines
2.1 KiB
Diff
diff -u -r /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/pwd.h ./usr/include/pwd.h
|
|
--- /home/fornwall/lib/android-ndk/platforms/android-21/arch-arm/usr/include/pwd.h 2016-03-03 16:54:24.000000000 -0500
|
|
+++ ./usr/include/pwd.h 2016-03-10 08:11:16.795710172 -0500
|
|
@@ -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,40 @@
|
|
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/ash";
|
|
+ } else {
|
|
+ pw->pw_shell = strcmp(realpath_buffer, "@TERMUX_PREFIX@/bin/busybox") == 0 ? (char*)"@TERMUX_PREFIX@/bin/ash" : 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;
|
|
+}
|
|
+
|
|
+#define getpwnam android_polyfill_getpwnam
|
|
+#define getpwuid android_polyfill_getpwuid
|
|
+static void endpwent(void) { /* Do nothing. */ }
|
|
struct passwd* getpwent(void);
|
|
int setpwent(void);
|