1/* Toybox infrastructure. 2 * 3 * Copyright 2006 Rob Landley <rob@landley.net> 4 */ 5 6// Stuff that needs to go before the standard headers 7 8#include "generated/config.h" 9#include "lib/portability.h" 10 11// General posix-2008 headers 12#include <ctype.h> 13#include <dirent.h> 14#include <errno.h> 15#include <fcntl.h> 16#include <fnmatch.h> 17#include <grp.h> 18#include <inttypes.h> 19#include <limits.h> 20#include <math.h> 21#include <pwd.h> 22#include <regex.h> 23#include <sched.h> 24#include <setjmp.h> 25#include <signal.h> 26#include <stdarg.h> 27#include <stddef.h> 28#include <stdint.h> 29#include <stdio.h> 30#include <stdlib.h> 31#include <string.h> 32#include <strings.h> 33#include <sys/mman.h> 34#include <sys/resource.h> 35#include <sys/stat.h> 36#include <sys/statvfs.h> 37#include <sys/time.h> 38#include <sys/times.h> 39#include <sys/utsname.h> 40#include <sys/wait.h> 41#include <syslog.h> 42#include <termios.h> 43#include <time.h> 44#include <unistd.h> 45#include <utime.h> 46 47// Posix networking 48 49#include <arpa/inet.h> 50#include <netdb.h> 51#include <net/if.h> 52#include <netinet/in.h> 53#include <netinet/tcp.h> 54#include <poll.h> 55#include <sys/socket.h> 56#include <sys/un.h> 57 58// Internationalization support (also in POSIX and LSB) 59 60#include <locale.h> 61#include <wchar.h> 62#include <wctype.h> 63 64// LSB 4.1 headers 65#include <pty.h> 66#include <sys/ioctl.h> 67#include <sys/statfs.h> 68#include <sys/sysinfo.h> 69 70#include "lib/lib.h" 71#include "toys/e2fs.h" 72 73// Get list of function prototypes for all enabled command_main() functions. 74 75#define NEWTOY(name, opts, flags) void name##_main(void); 76#define OLDTOY(name, oldname, flags) void oldname##_main(void); 77#include "generated/newtoys.h" 78#include "generated/flags.h" 79#include "generated/globals.h" 80 81// These live in main.c 82 83struct toy_list *toy_find(char *name); 84void toy_init(struct toy_list *which, char *argv[]); 85void toy_exec(char *argv[]); 86 87// Flags describing command behavior. 88 89#define TOYFLAG_USR (1<<0) 90#define TOYFLAG_BIN (1<<1) 91#define TOYFLAG_SBIN (1<<2) 92#define TOYMASK_LOCATION ((1<<4)-1) 93 94// This is a shell built-in function, running in the same process context. 95#define TOYFLAG_NOFORK (1<<4) 96 97// Start command with a umask of 0 (saves old umask in this.old_umask) 98#define TOYFLAG_UMASK (1<<5) 99 100// This command runs as root. 101#define TOYFLAG_STAYROOT (1<<6) 102#define TOYFLAG_NEEDROOT (1<<7) 103#define TOYFLAG_ROOTONLY (TOYFLAG_STAYROOT|TOYFLAG_NEEDROOT) 104 105// Call setlocale to listen to environment variables. 106// This invalidates sprintf("%.*s", size, string) as a valid length constraint. 107#define TOYFLAG_LOCALE (1<<8) 108 109// Array of available commands 110 111extern struct toy_list { 112 char *name; 113 void (*toy_main)(void); 114 char *options; 115 int flags; 116} toy_list[]; 117 118// Global context shared by all commands. 119 120extern struct toy_context { 121 struct toy_list *which; // Which entry in toy_list is this one? 122 char **argv; // Original command line arguments 123 char **optargs; // Arguments left over from get_optflags() 124 unsigned optflags; // Command line option flags from get_optflags() 125 int exitval; // Value error_exit feeds to exit() 126 int optc; // Count of optargs 127 int exithelp; // Should error_exit print a usage message first? 128 int old_umask; // Old umask preserved by TOYFLAG_UMASK 129 int toycount; // Total number of commands in this build 130 int signal; // generic_signal() records what signal it saw here 131 int signalfd; // and writes signal to this fd, if set 132 133 // This is at the end so toy_init() doesn't zero it. 134 jmp_buf *rebound; // longjmp here instead of exit when do_rebound set 135 int recursion; // How many nested calls to toy_exec() 136} toys; 137 138// Two big temporary buffers: one for use by commands, one for library functions 139 140extern char toybuf[4096], libbuf[4096]; 141 142extern char **environ; 143 144#define GLOBALS(...) 145 146#define ARRAY_LEN(array) (sizeof(array)/sizeof(*array)) 147