acucntrl(8C) — NEWS-OS Programmer’s Manual
名称
acucntrl − tty 回線のダイヤルイン/ダイヤルアウトを切り替える
形式
/usr/lib/uucp/acucntrl keyword ttyline
解説
acucntrl は端末回線を切り替え、ダイヤルインとダイヤルアウトに使えるようにします。 ダイヤルインの場合には、端末回線がモデムの制御をイネーブルにしており、 getty プロセスが存在し、ログインを待っているものとされます。 ダイヤルアウトの場合には、モデムの制御がディスエーブルされ、 getty プロセスは存在しません。
このプログラムは、setuid を root にして実行されなければなりません。
keyword としては、回線をダイヤルアウトにする場合には disable または dialout を、回線をダイヤルインにする場合には enable または dialin を指定します。
回線をダイヤルアウトの設定にした場合、 プロセスの実 uid のログイン名が /etc/utmp に大文字で書き込まれます。 これはその回線が使用中だということを示しており、 これもロッキング機構として機能するようになっています。 acucntrl は、その回線に対する /etc/utmp のエントリがナルでない場合、 またはそれがそのユーザのログイン名(大文字化されていてもいなくても) でない場合、あるいはプロセスがスーパーユーザとして実行されていない場合、 実行を拒否します。この最後の条件は、スーパーユーザがその回線の状態を クリアできるようにするために設けられています。
モデムの制御のオン/オフは、/dev/kmem の中を調べることによって処理されます。
4.2 BSD では、キャリアが回線上で検知された場合にも、 プログラムは回線のディスエーブルを拒否します。 これは、誰かがちょうどダイヤルインして接続したばかりでまだ ログインしていない場合の空白の時間を避けるためです。
ttyline は、tty∗ の形式でも /dev/tty∗ の形式でもかまいません。 ttyd? で始まらない名前の回線のイネーブル/ディスエーブルは、 プロセスの実 uid が 0 でない限りは禁じられており、 また、実 uid に伴うログイン名が uucp である場合にも禁じられています。 これは、機密保護上の理由からです。
ディスエーブルする場合の手順(ダイヤルアウトの手順)は次のとおりです。
1)入力の引数をチェックする
2)/etc/utmp を調べ、その回線を別のユーザが使っていないかどうかをチェックする
3)回線上のモデムの制御をディスエーブルする
4)デバイス上のキャリアをチェックする
5)デバイスの所有者を実 uid に変更する
6)/etc/ttys を編集し、適切な回線の最初の文字を 0 に変更する
7)プロセス 1 にハングアップを送ることによって、 init を促して getty をディスエーブルする
8)uid 名を大文字で /etc/utmp に書き込み、 そのデバイスが専有されたことをシステム全体に知らせる
9)DTR がオンであることを確認する
イネーブルする場合の手順(ダイヤルインの手順)は次のとおりです。
1)入力の引数をチェックする
2)/etc/utmp を調べ、その回線を別のユーザが使っていないかどうかをチェックする
3)回線上のモデムの制御がディスエーブルされていることを確認する
4)DTR をオフにし、回線のハングアップを確認する
5)排他的使用をクリアし、クローズモードでハングアップをセットすることで、 回線の設定を行う
6)モデムの制御をオンにする
7)/etc/ttys を編集し、適切な回線の最初の文字を 1 に変更する
8)プロセス 1 にハングアップを送ることによって、 init を促して getty をイネーブルする
9)/etc/utmp の uid 名をクリアする
履歴
最初の開発者は Allan Wikes(fisher!allan) です。
1983年の6月8日に W.Sebok(astrovax!wls) によって、 モデムの制御をオン/オフする際にカーネルをハックするのではなく、 Tsutomu Shimomura{astrovax,escher}!tsutomu が書いたプログラムから借用した サブルーチンを使って、カーネルのサービスを利用するように変更されました。
W.Sebok によって何度も作り直されました (ずたずたにハックされた)。
関連ファイル
/dev/kmem, /vmunix, /etc/ttys, /etc/utmp, /dev/tty∗
バグ
キャリアの検知には、NEWS-OS 2.X(4.2 BSD)では、TIOCMGET ioctl が必要になります。 しかし、dz と dmf ドライバが DH11 のモデム制御ビットのエミュレーションを 使っているにもかかわらず、この ioctl は vanilla 4.2 BSD の dh ドライバでは 実現されていません。この問題は、このプログラムでは解決されています。
モデムの制御とデバイスのオープンの間には、 いくらかの時間(現在は2秒)が必要です。これはおそらく、オープンの実行が、 許可されている getty と競合するためです。この時間は、負荷の大きいシステムでは 十分ではないでしょう。この問題と上記の dh ドライバの問題のため、 TIOCMGET ioctl が失敗したときにエラーメッセージを出さないようにしています。
以前、init プロセスには同期に関する同様の問題がありました。 ダイヤルインがディスエーブルされる際に、 init が /etc/utmp をクリアするまで、 プロセス名を大文字にしたものが /etc/utmp に書き込めないのです。 しかし、これがどのくらいの時間がかかるものか誰にもわからず、 負荷の大きいシステムではかなりの時間になることもあります。 この問題は、
1)名前を書き込み、2) init を促し、 3)プロセスが 1 秒待って、/etc/utmp からエントリがクリアされたかどうかを 繰り返しチェックするループに入り、 4)名前を再度書き込む、
という手順によって解決されました。
NEWS-OSRelease 4.1C