FreeBSD QandA 1079
Q. FreeBSD 以外のマシンと talk ができません。
A. talk(1) にも書かれているとおり、FreeBSD で使用している 4.3BSD
由来の talk(1) のプロトコルは、 4.2BSD 由来のものとは互換性が
ありません。例えば SunOS などは 4.2BSD から別れているので、古い
talk プロトコルを使用しています。なお 4.3BSD 由来の talk は ntalk
と呼ばれており、ポート番号も異なるものを使っています
(grep talk /etc/services してください)。
ですから、古い talk を使っている OS と FreeBSD や NetBSD などの
間で talk を行なおうとすると、
[Checking for invitation on caller's machine]
と出てしまい、実際に talk することができません。
これを解決するには現在のところ 2 つの方法があります。
まず一つ目は古い talk を使っている OS に ntalk をインストールする
方法です。日本だと
<URL:[BROKEN!] ftp://ftp.uoeh-u.ac.jp/pub/net/ntalk.tar.gz>
から取得可能です。これをコンパイルしてインストールします。これ
以降、FreeBSD からは通常に talk を、ntalk をインストールした側
では、talk の代わりに ntalk を使えば互いに talk できるように
なります。なお FreeBSD 上で古い talk を動かすようにするプログラムは
今のところ存在しないようです。
二つ目は ytalk を使う方法です。ytalk は接続する時に ntalk が使え
れば ntalk プロトコルで、ntalk が使えなければ古い talk プロトコル
で接続を試みます。ですから相手の OS がわからず、talk と ntalk
どちらを使えばいいのかわからないという場合でも迷わず ytalk を使えば
ytalk が判断して適切なプロトコルで繋いでくれます。ただし ytalk には
talk daemon はついていないので、相手側にも ytalk をインストールして、
相手も ytalk を使うようにしないとやはりプロトコルの相違の問題が
起きてしまいます
(仲立ちをするのは既存の talkd なので、tty 上には
respond with:talk user@hostname
としか表示されませんが、そのとおりに答えると冒頭で述べた問題が
やはり起きてしまいます。ytalk user@hostname としなければならない
ことをあらかじめメールなどで確認しあっておく必要があります)
なお ytalk は複数人での同時 talk や X の窓を使った talk もできる
ように作られています。
そこまで苦労するのなら、いっそのこと phone や IRC を使った方が
いいのかもしれませんが、ytalk にはインストールに root 権限が要ら
ない、新規 daemon の起動が要らない、という利点があります。
最後に図にまとめてみます。
FreeBSD BSD4.2
x talk X <--- <--- o talk どちらも通信できない
o ntalk ---> ---> X x ntalk
(1)
FreeBSD BSD4.2
x talk X <--- <--- o talk BSD4.2 側で ntalk
o ntalk <---> <---> o ntalk を使えば通信できる
(2)
FreeBSD BSD4.2
x talk +---> ---> o talk ytalk が自動的に
o ntalk <--- + <---+ x ntalk 相手のプロトコル
ytalk --------+ +------ ytalk を判断して通信する
(3)
FreeBSD BSD4.2
phone <---> <---> phone phone を入れてしまえば
煩わしさはなくなる
[付録]
Solaris 2.x で gcc を使って ytalk をコンパイルする、あまり
よろしくない方法。
(1) FreeBSD の配布サイトの distfiles ディレクトリから
ytalk-v3pl2.tar.gz を入手する
(2) 伸長・展開する。
% gunzip ytalk-v3pl2.tar.gz
% tar xvf ytalk-v3pl2.tar
(GNU tar なら tar zxvf ytalk-v3pl2.tar.gz も可)
(3) imake がうまく動かないので X 上で動かすのをあきらめる
(4) Makefile を書き換えて、SLIBS = -lnsl -lsocket を有効にし、
CC=gcc の行を加える
% vi Makefile
-#SLIBS = -lnsl -lsocket
+SLIBS = -lnsl -lsocket
+CC=gcc
(5) 普通に make する
% make
Undefined first referenced
symbol in file
sigmask fd.o
sigsetmask fd.o
sigblock fd.o
ld: fatal: Symbol referencing errors. No output written to ytalk
と失敗する。
(6) UCB 互換ライブラリを使うようにして fd.o を作り直す。
(UCB 互換ライブラリがインストールされてない場合は、SUNWscpu
を追加インストールする)
% rm fd.o
% setenv LD_LIBRARY_PATH /usr/ucblib
% setenv LD_RUN_PATH /usr/ucblib
% make CFLAGS=-I/usr/ucbinclude LDFLAGS=-lucb
(7) できた ytalk を適当なところへほうりこむ
% cp ytalk ~/bin
% rehash
間違い・追加情報を見付けた場合は、
修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで
お知らせください。