blob: c810123ae07a904e4f97a2448f3534c4c235bc2e [file] [log] [blame]
landleyc5621502006-09-28 17:18:51 -04001/* Toybox infrastructure.
2 *
3 * Copyright 2006 Rob Landley <rob@landley.net>
landleyc5621502006-09-28 17:18:51 -04004 */
5
Rob Landley28964802008-01-19 17:08:39 -06006#include "generated/config.h"
Rob Landleyfd1c5ba2007-02-03 14:10:00 -05007
Rob Landley90163772007-01-18 21:54:08 -05008#include "lib/portability.h"
9
landley09ea7ac2006-10-30 01:38:00 -050010#include <ctype.h>
Rob Landleyfd1c5ba2007-02-03 14:10:00 -050011#include <dirent.h>
landley09ea7ac2006-10-30 01:38:00 -050012#include <errno.h>
13#include <fcntl.h>
Rob Landleyc92fde02007-04-23 15:45:55 -040014#include <grp.h>
landley09ea7ac2006-10-30 01:38:00 -050015#include <inttypes.h>
landley4f344e32006-10-05 16:18:03 -040016#include <limits.h>
Rob Landleyf05f6602012-03-07 19:04:50 -060017#include <libgen.h>
18#include <math.h>
Rob Landleyae2e4b72008-11-15 05:17:23 -060019#include <pty.h>
Rob Landleyc92fde02007-04-23 15:45:55 -040020#include <pwd.h>
Rob Landleyf05f6602012-03-07 19:04:50 -060021#include <sched.h>
Rob Landley6973a1d2006-11-25 16:50:00 -050022#include <setjmp.h>
Elie De Brauwer756f7942012-07-15 13:28:51 +020023#include <sched.h>
Elie De Brauwer0b11a162012-04-24 23:09:27 +020024#include <shadow.h>
landley4f344e32006-10-05 16:18:03 -040025#include <stdarg.h>
Rob Landleycaf39c22012-11-16 00:35:46 -060026#include <stddef.h>
landley09ea7ac2006-10-30 01:38:00 -050027#include <stdint.h>
landleyc5621502006-09-28 17:18:51 -040028#include <stdio.h>
landley4f344e32006-10-05 16:18:03 -040029#include <stdlib.h>
30#include <string.h>
Rob Landleye3b171e2012-04-28 01:22:50 -050031#include <strings.h>
Rob Landley055cfcb2007-01-14 20:20:06 -050032#include <sys/ioctl.h>
Rob Landleyc92fde02007-04-23 15:45:55 -040033#include <sys/mman.h>
Rob Landleye2580db2007-01-23 13:20:38 -050034#include <sys/mount.h>
Rob Landley6da3be92012-03-12 00:26:23 -050035#include <sys/resource.h>
landley00f87f12006-10-25 18:38:37 -040036#include <sys/stat.h>
Rob Landleyb1c002a2012-12-10 21:08:42 -060037#include <sys/statfs.h>
landley09ea7ac2006-10-30 01:38:00 -050038#include <sys/statvfs.h>
Rob Landley9494ffc2012-02-17 12:05:26 -060039#include <sys/sysinfo.h>
Elie De Brauwer2c162812012-02-18 15:33:27 +010040#include <sys/swap.h>
Rob Landley503c8b82012-12-01 18:12:06 -060041#include <sys/time.h>
Rob Landley628eb9b2012-06-16 14:19:56 -050042#include <sys/times.h>
landley09ea7ac2006-10-30 01:38:00 -050043#include <sys/types.h>
Rob Landleyf05f6602012-03-07 19:04:50 -060044#include <sys/utsname.h>
landley09ea7ac2006-10-30 01:38:00 -050045#include <sys/wait.h>
Elie De Brauwer0b11a162012-04-24 23:09:27 +020046#include <syslog.h>
Rob Landley628eb9b2012-06-16 14:19:56 -050047#include <time.h>
landley4f344e32006-10-05 16:18:03 -040048#include <unistd.h>
Rob Landley07c78d32007-12-28 03:29:33 -060049#include <utime.h>
Rob Landleyf05f6602012-03-07 19:04:50 -060050#include <utmpx.h>
Felix Janda250e0052012-11-21 20:38:29 +010051
Rob Landley6cf0a112012-11-26 14:14:29 -060052// Internationalization support
53
Felix Janda250e0052012-11-21 20:38:29 +010054#include <locale.h>
Felix Jandaabb8ca22012-11-08 11:19:07 -060055#include <wchar.h>
56#include <wctype.h>
Rob Landley07c78d32007-12-28 03:29:33 -060057
landley4f344e32006-10-05 16:18:03 -040058#include "lib/lib.h"
Rob Landleye2580db2007-01-23 13:20:38 -050059#include "toys/e2fs.h"
landleyc5621502006-09-28 17:18:51 -040060
Rob Landley55928b12008-01-19 17:43:27 -060061// Get list of function prototypes for all enabled command_main() functions.
62
63#define NEWTOY(name, opts, flags) void name##_main(void);
64#define OLDTOY(name, oldname, opts, flags)
65#include "generated/newtoys.h"
Rob Landley982c38d2013-08-15 00:58:52 -050066#include "generated/oldtoys.h"
Rob Landleyb1aaba12008-01-20 17:25:44 -060067#include "generated/globals.h"
Rob Landley55928b12008-01-19 17:43:27 -060068
Rob Landleyf2311a42006-11-04 17:45:18 -050069// These live in main.c
landleyc5621502006-09-28 17:18:51 -040070
landley4f344e32006-10-05 16:18:03 -040071struct toy_list *toy_find(char *name);
landleycd9dfc32006-10-18 18:38:16 -040072void toy_init(struct toy_list *which, char *argv[]);
73void toy_exec(char *argv[]);
landleyc5621502006-09-28 17:18:51 -040074
Rob Landley43e9d332012-04-14 21:43:24 -050075// Flags describing command behavior.
Rob Landleyb1aaba12008-01-20 17:25:44 -060076
77#define TOYFLAG_USR (1<<0)
78#define TOYFLAG_BIN (1<<1)
79#define TOYFLAG_SBIN (1<<2)
80#define TOYMASK_LOCATION ((1<<4)-1)
81
Rob Landley53dda1a2009-01-25 16:59:14 -060082// This is a shell built-in function, running in the same process context.
Rob Landleyb1aaba12008-01-20 17:25:44 -060083#define TOYFLAG_NOFORK (1<<4)
Rob Landley53dda1a2009-01-25 16:59:14 -060084
Rob Landley43e9d332012-04-14 21:43:24 -050085// Start command with a umask of 0 (saves old umask in this.old_umask)
Rob Landley0f8c4c52008-02-12 19:05:44 -060086#define TOYFLAG_UMASK (1<<5)
Rob Landleyb1aaba12008-01-20 17:25:44 -060087
Rob Landley43e9d332012-04-14 21:43:24 -050088// This command runs as root.
Rob Landleye0377fb2010-01-05 12:17:05 -060089#define TOYFLAG_STAYROOT (1<<6)
90#define TOYFLAG_NEEDROOT (1<<7)
91#define TOYFLAG_ROOTONLY (TOYFLAG_STAYROOT|TOYFLAG_NEEDROOT)
92
Rob Landley933919c2013-04-21 12:15:59 -050093// Array of available commands
Rob Landley53dda1a2009-01-25 16:59:14 -060094
Rob Landleyb1aaba12008-01-20 17:25:44 -060095extern struct toy_list {
Rob Landley7aa651a2012-11-13 17:14:08 -060096 char *name;
97 void (*toy_main)(void);
98 char *options;
99 int flags;
Rob Landleyb1aaba12008-01-20 17:25:44 -0600100} toy_list[];
101
Rob Landley43e9d332012-04-14 21:43:24 -0500102// Global context shared by all commands.
landleyc5621502006-09-28 17:18:51 -0400103
104extern struct toy_context {
Rob Landley7aa651a2012-11-13 17:14:08 -0600105 struct toy_list *which; // Which entry in toy_list is this one?
106 int exitval; // Value error_exit feeds to exit()
107 char **argv; // Original command line arguments
108 unsigned optflags; // Command line option flags from get_optflags()
109 char **optargs; // Arguments left over from get_optflags()
110 int optc; // Count of optargs
111 int exithelp; // Should error_exit print a usage message first?
112 int old_umask; // Old umask preserved by TOYFLAG_UMASK
Rob Landleycaf39c22012-11-16 00:35:46 -0600113 jmp_buf *rebound; // longjmp here instead of exit when do_rebound set
landleyc5621502006-09-28 17:18:51 -0400114} toys;
Rob Landley8324b892006-11-19 02:49:22 -0500115
Rob Landley43e9d332012-04-14 21:43:24 -0500116// One big temporary buffer, for use by commands (not library functions).
Rob Landley8324b892006-11-19 02:49:22 -0500117
Rob Landley055cfcb2007-01-14 20:20:06 -0500118extern char toybuf[4096];
Rob Landleyb1aaba12008-01-20 17:25:44 -0600119
Strake59bf7ce2013-08-17 02:54:58 -0500120extern char **environ;
121
Rob Landleyc0e56ed2012-10-08 00:02:30 -0500122#define GLOBALS(...)
Rob Landley9c1c5ec2012-08-14 01:42:06 -0500123
124#define ARRAY_LEN(array) (sizeof(array)/sizeof(*array))