From 7c04f01bc73082a170c9a1988bf62c2428acc4f9 Mon Sep 17 00:00:00 2001
From: Rob Landley
The toybox source code is in three directories. The top level directory -contains the file main.c and the header file toys.h. The "lib" directory -contains generic functions shared by multiple commands. The "toys" directory -contains the implementations of individual commands.
+The toybox source code is in following directories:
+To add a new command to toybox, add a C file implementing that command to +the toys directory. No other files need to be modified; the build extracts +other information it needs (such as command line arguments) from specially +formatted comments and macros in the C file. (See the description of the +generated directory for details.)
-lib: llist, getmountlist(), error_msg/error_exit, xmalloc(), -strlcpy(), xexec(), xopen()/xread(), xgetcwd(), xabspath(), find_in_path(), -itoa().
+An easy way to start a new command is copy the file "hello.c" to +the name of the new command, and modify this copy to implement the new command. +This file is a small, simple command meant to be used as a "skeleton" for +new commands (more or less by turning every instance of "hello" into the +name of your command, updating the command line arguments, globals, and +help data, and then filling out its "main" function with code that does +something interesting).
+ +Here's a checklist of steps to turn hello.c into another command:
+ +First "cd toys" and "cp hello.c yourcommand.c". Note that the name +of this file is significant, it's the name of the new command you're adding +to toybox. Open your new file in your favorite editor.
Change the one line comment at the top of the file (currently +"hello.c - A hello world program") to describe your new file.
Change the copyright notice to your name, email, and the current +year.
Give a URL to the relevant standards document, or say "Not in SUSv3" if +there is no relevant standard. (Currently both lines are there, delete +whichever is appropriate.) The existing link goes to the directory of SUSv3 +command line utility standards on the Open Group's website, where there's often +a relevant commandname.html file. Feel free to link to other documentation or +standards as appropriate.
Update the USE_YOURCOMMAND(NEWTOY(yourcommand,NULL,0)) line. This +specifies the name used to run your command, the command line arguments (NULL +if none), and where your command should be installed on a running system. See +[TODO] for details.
Change the kconfig data (from "config YOURCOMMAND" to the end of the +comment block) to supply your command's configuration and help +information. The uppper case config symbols are used by menuconfig, and are +also what the CFG_ and USE_() macros are generated from (see [TODO]). The +help information here is used by menuconfig, and also by the "help" command to +describe your new command. (See [TODO] for details.) By convention, +unfinished commands default to "n" and finished commands default to "y".
Update the DEFINE_GLOBALS() macro to contain your command's global +variables, and also change the name "hello" in the #define TT line afterwards +to the name of your command. If your command has no global variables, delete +this macro (and the #define TT line afterwards). Note that if you specified +two-character command line arguments in NEWTOY(), the first few global +variables will be initialized by the automatic argument parsing logic, and +the type and order of these variables must correspond to the arguments +specified in NEWTOY(). See [TODO] for details.
Change the "#define TT this.hello" line to use your command name in +place of the "hello". This is a shortcut to access your global variables +as if they were members of the global struct "TT". (Access these members with +a period ".", not a right arrow "->".)
Rename hello_main() to yourcommand_main(). This is the main() function +where execution off your command starts. See [TODO] to figure out what +happened to your command line arguments and how to access them.
This directory contains global infrastructure.
Contains the main() function where execution starts, plus common infrastructure to initialize global variables and select which command -to run.
+to run. The "toybox" multiplexer command is also defined here. (This is the +only command defined outside of the toys directory.)Execution starts in main() which removes the path from the first command name and calls toybox_main(), which calls toy_exec(), which calls toy_find(), -toy_init() and the appropriate command's function from toy_list.
+toy_init() and the appropriate command's function from toy_list. If +the command is "toybox", execution returns to toybox_main(), otherwise +the call goes to the appropriate command_main() from the toys directory.The following global variables are defined here:
lib: llist, getmountlist(), error_msg/error_exit, xmalloc(), +strlcpy(), xexec(), xopen()/xread(), xgetcwd(), xabspath(), find_in_path(), +itoa().
+ + +