toys.h revision 09ea7ac1a269db3c9a3b76840b37a7cb1eccbc24
1c56215062c961402515daeef8330ed75cd94af29landley/* vi: set ts=4 :*/
2c56215062c961402515daeef8330ed75cd94af29landley/* Toybox infrastructure.
3c56215062c961402515daeef8330ed75cd94af29landley *
4c56215062c961402515daeef8330ed75cd94af29landley * Copyright 2006 Rob Landley <rob@landley.net>
5c56215062c961402515daeef8330ed75cd94af29landley *
6c56215062c961402515daeef8330ed75cd94af29landley * Licensed under GPL version 2, see file LICENSE in this tarball for details.
7c56215062c961402515daeef8330ed75cd94af29landley */
8c56215062c961402515daeef8330ed75cd94af29landley
909ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <ctype.h>
1009ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <errno.h>
1109ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <fcntl.h>
1209ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <inttypes.h>
134f344e356d2c36c4b1df46917eaef25f82ca79a9landley#include <limits.h>
144f344e356d2c36c4b1df46917eaef25f82ca79a9landley#include <stdarg.h>
1509ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <stdint.h>
16c56215062c961402515daeef8330ed75cd94af29landley#include <stdio.h>
174f344e356d2c36c4b1df46917eaef25f82ca79a9landley#include <stdlib.h>
184f344e356d2c36c4b1df46917eaef25f82ca79a9landley#include <string.h>
19c56215062c961402515daeef8330ed75cd94af29landley#include <strings.h>
2000f87f150c3c9769e09e688bb9779947d64eb9d3landley#include <sys/stat.h>
2109ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <sys/statvfs.h>
2209ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <sys/types.h>
2309ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#include <sys/wait.h>
244f344e356d2c36c4b1df46917eaef25f82ca79a9landley#include <unistd.h>
25c56215062c961402515daeef8330ed75cd94af29landley
264f344e356d2c36c4b1df46917eaef25f82ca79a9landley#include "lib/lib.h"
27c56215062c961402515daeef8330ed75cd94af29landley
284f344e356d2c36c4b1df46917eaef25f82ca79a9landleyint cd_main(void);
29cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landleyint df_main(void);
304f344e356d2c36c4b1df46917eaef25f82ca79a9landleyint exit_main(void);
31c56215062c961402515daeef8330ed75cd94af29landleyint toybox_main(void);
32c56215062c961402515daeef8330ed75cd94af29landleyint toysh_main(void);
33c56215062c961402515daeef8330ed75cd94af29landley
344f344e356d2c36c4b1df46917eaef25f82ca79a9landley#define TOYFLAG_USR      (1<<0)
354f344e356d2c36c4b1df46917eaef25f82ca79a9landley#define TOYFLAG_BIN      (1<<1)
364f344e356d2c36c4b1df46917eaef25f82ca79a9landley#define TOYFLAG_SBIN     (1<<2)
374f344e356d2c36c4b1df46917eaef25f82ca79a9landley#define TOYMASK_LOCATION ((1<<4)-1)
384f344e356d2c36c4b1df46917eaef25f82ca79a9landley
394f344e356d2c36c4b1df46917eaef25f82ca79a9landley#define TOYFLAG_NOFORK   (1<<4)
404f344e356d2c36c4b1df46917eaef25f82ca79a9landley
41c56215062c961402515daeef8330ed75cd94af29landleyextern struct toy_list {
42c56215062c961402515daeef8330ed75cd94af29landley	char *name;
43c56215062c961402515daeef8330ed75cd94af29landley	int (*toy_main)(void);
444f344e356d2c36c4b1df46917eaef25f82ca79a9landley	int flags;
45c56215062c961402515daeef8330ed75cd94af29landley} toy_list[];
464f344e356d2c36c4b1df46917eaef25f82ca79a9landleystruct toy_list *toy_find(char *name);
47cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landleyvoid toy_init(struct toy_list *which, char *argv[]);
48cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landleyvoid toy_exec(char *argv[]);
49c56215062c961402515daeef8330ed75cd94af29landley
50c56215062c961402515daeef8330ed75cd94af29landley// Global context for this applet.
51c56215062c961402515daeef8330ed75cd94af29landley
52c56215062c961402515daeef8330ed75cd94af29landleyextern struct toy_context {
534f344e356d2c36c4b1df46917eaef25f82ca79a9landley	struct toy_list *which;  // Which entry in toy_list is this one?
544f344e356d2c36c4b1df46917eaef25f82ca79a9landley	int exitval;             // Value error_exit feeds to exit()
5509ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley	int optflags;            // Command line option flags
5609ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley	char **argv;             // Command line arguments
57c56215062c961402515daeef8330ed75cd94af29landley	char buf[4096];
58c56215062c961402515daeef8330ed75cd94af29landley} toys;
59c56215062c961402515daeef8330ed75cd94af29landley
604f344e356d2c36c4b1df46917eaef25f82ca79a9landleystruct exit_data {;};
614f344e356d2c36c4b1df46917eaef25f82ca79a9landleystruct cd_data {;};
62c56215062c961402515daeef8330ed75cd94af29landleystruct toybox_data {;};
63c56215062c961402515daeef8330ed75cd94af29landleystruct toysh_data {;};
6409ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landleystruct df_data {
6509ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley	struct string_list *fstype;
6609ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley	long units;
6709ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley};
68c56215062c961402515daeef8330ed75cd94af29landley
69c56215062c961402515daeef8330ed75cd94af29landleyunion toy_union {
704f344e356d2c36c4b1df46917eaef25f82ca79a9landley	struct exit_data exit;
714f344e356d2c36c4b1df46917eaef25f82ca79a9landley	struct cd_data cd;
72c56215062c961402515daeef8330ed75cd94af29landley	struct toybox_data toybox;
73c56215062c961402515daeef8330ed75cd94af29landley	struct toysh_data toysh;
74c56215062c961402515daeef8330ed75cd94af29landley	struct df_data df;
75c56215062c961402515daeef8330ed75cd94af29landley} toy;
76c56215062c961402515daeef8330ed75cd94af29landley
77cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley// Pending the addition of menuconfig...
78cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley
79cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYS_FREE     0
80cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley
81cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYSH_TTY     0  // Terminal control
82cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYSH_JOBCTL  0  // &, fg, bg, jobs.  ctrl-z with tty.
83cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYSH_FLOWCTL 0  // if, while, for, functions { }
84cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYSH_ENVVARS 0  // Environment variables
85cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYSH_LOCVARS 0  // Local, synthetic, fancy prompts, set, $?
86cd9dfc3b7b73715840b63180e2e4bfdb6e7ca9a4landley#define CFG_TOYSH_PIPES   0  // Pipes and redirects: | > < >> << && || & () ;
8709ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley
8809ea7ac1a269db3c9a3b76840b37a7cb1eccbc24landley#define CFG_DF_PEDANTIC   1  // Support -P and -k in df
89