Mercurial > hg > toybox
changeset 1564:685a0da6ca59 draft
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.
author | Isaac Dunham <ibid.ag@gmail.com> |
---|---|
date | Wed, 19 Nov 2014 16:38:46 -0600 |
parents | 3d32f9523584 |
children | a3500bd8b322 |
files | lib/portability.c lib/portability.h scripts/genconfig.sh toys.h toys/lsb/passwd.c toys/lsb/su.c toys/other/login.c toys/other/netcat.c toys/other/uptime.c toys/other/w.c toys/pending/sulogin.c toys/pending/telnetd.c toys/posix/who.c |
diffstat | 13 files changed, 70 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/portability.c Wed Nov 19 14:29:53 2014 -0600 +++ b/lib/portability.c Wed Nov 19 16:38:46 2014 -0600 @@ -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 @@ } #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;
--- a/lib/portability.h Wed Nov 19 14:29:53 2014 -0600 +++ b/lib/portability.h Wed Nov 19 16:38:46 2014 -0600 @@ -180,10 +180,25 @@ #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
--- a/scripts/genconfig.sh Wed Nov 19 14:29:53 2014 -0600 +++ b/scripts/genconfig.sh Wed Nov 19 16:38:46 2014 -0600 @@ -44,6 +44,34 @@ 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()
--- a/toys.h Wed Nov 19 14:29:53 2014 -0600 +++ b/toys.h Wed Nov 19 16:38:46 2014 -0600 @@ -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>
--- a/toys/lsb/passwd.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/lsb/passwd.c Wed Nov 19 16:38:46 2014 -0600 @@ -10,6 +10,7 @@ config PASSWD bool "passwd" default y + depends on TOYBOX_SHADOW help usage: passwd [-a ALGO] [-dlu] <account name>
--- a/toys/lsb/su.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/lsb/su.c Wed Nov 19 16:38:46 2014 -0600 @@ -10,6 +10,7 @@ config SU bool "su" default y + depends on TOYBOX_SHADOW help usage: su [-lmp] [-c CMD] [-s SHELL] [USER [ARGS...]]
--- a/toys/other/login.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/other/login.c Wed Nov 19 16:38:46 2014 -0600 @@ -10,6 +10,7 @@ config LOGIN bool "login" default y + depends on TOYBOX_SHADOW help usage: login [-p] [-h host] [[-f] username]
--- a/toys/other/netcat.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/other/netcat.c Wed Nov 19 16:38:46 2014 -0600 @@ -26,6 +26,7 @@ bool "netcat server options (-let)" default y depends on NETCAT + depends on TOYBOX_PTY help usage: netcat [-t] [-lL COMMAND...]
--- a/toys/other/uptime.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/other/uptime.c Wed Nov 19 16:38:46 2014 -0600 @@ -25,17 +25,18 @@ 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 @@ 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); }
--- a/toys/other/w.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/other/w.c Wed Nov 19 16:38:46 2014 -0600 @@ -7,6 +7,7 @@ config W bool "w" default y + depends on TOYBOX_UTMPX help usage: w
--- a/toys/pending/sulogin.c Wed Nov 19 14:29:53 2014 -0600 +++ b/toys/pending/sulogin.c Wed Nov 19 16:38:46 2014 -0600 @@ -13,6 +13,7 @@ config SULOGIN bool "sulogin" default n + depends on TOYBOX_SHADOW help usage: sulogin [-t time] [tty]