mkdosfsコマンドの追加

busyboxにはmkdosfsコマンドがなかったのでとってきて追加する。

使ったバージョン

busybox-1.3.2.tar.bz2
dosfstools-2.11.src.tar.gz
busyboxが1.3.2なのはe2fsprogsが入っているから。

miscutils/mkdosfs.c

いいディレクトリがうかばなかったのでmiscutilsに入れることにする。
dosfstools-2.11/mkdosfs/mkdosfs.cをbusybox-1.3.2/miscutilsにコピー

以下を追加。下の2行はdosfstools-2.11/version.hに書いてあったもの。

#include "busybox.h"
#define	VERSION			"2.11"
#define VERSION_DATE	"12 Mar 2005"

#include "../version.h"をコメントアウト
usage()の中身をコメントアウト
main()をmkdosfs_main()に変更

miscutils/Kbuild

ドキュメントではMakefile.inと書いてあるが内容的にこのファイルのはず。以下の内容を挿入。

lib-$(CONFIG_MKDOSFS)     += mkdosfs.o

miscutils/Config.in

以下を挿入。helpの文章が手抜きだ。

config MKDOSFS
  bool "mkdosfs"
  default n
  help
    Make DOS Filesystem.

include/usage.h

以下を挿入。これはmkdosfs.cでコメントアウトしたusage()のテキストを使い回し。

#define mkdosfs_trivial_usage \
       "[-A] [-c] [-C] [-v] [-I] [-l bad-block-file] [-b backup-boot-sector]\n" \
       "[-m boot-msg-file] [-n volume-name] [-i volume-id]\n" \
       "[-s sectors-per-cluster] [-S logical-sector-size] [-f number-of-FATs]\n" \
       "[-h hidden-sectors] [-F fat-size] [-r root-dir-entries] [-R reserved-sectors]\n" \
       "/dev/name [blocks]\n"
#define mkdosfs_full_usage \
       ""

include/applets.h

以下を挿入

USE_MKDOSFS(APPLET(mkdosfs, _BB_DIR_SBIN, _BB_SUID_NEVER))

デバッグ

これでmake menuconfigを実行するとmkdofsがメニューに加わるのでyで追加してmake
コンパイルエラーが出たので以下のように対処

miscutils/mkdosfs.c:112:1: error: "TRUE" redefined
miscutils/mkdosfs.c:113:1: error: "FALSE" redefined

busybox側のlibbb.hでも同じ値で#defineしているのでコメントアウト

miscutils/mkdosfs.c: In function ‘check_mount’:
miscutils/mkdosfs.c:582: warning: declaration of ‘device_name’ shadows a global declaration
miscutils/mkdosfs.c:293: warning: shadowed declaration is here

check_mount()内のdevice_nameはそのままにして、それ以外をmkdosfs_device_nameに置換

miscutils/mkdosfs.c: In function ‘setup_tables’:
miscutils/mkdosfs.c:805: warning: declaration of ‘ctime’ shadows a global declaration
/usr/include/time.h:254: warning: shadowed declaration is here

構造体のメンバのctimeを除いてすべてmkdosfs_ctimeに置換

miscutils/mkdosfs.c:1430: warning: ‘cblocks’ may be used uninitialized in this function

unsigned long long cblocks; の後に = 0; を追記

これでコンパイルが通った。