Добавляем свое приложение в busybox

Сообщение об ошибке

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls в функции menu_set_active_trail() (строка 2405 в файле /home/ih139182/public_html/includes/menu.inc).

Busybox - программа которая существенно облегчает жизнь встраиваемым системам. Это набор стандартных утилит, который написан с упором на компактность.
Проект приобрел довольно широкую распространенность на встраиваемых ПК именно из-за своего размера. Сделано это хитро. Бинарник один. А с помошью argv[] программа решает какой утилитой ей сейчас прикинуться. В каталоге bin же создаются ссылки на один единственный бинарный файл.

Давайте рассмотрим как добавить свою утилиту в этот набор.
Сперва скачаем репозиторий и попробуем собрать как есть.

git clone git://busybox.net/busybox.git
cd busybox
make menuconfig
make
./busybox sh

Отлично заработало. Все программы в busybox зовутся апплетами.
Рассмотрим апплет который выводит свое имя и параметры.

#include "libbb.h"

int hellocmd_main( int argc, char *argv[] )
{
    int i;
    printf("hellocmd called:\n");
    for (i = 0 ; i < argc ; i++) {
        printf("arg[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

Положем его код в файл miscutils/hellocmd.c. Вы можете создать свой файл в любом из подкаталогов busybox. Все апплеты разделены по категориям.
Отредактируем файл настройки miscutils/Config.src.

config HELLOCMD
    bool "hellocmd"
    default n
    help
      This is sample command.

Добавим правило для сборки.

lib-$(CONFIG_HELLOCMD)      += hellocmd.o

Если Вам доводилось добавлять код в ядро Linux, то думаю ничего нового Вы в этом не видите.
Осталось только добавить макрос в include/applets.src.h

IF_HELLOCMD(APPLET(hellocmd, BB_DIR_BIN, BB_SUID_DROP))

Все изменения разработчики просят выполнять в алфавитном порядке.
Для работы встроенной системы справки также укажем такие строки в include/usage.src.h

#define hellocmd_trivial_usage  "None"
#define hellocmd_full_usage "None"

Теперь конфигурируем и пересобираем.

make menuconfig
make

Пробуем запускать.

$ ./busybox hellocmd 1 2 3
hellocmd called:
arg[0] = hellocmd
arg[1] = 1
arg[2] = 2
arg[3] = 3

Вот так то.

Просмотров:   3758