aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Dunham <ibid.ag@gmail.com>2014-11-19 16:38:46 -0600
committerIsaac Dunham <ibid.ag@gmail.com>2014-11-19 16:38:46 -0600
commit46ddf0e34b03f7711a9c80f7a70dc8cbf732f782 (patch)
tree4f69c03c7da6c6f3fd977182ebb93c89703d47a8
parent159a7f1621eecf6cf3c2824ffb762a19bf5f7667 (diff)
downloadtoybox-46ddf0e34b03f7711a9c80f7a70dc8cbf732f782.tar.gz
probe for getspnam(), forkpty(), utmpx, replace sethostname()
Android is missing all of these; we need to probe for some so we have a config symbol to depend on. sethostname() is easily replaced. We got termios.h via pty.h; now it's not included in configure-step tools, so we need termios.h to generate globals.
-rw-r--r--lib/portability.c10
-rw-r--r--lib/portability.h17
-rwxr-xr-xscripts/genconfig.sh28
-rw-r--r--toys.h3
-rw-r--r--toys/lsb/passwd.c1
-rw-r--r--toys/lsb/su.c1
-rw-r--r--toys/other/login.c1
-rw-r--r--toys/other/netcat.c1
-rw-r--r--toys/other/uptime.c13
-rw-r--r--toys/other/w.c1
-rw-r--r--toys/pending/sulogin.c1
-rw-r--r--toys/pending/telnetd.c1
-rw-r--r--toys/posix/who.c1
13 files changed, 70 insertions, 9 deletions
diff --git a/lib/portability.c b/lib/portability.c
index d901a4b6..29608bc1 100644
--- a/lib/portability.c
+++ b/lib/portability.c
@@ -5,6 +5,9 @@
*/
#include "toys.h"
+#if defined(__ANDROID__)
+#include <asm/unistd.h>
+#endif
#if defined(__APPLE__) || defined(__ANDROID__)
ssize_t getdelim(char **linep, size_t *np, int delim, FILE *stream)
@@ -61,6 +64,13 @@ ssize_t getline(char **linep, size_t *np, FILE *stream)
}
#endif
+#if defined(__ANDROID__)
+int sethostname(const char *name, size_t len)
+{
+ return syscall(__NR_sethostname, name, len);
+}
+#endif
+
#if defined(__APPLE__)
extern char **environ;
diff --git a/lib/portability.h b/lib/portability.h
index b7a7c794..5383efaa 100644
--- a/lib/portability.h
+++ b/lib/portability.h
@@ -180,10 +180,25 @@ ssize_t getline(char **lineptr, size_t *n, FILE *stream);
#endif
// Linux headers not listed by POSIX or LSB
-#include <shadow.h>
#include <sys/mount.h>
#include <sys/swap.h>
+// Android is missing some headers and functions
+#if defined(__ANDROID__)
+int sethostname(const char *name, size_t len);
+#endif
+// "generated/config.h" is included first
+#if defined(CFG_TOYBOX_SHADOW) && CFG_TOYBOX_SHADOW
+#include <shadow.h>
+#endif
+#if defined(CFG_TOYBOX_UTMPX) && CFG_TOYBOX_UTMPX
+#include <utmpx.h>
+#endif
+#if defined(CFG_TOYBOX_PTY) && CFG_TOYBOX_PTY
+#include <pty.h>
+#endif
+
+
// Some systems don't define O_NOFOLLOW, and it varies by architecture, so...
#include <fcntl.h>
#ifndef O_NOFOLLOW
diff --git a/scripts/genconfig.sh b/scripts/genconfig.sh
index b50c32bb..e040aea5 100755
--- a/scripts/genconfig.sh
+++ b/scripts/genconfig.sh
@@ -44,6 +44,34 @@ EOF
int main(int argc, char *argv[]) { return posix_fallocate(0,0,0); }
EOF
+
+ # Android and some other platforms miss utmpx
+ probesymbol TOYBOX_UTMPX -c << EOF
+ #include <utmpx.h>
+ #ifndef BOOT_TIME
+ #error nope
+ #endif
+ int main(int argc, char *argv[]) {
+ struct utmpx *a;
+ if (0 != (a = getutxent())) return 0;
+ return 1;
+ }
+EOF
+
+ # Android is missing shadow.h and pty.h
+ probesymbol TOYBOX_PTY -c << EOF
+ #include <pty.h>
+ int main(int argc, char *argv[]) {
+ int master; return forkpty(&master, NULL, NULL, NULL);
+ }
+EOF
+
+ probesymbol TOYBOX_SHADOW -c << EOF
+ #include <shadow.h>
+ int main(int argc, char *argv[]) {
+ struct spwd *a = getspnam("root"); return 0;
+ }
+EOF
}
genconfig()
diff --git a/toys.h b/toys.h
index ed1fa811..6b5f87aa 100644
--- a/toys.h
+++ b/toys.h
@@ -41,10 +41,10 @@
#include <sys/utsname.h>
#include <sys/wait.h>
#include <syslog.h>
+#include <termios.h>
#include <time.h>
#include <unistd.h>
#include <utime.h>
-#include <utmpx.h>
// Posix networking
@@ -64,7 +64,6 @@
#include <wctype.h>
// LSB 4.1 headers
-#include <pty.h>
#include <sys/ioctl.h>
#include <sys/statfs.h>
#include <sys/sysinfo.h>
diff --git a/toys/lsb/passwd.c b/toys/lsb/passwd.c
index c92fb0d7..ca98f2ef 100644
--- a/toys/lsb/passwd.c
+++ b/toys/lsb/passwd.c
@@ -10,6 +10,7 @@ USE_PASSWD(NEWTOY(passwd, ">1a:dlu", TOYFLAG_STAYROOT|TOYFLAG_USR|TOYFLAG_BIN))
config PASSWD
bool "passwd"
default y
+ depends on TOYBOX_SHADOW
help
usage: passwd [-a ALGO] [-dlu] <account name>
diff --git a/toys/lsb/su.c b/toys/lsb/su.c
index 268ddf75..616541b9 100644
--- a/toys/lsb/su.c
+++ b/toys/lsb/su.c
@@ -10,6 +10,7 @@ USE_SU(NEWTOY(su, "lmpc:s:", TOYFLAG_BIN|TOYFLAG_ROOTONLY))
config SU
bool "su"
default y
+ depends on TOYBOX_SHADOW
help
usage: su [-lmp] [-c CMD] [-s SHELL] [USER [ARGS...]]
diff --git a/toys/other/login.c b/toys/other/login.c
index 09861644..91523d43 100644
--- a/toys/other/login.c
+++ b/toys/other/login.c
@@ -10,6 +10,7 @@ USE_LOGIN(NEWTOY(login, ">1fph:", TOYFLAG_BIN))
config LOGIN
bool "login"
default y
+ depends on TOYBOX_SHADOW
help
usage: login [-p] [-h host] [[-f] username]
diff --git a/toys/other/netcat.c b/toys/other/netcat.c
index 485dda13..2c1ec7b2 100644
--- a/toys/other/netcat.c
+++ b/toys/other/netcat.c
@@ -26,6 +26,7 @@ config NETCAT_LISTEN
bool "netcat server options (-let)"
default y
depends on NETCAT
+ depends on TOYBOX_PTY
help
usage: netcat [-t] [-lL COMMAND...]
diff --git a/toys/other/uptime.c b/toys/other/uptime.c
index adbbfc03..f584d9ab 100644
--- a/toys/other/uptime.c
+++ b/toys/other/uptime.c
@@ -25,17 +25,18 @@ void uptime_main(void)
time_t tmptime;
struct tm * now;
unsigned int days, hours, minutes;
- struct utmpx *entry;
- int users = 0;
+ USE_TOYBOX_UTMPX(struct utmpx *entry;)
+ USE_TOYBOX_UTMPX(int users = 0;)
// Obtain the data we need.
sysinfo(&info);
time(&tmptime);
now = localtime(&tmptime);
+
// Obtain info about logged on users
- setutxent();
- while ((entry = getutxent())) if (entry->ut_type == USER_PROCESS) users++;
- endutxent();
+ USE_TOYBOX_UTMPX(setutxent();)
+ USE_TOYBOX_UTMPX(while ((entry = getutxent())) if (entry->ut_type == USER_PROCESS) users++;)
+ USE_TOYBOX_UTMPX(endutxent();)
// Time
xprintf(" %02d:%02d:%02d up ", now->tm_hour, now->tm_min, now->tm_sec);
@@ -48,7 +49,7 @@ void uptime_main(void)
if (days) xprintf("%d day%s, ", days, (days!=1)?"s":"");
if (hours) xprintf("%2d:%02d, ", hours, minutes);
else printf("%d min, ", minutes);
- printf(" %d user%s, ", users, (users!=1) ? "s" : "");
+ USE_TOYBOX_UTMPX(printf(" %d user%s, ", users, (users!=1) ? "s" : "");)
printf(" load average: %.02f, %.02f, %.02f\n", info.loads[0]/65536.0,
info.loads[1]/65536.0, info.loads[2]/65536.0);
}
diff --git a/toys/other/w.c b/toys/other/w.c
index c271e8bd..a76c82f5 100644
--- a/toys/other/w.c
+++ b/toys/other/w.c
@@ -7,6 +7,7 @@ USE_W(NEWTOY(w, NULL, TOYFLAG_USR|TOYFLAG_BIN))
config W
bool "w"
default y
+ depends on TOYBOX_UTMPX
help
usage: w
diff --git a/toys/pending/sulogin.c b/toys/pending/sulogin.c
index 45f76597..e6cb8314 100644
--- a/toys/pending/sulogin.c
+++ b/toys/pending/sulogin.c
@@ -13,6 +13,7 @@ USE_SULOGIN(NEWTOY(sulogin, "t#<0=0", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
config SULOGIN
bool "sulogin"
default n
+ depends on TOYBOX_SHADOW
help
usage: sulogin [-t time] [tty]
diff --git a/toys/pending/telnetd.c b/toys/pending/telnetd.c
index 4198e63f..f9f34224 100644
--- a/toys/pending/telnetd.c
+++ b/toys/pending/telnetd.c
@@ -8,6 +8,7 @@ USE_TELNETD(NEWTOY(telnetd, "w#<0b:p#<0>65535=23f:l:FSKi[!wi]", TOYFLAG_USR|TOYF
config TELNETD
bool "telnetd"
default n
+ depends on TOYBOX_PTY
help
Handle incoming telnet connections
diff --git a/toys/posix/who.c b/toys/posix/who.c
index 2c8a2e65..876a562a 100644
--- a/toys/posix/who.c
+++ b/toys/posix/who.c
@@ -14,6 +14,7 @@ USE_WHO(NEWTOY(who, "a", TOYFLAG_BIN))
config WHO
bool "who"
default y
+ depends on TOYBOX_UTMPX
help
usage: who