blob: 05ff92f2614a030bf0a80ba92d5476f46e62abb7 [file] [log] [blame]
Mark Whitleyeac26362000-12-19 17:35:24 +00001How to Add a New Applet to BusyBox
2==================================
3
4This document details the steps you must take to add a new applet to BusyBox.
5
6Credits:
7Matt Kraai - initial writeup
8Mark Whitley - the remix
Denis Vlasenko7e84e532007-05-08 17:52:17 +00009Thomas Lundquist - Trying to keep it updated.
10
11When doing this you should consider using the latest svn trunk.
12This is a good thing if you plan to getting it commited into mainline.
Mark Whitleyeac26362000-12-19 17:35:24 +000013
14Initial Write
15-------------
16
Mike Frysinger9754b912005-09-02 23:06:30 +000017First, write your applet. Be sure to include copyright information at the top,
18such as who you stole the code from and so forth. Also include the mini-GPL
19boilerplate. Be sure to name the main function <applet>_main instead of main.
20And be sure to put it in <applet>.c. Usage does not have to be taken care of by
21your applet.
Denis Vlasenkob6adbf12007-05-26 19:00:18 +000022Make sure to #include "libbb.h" as the first include file in your applet so
Bernhard Reutner-Fischere15d7572006-06-02 20:56:16 +000023the bb_config.h and appropriate platform specific files are included properly.
Glenn L McGrath9c91e412003-10-01 11:33:46 +000024
25For a new applet mu, here is the code that would go in mu.c:
Mark Whitleyeac26362000-12-19 17:35:24 +000026
Denis Vlasenko7e84e532007-05-08 17:52:17 +000027(busybox.h already includes most usual header files. You do not need
28#include <stdio.h> etc...)
29
30
Mark Whitleyeac26362000-12-19 17:35:24 +000031----begin example code------
32
33/* vi: set sw=4 ts=4: */
34/*
35 * Mini mu implementation for busybox
36 *
Mark Whitleyeac26362000-12-19 17:35:24 +000037 * Copyright (C) [YEAR] by [YOUR NAME] <YOUR EMAIL>
38 *
Bernhard Reutner-Fischerdac7ff12006-04-12 17:55:51 +000039 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
Mark Whitleyeac26362000-12-19 17:35:24 +000040 */
41
Denis Vlasenkob6adbf12007-05-26 19:00:18 +000042#include "libbb.h"
Denis Vlasenko7e84e532007-05-08 17:52:17 +000043#include "other.h"
Mark Whitleyeac26362000-12-19 17:35:24 +000044
Denis Vlasenko06af2162007-02-03 17:28:39 +000045int mu_main(int argc, char **argv);
Mark Whitleyeac26362000-12-19 17:35:24 +000046int mu_main(int argc, char **argv)
47{
48 int fd;
49 char mu;
50
Bernhard Reutner-Fischer8c1eda52006-08-28 23:39:36 +000051 fd = xopen("/dev/random", O_RDONLY);
Mark Whitleyeac26362000-12-19 17:35:24 +000052
53 if ((n = safe_read(fd, &mu, 1)) < 1)
Mike Frysinger0ea3a6f2005-04-23 01:43:45 +000054 bb_perror_msg_and_die("/dev/random");
Mark Whitleyeac26362000-12-19 17:35:24 +000055
56 return mu;
57}
58
59----end example code------
60
Mark Whitley8a6b6192000-12-19 17:54:38 +000061
62Coding Style
63------------
64
65Before you submit your applet for inclusion in BusyBox, (or better yet, before
66you _write_ your applet) please read through the style guide in the docs
67directory and make your program compliant.
68
69
Glenn L McGrath2e6d3cf2001-06-24 12:36:54 +000070Some Words on libbb
71-------------------
Mark Whitley8a6b6192000-12-19 17:54:38 +000072
Mark Whitleyeac26362000-12-19 17:35:24 +000073As you are writing your applet, please be aware of the body of pre-existing
Glenn L McGrath2e6d3cf2001-06-24 12:36:54 +000074useful functions in libbb. Use these instead of reinventing the wheel.
Mark Whitley8a6b6192000-12-19 17:54:38 +000075
Mark Whitleyeac26362000-12-19 17:35:24 +000076Additionally, if you have any useful, general-purpose functions in your
Mike Frysinger9754b912005-09-02 23:06:30 +000077applet that could be useful in other applets, consider putting them in libbb.
Mark Whitleyeac26362000-12-19 17:35:24 +000078
Denis Vlasenko7e84e532007-05-08 17:52:17 +000079And it may be possible that some of the other applets uses functions you
80could use. If so, you have to rip the function out of the applet and make
81a libbb function out of it.
82
83Adding a libbb function:
84------------------------
85
86Make a new file named <function_name>.c
87
88----start example code------
89
90#include "libbb.h"
91#include "other.h"
92
93int function(char *a)
94{
95 return *a;
96}
97
98----end example code------
99
Denis Vlasenko4b924f32007-05-30 00:29:55 +0000100Add <function_name>.o in the right alphabetically sorted place
101in libbb/Kbuild. You should look at the conditional part of
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000102libbb/Kbuild aswell.
103
Denis Vlasenko4b924f32007-05-30 00:29:55 +0000104You should also try to find a suitable place in include/libbb.h for
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000105the function declaration. If not, add it somewhere anyway, with or without
106ifdefs to include or not.
107
Denis Vlasenko4b924f32007-05-30 00:29:55 +0000108You can look at libbb/Config.in and try to find out if the function is
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000109tuneable and add it there if it is.
110
Mark Whitleyeac26362000-12-19 17:35:24 +0000111
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000112Placement / Directory
113---------------------
114
115Find the appropriate directory for your new applet.
116
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000117Make sure you find the appropriate places in the files, the applets are
118sorted alphabetically.
119
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000120Add the applet to Kbuild in the chosen directory:
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000121
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000122lib-$(CONFIG_MU) += mu.o
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000123
Mike Frysinger9754b912005-09-02 23:06:30 +0000124Add the applet to Config.in in the chosen directory:
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000125
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000126config CONFIG_MU
127 bool "MU"
128 default n
129 help
130 Returns an indeterminate value.
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000131
132
Mark Whitleyeac26362000-12-19 17:35:24 +0000133Usage String(s)
134---------------
135
Eric Andersenc7bda1c2004-03-15 08:29:22 +0000136Next, add usage information for you applet to include/usage.h.
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000137This should look like the following:
Mark Whitleyeac26362000-12-19 17:35:24 +0000138
Glenn L McGrath2e6d3cf2001-06-24 12:36:54 +0000139 #define mu_trivial_usage \
140 "-[abcde] FILES"
141 #define mu_full_usage \
142 "Returns an indeterminate value.\n\n" \
143 "Options:\n" \
144 "\t-a\t\tfirst function\n" \
145 "\t-b\t\tsecond function\n" \
Mike Frysinger9754b912005-09-02 23:06:30 +0000146 ...
Mark Whitleyeac26362000-12-19 17:35:24 +0000147
148If your program supports flags, the flags should be mentioned on the first
Glenn L McGrath2e6d3cf2001-06-24 12:36:54 +0000149line (-[abcde]) and a detailed description of each flag should go in the
150mu_full_usage section, one flag per line. (Numerous examples of this
151currently exist in usage.h.)
Mark Whitleyeac26362000-12-19 17:35:24 +0000152
153
154Header Files
155------------
156
Eric Andersenc7bda1c2004-03-15 08:29:22 +0000157Next, add an entry to include/applets.h. Be *sure* to keep the list
158in alphabetical order, or else it will break the binary-search lookup
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000159algorithm in busybox.c and the Gods of BusyBox smite you. Yea, verily:
Mark Whitleyeac26362000-12-19 17:35:24 +0000160
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000161Be sure to read the top of applets.h before adding your applet.
162
Mark Whitleyeac26362000-12-19 17:35:24 +0000163 /* all programs above here are alphabetically "less than" 'mu' */
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000164 USE_MU(APPLET(mu, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
Mark Whitleyeac26362000-12-19 17:35:24 +0000165 /* all programs below here are alphabetically "greater than" 'mu' */
166
167
Mark Whitleyeac26362000-12-19 17:35:24 +0000168The Grand Announcement
169----------------------
170
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000171Then create a diff by adding the new files with svn (remember your libbb files)
172 svn add <where you put it>/mu.c
Denis Vlasenko4b924f32007-05-30 00:29:55 +0000173eventually also:
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000174 svn add libbb/function.c
175then
Denis Vlasenko4b924f32007-05-30 00:29:55 +0000176 svn diff
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000177and send it to the mailing list:
Mike Frysinger9754b912005-09-02 23:06:30 +0000178 busybox@busybox.net
179 http://busybox.net/mailman/listinfo/busybox
Mark Whitleyeac26362000-12-19 17:35:24 +0000180
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000181Sending patches as attachments is preferred, but not required.