1*cf5a6c84SAndroid Build Coastguard Worker /* Toybox infrastructure. 2*cf5a6c84SAndroid Build Coastguard Worker * 3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2006 Rob Landley <[email protected]> 4*cf5a6c84SAndroid Build Coastguard Worker */ 5*cf5a6c84SAndroid Build Coastguard Worker 6*cf5a6c84SAndroid Build Coastguard Worker // Stuff that needs to go before the standard headers 7*cf5a6c84SAndroid Build Coastguard Worker 8*cf5a6c84SAndroid Build Coastguard Worker #include "generated/config.h" 9*cf5a6c84SAndroid Build Coastguard Worker #include "lib/portability.h" 10*cf5a6c84SAndroid Build Coastguard Worker 11*cf5a6c84SAndroid Build Coastguard Worker // General posix-2008 headers 12*cf5a6c84SAndroid Build Coastguard Worker #include <ctype.h> 13*cf5a6c84SAndroid Build Coastguard Worker #include <dirent.h> 14*cf5a6c84SAndroid Build Coastguard Worker #include <errno.h> 15*cf5a6c84SAndroid Build Coastguard Worker #include <fcntl.h> 16*cf5a6c84SAndroid Build Coastguard Worker #include <grp.h> 17*cf5a6c84SAndroid Build Coastguard Worker #include <inttypes.h> 18*cf5a6c84SAndroid Build Coastguard Worker #include <limits.h> 19*cf5a6c84SAndroid Build Coastguard Worker #include <math.h> 20*cf5a6c84SAndroid Build Coastguard Worker #include <paths.h> 21*cf5a6c84SAndroid Build Coastguard Worker #include <pwd.h> 22*cf5a6c84SAndroid Build Coastguard Worker #include <regex.h> 23*cf5a6c84SAndroid Build Coastguard Worker #include <sched.h> 24*cf5a6c84SAndroid Build Coastguard Worker #include <setjmp.h> 25*cf5a6c84SAndroid Build Coastguard Worker #include <signal.h> 26*cf5a6c84SAndroid Build Coastguard Worker #include <stdarg.h> 27*cf5a6c84SAndroid Build Coastguard Worker #include <stddef.h> 28*cf5a6c84SAndroid Build Coastguard Worker #include <stdint.h> 29*cf5a6c84SAndroid Build Coastguard Worker #include <stdio.h> 30*cf5a6c84SAndroid Build Coastguard Worker #include <stdlib.h> 31*cf5a6c84SAndroid Build Coastguard Worker #include <string.h> 32*cf5a6c84SAndroid Build Coastguard Worker #include <strings.h> 33*cf5a6c84SAndroid Build Coastguard Worker #include <sys/mman.h> 34*cf5a6c84SAndroid Build Coastguard Worker #include <sys/resource.h> 35*cf5a6c84SAndroid Build Coastguard Worker #include <sys/stat.h> 36*cf5a6c84SAndroid Build Coastguard Worker #include <sys/statvfs.h> 37*cf5a6c84SAndroid Build Coastguard Worker #include <sys/time.h> 38*cf5a6c84SAndroid Build Coastguard Worker #include <sys/times.h> 39*cf5a6c84SAndroid Build Coastguard Worker #include <sys/uio.h> 40*cf5a6c84SAndroid Build Coastguard Worker #include <sys/utsname.h> 41*cf5a6c84SAndroid Build Coastguard Worker #include <sys/wait.h> 42*cf5a6c84SAndroid Build Coastguard Worker #include <syslog.h> 43*cf5a6c84SAndroid Build Coastguard Worker #include <termios.h> 44*cf5a6c84SAndroid Build Coastguard Worker #include <time.h> 45*cf5a6c84SAndroid Build Coastguard Worker #include <unistd.h> 46*cf5a6c84SAndroid Build Coastguard Worker #include <utime.h> 47*cf5a6c84SAndroid Build Coastguard Worker 48*cf5a6c84SAndroid Build Coastguard Worker // Posix networking 49*cf5a6c84SAndroid Build Coastguard Worker 50*cf5a6c84SAndroid Build Coastguard Worker #include <arpa/inet.h> 51*cf5a6c84SAndroid Build Coastguard Worker #include <netdb.h> 52*cf5a6c84SAndroid Build Coastguard Worker #include <net/if.h> 53*cf5a6c84SAndroid Build Coastguard Worker #include <netinet/in.h> 54*cf5a6c84SAndroid Build Coastguard Worker #include <netinet/tcp.h> 55*cf5a6c84SAndroid Build Coastguard Worker #include <poll.h> 56*cf5a6c84SAndroid Build Coastguard Worker #include <sys/socket.h> 57*cf5a6c84SAndroid Build Coastguard Worker #include <sys/un.h> 58*cf5a6c84SAndroid Build Coastguard Worker 59*cf5a6c84SAndroid Build Coastguard Worker // Internationalization support (also in POSIX) 60*cf5a6c84SAndroid Build Coastguard Worker 61*cf5a6c84SAndroid Build Coastguard Worker #include <langinfo.h> 62*cf5a6c84SAndroid Build Coastguard Worker #include <locale.h> 63*cf5a6c84SAndroid Build Coastguard Worker #include <wchar.h> 64*cf5a6c84SAndroid Build Coastguard Worker #include <wctype.h> 65*cf5a6c84SAndroid Build Coastguard Worker 66*cf5a6c84SAndroid Build Coastguard Worker // Non-posix headers 67*cf5a6c84SAndroid Build Coastguard Worker #include <sys/ioctl.h> 68*cf5a6c84SAndroid Build Coastguard Worker #include <sys/syscall.h> 69*cf5a6c84SAndroid Build Coastguard Worker #include <sys/ttydefaults.h> 70*cf5a6c84SAndroid Build Coastguard Worker 71*cf5a6c84SAndroid Build Coastguard Worker #include "lib/lib.h" 72*cf5a6c84SAndroid Build Coastguard Worker #include "lib/lsm.h" 73*cf5a6c84SAndroid Build Coastguard Worker #include "lib/toyflags.h" 74*cf5a6c84SAndroid Build Coastguard Worker 75*cf5a6c84SAndroid Build Coastguard Worker // Get list of function prototypes for all enabled command_main() functions. 76*cf5a6c84SAndroid Build Coastguard Worker 77*cf5a6c84SAndroid Build Coastguard Worker #define NEWTOY(name, opts, flags) void name##_main(void); 78*cf5a6c84SAndroid Build Coastguard Worker #define OLDTOY(name, oldname, flags) void oldname##_main(void); 79*cf5a6c84SAndroid Build Coastguard Worker #include "generated/newtoys.h" 80*cf5a6c84SAndroid Build Coastguard Worker #include "generated/flags.h" 81*cf5a6c84SAndroid Build Coastguard Worker #include "generated/globals.h" 82*cf5a6c84SAndroid Build Coastguard Worker #include "generated/tags.h" 83*cf5a6c84SAndroid Build Coastguard Worker 84*cf5a6c84SAndroid Build Coastguard Worker // These live in main.c 85*cf5a6c84SAndroid Build Coastguard Worker 86*cf5a6c84SAndroid Build Coastguard Worker #define HELP_USAGE 1 // usage: line only 87*cf5a6c84SAndroid Build Coastguard Worker #define HELP_HEADER 2 // Add Toybox header line to help output 88*cf5a6c84SAndroid Build Coastguard Worker #define HELP_SEE 4 // "See COMMAND" instead of dereferencing alias 89*cf5a6c84SAndroid Build Coastguard Worker #define HELP_HTML 8 // Output HTML 90*cf5a6c84SAndroid Build Coastguard Worker 91*cf5a6c84SAndroid Build Coastguard Worker struct toy_list *toy_find(char *name); 92*cf5a6c84SAndroid Build Coastguard Worker void show_help(FILE *out, int full); 93*cf5a6c84SAndroid Build Coastguard Worker void check_help(char **arg); 94*cf5a6c84SAndroid Build Coastguard Worker void toy_singleinit(struct toy_list *which, char *argv[]); 95*cf5a6c84SAndroid Build Coastguard Worker void toy_init(struct toy_list *which, char *argv[]); 96*cf5a6c84SAndroid Build Coastguard Worker void toy_exec_which(struct toy_list *which, char *argv[]); 97*cf5a6c84SAndroid Build Coastguard Worker void toy_exec(char *argv[]); 98*cf5a6c84SAndroid Build Coastguard Worker 99*cf5a6c84SAndroid Build Coastguard Worker // Array of available commands 100*cf5a6c84SAndroid Build Coastguard Worker 101*cf5a6c84SAndroid Build Coastguard Worker extern struct toy_list { 102*cf5a6c84SAndroid Build Coastguard Worker char *name; 103*cf5a6c84SAndroid Build Coastguard Worker void (*toy_main)(void); 104*cf5a6c84SAndroid Build Coastguard Worker char *options; 105*cf5a6c84SAndroid Build Coastguard Worker unsigned flags; 106*cf5a6c84SAndroid Build Coastguard Worker } toy_list[]; 107*cf5a6c84SAndroid Build Coastguard Worker 108*cf5a6c84SAndroid Build Coastguard Worker // Global context shared by all commands. 109*cf5a6c84SAndroid Build Coastguard Worker 110*cf5a6c84SAndroid Build Coastguard Worker extern struct toy_context { 111*cf5a6c84SAndroid Build Coastguard Worker struct toy_list *which; // Which entry in toy_list is this one? 112*cf5a6c84SAndroid Build Coastguard Worker char **argv; // Original command line arguments 113*cf5a6c84SAndroid Build Coastguard Worker char **optargs; // Arguments left over from get_optflags() 114*cf5a6c84SAndroid Build Coastguard Worker unsigned long long optflags; // Command line option flags from get_optflags() 115*cf5a6c84SAndroid Build Coastguard Worker int optc; // Count of optargs 116*cf5a6c84SAndroid Build Coastguard Worker short toycount; // Total number of commands in this build 117*cf5a6c84SAndroid Build Coastguard Worker char exitval; // Value error_exit feeds to exit() 118*cf5a6c84SAndroid Build Coastguard Worker char wasroot; // dropped setuid 119*cf5a6c84SAndroid Build Coastguard Worker 120*cf5a6c84SAndroid Build Coastguard Worker // toy_init() should not zero past here. 121*cf5a6c84SAndroid Build Coastguard Worker sigjmp_buf *rebound; // siglongjmp here instead of exit when do_rebound 122*cf5a6c84SAndroid Build Coastguard Worker struct arg_list *xexit; // atexit() functions for xexit(), set by sigatexit() 123*cf5a6c84SAndroid Build Coastguard Worker void *stacktop; // nested toy_exec() call count, or 0 if vforked 124*cf5a6c84SAndroid Build Coastguard Worker int envc; // Count of original environ entries 125*cf5a6c84SAndroid Build Coastguard Worker int old_umask; // Old umask preserved by TOYFLAG_UMASK 126*cf5a6c84SAndroid Build Coastguard Worker short signal; // generic_signal() records what signal it saw here 127*cf5a6c84SAndroid Build Coastguard Worker int signalfd; // and writes signal to this fd, if set 128*cf5a6c84SAndroid Build Coastguard Worker } toys; 129*cf5a6c84SAndroid Build Coastguard Worker 130*cf5a6c84SAndroid Build Coastguard Worker // Two big temporary buffers: one for use by commands, one for library functions 131*cf5a6c84SAndroid Build Coastguard Worker 132*cf5a6c84SAndroid Build Coastguard Worker extern char **environ, *toybox_version, toybuf[4096], libbuf[4096]; 133*cf5a6c84SAndroid Build Coastguard Worker 134*cf5a6c84SAndroid Build Coastguard Worker #define FLAG(x) (!!(toys.optflags&FLAG_##x)) // Return 1 if flag set, 0 if not 135*cf5a6c84SAndroid Build Coastguard Worker 136*cf5a6c84SAndroid Build Coastguard Worker #define GLOBALS(...) 137*cf5a6c84SAndroid Build Coastguard Worker #define ARRAY_LEN(array) (sizeof(array)/sizeof(*array)) 138*cf5a6c84SAndroid Build Coastguard Worker #define TAGGED_ARRAY(X, ...) {__VA_ARGS__} 139*cf5a6c84SAndroid Build Coastguard Worker 140*cf5a6c84SAndroid Build Coastguard Worker #ifndef TOYBOX_VERSION 141*cf5a6c84SAndroid Build Coastguard Worker #ifndef TOYBOX_VENDOR 142*cf5a6c84SAndroid Build Coastguard Worker #define TOYBOX_VENDOR "" 143*cf5a6c84SAndroid Build Coastguard Worker #endif 144*cf5a6c84SAndroid Build Coastguard Worker #define TOYBOX_VERSION "0.8.11"TOYBOX_VENDOR 145*cf5a6c84SAndroid Build Coastguard Worker #endif 146