NLSH
製作：坂井弘亮 (KOZOSプロジェクト)

NLSH(NuLl SHell / No Library SHell / No Library, no SHell)はシンプルで
極小の自作シェルです．

標準ライブラリ(いわゆるlibc)を一切使わずにビルドすることができます．
(このため極小サイズの実行ファイルを生成可能です)

・現時点で，行編集と行入力ができるだけのものです．シェル機能はありません．

・行入力のライブラリを，以下から選択できます．
  * libedit (Makefile で USE_LIBEDIT を有効にする)
  * editline (Makefile で USE_EDITLINE を有効にする)
  * readline (Makefile で USE_READLINE を有効にする)
  * nlline (Makefile で USE_NLLINE を有効にする)
    - 独自のreadlineライブラリのサブセットです
  * getline() による入力 (Makefile で USE_GETLINE を有効にする)
  * fgets() による入力 (Makefile で USE_FGETS を有効にする)

・標準ライブラリ(いわゆるlibc)無しでビルド可能です．
  * Makefile で USE_NLLIBC / USE_NLCRT を有効にします
  * nllibc / nlcrt という独自の標準ライブラリとスタートアップを持っています
  * 現時点では nlline との併用が必要です

■ 既知の問題

Debian/PowerPCでnllibcを利用した場合，以下の問題があることがわかっています．
本来ならばioctl()内部で番号を見て変換する対応をすべきですが，Debian/PowerPC特有
の対応になってしまうためそのような変換対応はせず，以下のファイル中でPowerPC向け
に定義することで対処しています．

nllibc/include/nllibc/sys/ioctl.h

このためビルド時の定義食い違いにより番号の食い違いが起きると，termios関連の
ioctl()が正常に機能せず，行編集が行えないという問題があります．
(PowerPCで，ヘッダファイルはシステム標準のものを用いるが，ライブラリはnllibcを
用いる，などすると，ioctl()は新番号で呼ばれるがioctl()内部での変換処理が行われ
ないことになる)
nllibcを使わずにシステム標準のライブラリを使うことで回避できます．

(問題の詳細)

termios関連のioctl(TCGETS / TCSETS / TCSETSW / TCSETSF)の番号が
struct termios のサイズ情報を含めて生成されているのですが，struct termios に
メンバ追加(c_ispeed / c_ospeed)されたために番号が変更になってしまい，従来の
番号でioctl()を発行しても機能しなくなっています．
(また struct termios の構造自体も，若干異なっています)

glibcはこの変更を吸収しており，ioctl()の内部で番号を見てtcgetattr()/tcsetattr()
を呼び出し直しているため，システム標準のライブラリ(おそらくglibc)を使う場合
には，問題は発生しません．

詳細は以下の箇所を参照してください．

glibc/sysdeps/unix/sysv/linux/tcsetattr.c:tcsetattr()
glibc/sysdeps/unix/sysv/linux/powerpc/kernel_termios.h
glibc/sysdeps/unix/sysv/linux/powerpc/ioctl.c:__ioctl()

■ ここまで
