blob: 6a8054d0e88e412d3b54bb35c0a44fd55137020c [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
Dan Fandrich96693632010-08-10 23:45:27 -070011When doing this you should consider using the latest git HEAD.
Denys Vlasenko5370bfb2009-09-06 02:58:59 +020012This is a good thing if you plan to getting it committed 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.
Denys Vlasenko02788ac2010-10-28 20:45:37 +020022Make sure to #include "libbb.h" as the first include file in your applet.
Glenn L McGrath9c91e412003-10-01 11:33:46 +000023
24For a new applet mu, here is the code that would go in mu.c:
Mark Whitleyeac26362000-12-19 17:35:24 +000025
Denis Vlasenko7e84e532007-05-08 17:52:17 +000026(busybox.h already includes most usual header files. You do not need
27#include <stdio.h> etc...)
28
29
Mark Whitleyeac26362000-12-19 17:35:24 +000030----begin example code------
31
32/* vi: set sw=4 ts=4: */
33/*
34 * Mini mu implementation for busybox
35 *
Mark Whitleyeac26362000-12-19 17:35:24 +000036 * Copyright (C) [YEAR] by [YOUR NAME] <YOUR EMAIL>
37 *
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +020038 * Licensed under GPLv2, see file LICENSE in this source tree.
Mark Whitleyeac26362000-12-19 17:35:24 +000039 */
40
Denis Vlasenkob6adbf12007-05-26 19:00:18 +000041#include "libbb.h"
Denis Vlasenko7e84e532007-05-08 17:52:17 +000042#include "other.h"
Mark Whitleyeac26362000-12-19 17:35:24 +000043
Denis Vlasenko9b49a5e2007-10-11 10:05:36 +000044int mu_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
Mark Whitleyeac26362000-12-19 17:35:24 +000045int mu_main(int argc, char **argv)
46{
47 int fd;
Denis Vlasenko360362d2007-11-04 04:46:46 +000048 ssize_t n;
Mark Whitleyeac26362000-12-19 17:35:24 +000049 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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200101in libbb/Kbuild.src. You should look at the conditional part of
102libbb/Kbuild.src as well.
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000103
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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200108You can look at libbb/Config.src and try to find out if the function is
Denys Vlasenko5370bfb2009-09-06 02:58:59 +0200109tunable and add it there if it is.
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000110
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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200120Add the applet to Kbuild.src 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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200124Add the applet to Config.src in the chosen directory:
Matt Kraai3b1cbd72002-03-18 16:03:00 +0000125
Denis Vlasenko360362d2007-11-04 04:46:46 +0000126config MU
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000127 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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200136Next, add usage information for you applet to include/usage.src.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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200151currently exist in usage.src.h.)
Mark Whitleyeac26362000-12-19 17:35:24 +0000152
153
154Header Files
155------------
156
Holger Blasumb27d62a2010-10-28 20:37:05 +0200157Next, add an entry to include/applets.src.h. Be *sure* to keep the list
Eric Andersenc7bda1c2004-03-15 08:29:22 +0000158in 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
Holger Blasumb27d62a2010-10-28 20:37:05 +0200161Be sure to read the top of applets.src.h before adding your applet.
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000162
Mark Whitleyeac26362000-12-19 17:35:24 +0000163 /* all programs above here are alphabetically "less than" 'mu' */
Denys Vlasenkob9f2d9f2011-01-18 13:58:01 +0100164 IF_MU(APPLET(mu, BB_DIR_USR_BIN, BB_SUID_DROP))
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
Dan Fandrich96693632010-08-10 23:45:27 -0700171Then create a diff by adding the new files to git (remember your libbb files)
172 git add <where you put it>/mu.c
Denis Vlasenko4b924f32007-05-30 00:29:55 +0000173eventually also:
Dan Fandrich96693632010-08-10 23:45:27 -0700174 git add libbb/function.c
Denis Vlasenko7e84e532007-05-08 17:52:17 +0000175then
Dan Fandrich96693632010-08-10 23:45:27 -0700176 git commit
177 git format-patch HEAD^
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000178and send it to the mailing list:
Mike Frysinger9754b912005-09-02 23:06:30 +0000179 busybox@busybox.net
180 http://busybox.net/mailman/listinfo/busybox
Mark Whitleyeac26362000-12-19 17:35:24 +0000181
Glenn L McGrath9c91e412003-10-01 11:33:46 +0000182Sending patches as attachments is preferred, but not required.