aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
Diffstat (limited to 'toys')
-rw-r--r--toys/example/README4
-rw-r--r--toys/example/hello.c35
-rw-r--r--toys/example/skeleton.c104
-rw-r--r--toys/other/hello.c61
4 files changed, 143 insertions, 61 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);
+}
diff --git a/toys/other/hello.c b/toys/other/hello.c
deleted file mode 100644
index eb80972e..00000000
--- a/toys/other/hello.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* hello.c - A hello world program. (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
-
-// Accept many different kinds of command line argument:
-
-USE_HELLO(NEWTOY(hello, "(walrus)(blubber):;(also):e@d*c#b:a", TOYFLAG_USR|TOYFLAG_BIN))
-
-config HELLO
- bool "hello"
- default n
- help
- usage: hello [-a] [-b string] [-c number] [-d list] [-e count] [...]
-
- A hello world program. You don't need this.
-
- Mostly used as an example/skeleton file for adding new commands,
- occasionally nice to test kernel booting via "init=/bin/hello".
-*/
-
-#define FOR_hello
-#include "toys.h"
-
-// Hello doesn't use these globals, they're here for example/skeleton purposes.
-
-GLOBALS(
- char *b_string;
- long c_number;
- struct arg_list *d_list;
- long e_count;
- char *also_string;
- char *blubber_string;
-
- int more_globals;
-)
-
-// Parse many different kinds of command line argument:
-
-void hello_main(void)
-{
- char **optargs;
-
- printf("Hello world\n");
-
- 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.b_string);
- if (toys.optflags & FLAG_c) printf("c=%ld\n", TT.c_number);
- while (TT.d_list) {
- printf("d=%s\n", TT.d_list->arg);
- TT.d_list = TT.d_list->next;
- }
- if (TT.e_count) printf("e was seen %ld times\n", TT.e_count);
- for (optargs = toys.optargs; *optargs; optargs++)
- printf("optarg=%s\n", *optargs);
- if (toys.optflags & FLAG_walrus) printf("Saw --walrus\n");
- if (TT.blubber_string) printf("--blubber=%s\n", TT.blubber_string);
-}