FreeBSD QandA 1079

FreeBSD QandA

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 まで お知らせください。