diff options
Diffstat (limited to 'toys/example')
-rw-r--r-- | toys/example/README | 4 | ||||
-rw-r--r-- | toys/example/hello.c | 35 | ||||
-rw-r--r-- | toys/example/skeleton.c | 104 |
3 files changed, 143 insertions, 0 deletions
diff --git a/toys/example/README b/toys/example/README new file mode 100644 index 00000000..d0f6631a --- /dev/null +++ b/toys/example/README @@ -0,0 +1,4 @@ +Example commands + +You probably don't want to deploy this, but it shows how to use the +toybox infrastructure and provides templates for new commands. diff --git a/toys/example/hello.c b/toys/example/hello.c new file mode 100644 index 00000000..3b7d27b6 --- /dev/null +++ b/toys/example/hello.c @@ -0,0 +1,35 @@ +/* hello.c - A hello world program. (Simple template for new commands.) + * + * Copyright 2012 Rob Landley <rob@landley.net> + * + * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ + * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html + +USE_HELLO(NEWTOY(hello, 0, TOYFLAG_USR|TOYFLAG_BIN)) + +config HELLO + bool "hello" + default n + help + usage: hello [-s] + + A hello world program. You don't need this. + + Mostly used as a simple template for adding new commands. + Occasionally nice to smoketest kernel booting via "init=/usr/bin/hello". +*/ + +#define FOR_hello +#include "toys.h" + +GLOBALS( + int unused; +) + +void hello_main(void) +{ + xprintf("Hello world\n"); + + // Avoid kernel panic if run as init. + if (getpid() == 1) wait(&TT.unused); +} diff --git a/toys/example/skeleton.c b/toys/example/skeleton.c new file mode 100644 index 00000000..3e776be1 --- /dev/null +++ b/toys/example/skeleton.c @@ -0,0 +1,104 @@ +/* skeleton.c - Example program to act as template for new commands. + * + * Copyright 2014 Rob Landley <rob@landley.net> + * + * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ + * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html + +// Accept many different kinds of command line argument (see top of lib/args.c) +// Demonstrate two commands in the same file (see www/documentation.html) + +USE_SKELETON(NEWTOY(skeleton, "(walrus)(blubber):;(also):e@d*c#b:a", TOYFLAG_USR|TOYFLAG_BIN)) +USE_SKELETON_ALIAS(NEWTOY(skeleton_alias, "b#dq", TOYFLAG_USR|TOYFLAG_BIN)) + +config SKELETON + bool "skeleton" + default n + help + usage: skeleton [-a] [-b STRING] [-c NUMBER] [-d LIST] [-e COUNT] [...] + + Template for new commands. You don't need this. + + When creating a new command, copy this file and delete the parts you + don't need. Be sure to replace all instances of "skeleton" (upper and lower + case) with your new command name. + + For simple commands, "hello.c" is probably a better starting point. + +config SKELETON_ALIAS + bool "skeleton_alias" + default n + depends on SKELETON + help + usage: skeleton_alias [-dq] [-b NUMBER] + + Example of a second command with different arguments in the same source + file as the first. This allows shared infrastructure not added to lib/. +*/ + +#define FOR_skeleton +#include "toys.h" + +// The union lets lib/args.c store arguments for either command. +// It's customary to put a space between argument variables and other globals. +GLOBALS( + union { + struct { + char *b_string; + long c_number; + struct arg_list *d_list; + long e_count; + char *also_string; + char *blubber_string; + } s; + struct { + long b_number; + } a; + }; + + int more_globals; +) + +// Don't blindly build allyesconfig. The maximum _sane_ config is defconfig. +#warning skeleton.c is just an example, not something to deploy. + +// Parse many different kinds of command line argument: +void skeleton_main(void) +{ + char **optargs; + + printf("Ran %s\n", toys.which->name); + + // Command line options parsing is done for you by lib/args.c called + // from main.c using the optstring in the NEWTOY macros. Display results. + if (toys.optflags) printf("flags=%x\n", toys.optflags); + if (toys.optflags & FLAG_a) printf("Saw a\n"); + if (toys.optflags & FLAG_b) printf("b=%s\n", TT.s.b_string); + if (toys.optflags & FLAG_c) printf("c=%ld\n", TT.s.c_number); + while (TT.s.d_list) { + printf("d=%s\n", TT.s.d_list->arg); + TT.s.d_list = TT.s.d_list->next; + } + if (TT.s.e_count) printf("e was seen %ld times\n", TT.s.e_count); + for (optargs = toys.optargs; *optargs; optargs++) + printf("optarg=%s\n", *optargs); + if (toys.optflags & FLAG_walrus) printf("Saw --walrus\n"); + if (TT.s.blubber_string) printf("--blubber=%s\n", TT.s.blubber_string); + + printf("Other globals should start zeroed: %d\n", TT.more_globals); +} + +// Switch gears from skeleton to skeleton_alias (swap FLAG macros). +#define CLEANUP_skeleton +#define FOR_skeleton_alias +#include "generated/flags.h" + +void skeleton_alias_main(void) +{ + printf("Ran %s\n", toys.which->name); + printf("flags=%x\n", toys.optflags); + + // Note, this FLAG_b is a different bit position than the other FLAG_b, + // and fills out a different variable of a different type. + if (toys.optflags & FLAG_b) printf("b=%ld", TT.a.b_number); +} |