pepoとネットワークを語ろう

40年前からこれまでとこれからのネットワークを語る

telnetクライアントへの道その7

2009-08-08 17:29:31 | Linux

前回では、最初に端末のWindowサイズをサーバへ送信すればmanも↓↑を操作しても正常な位置に表示出来るのが分かったと思う

では、途中でWindowサイズがユーザの手で変更された場合はどうか

当然の事であるがそれを検出して、サーバへ変更後のWindowサイズを送信しなくてはならない

手法としては以下の2つが考えられる

1.あるタイミング、例えば1~2秒毎にtigetnum()関数で変更後のWindowサイズを調べてサーバへ通知してやる又は変更前と変更後のサイズを比較して変化があらば通知する

2.Windowサイズを変更されたら事を検出、tigetnum()関数で変更後のWindowサイズを調べてサーバへ通知する

1の方法でも出来ないことは無いが、スマート方法でないように思う

それでは2の方法の『Windowサイズを変更されたら事を検出』をどのように行うかが肝となる

それには、シグナルの補足と処理が必要になる詳しくは下記のURLを見て欲しいが

http://www.linux.or.jp/JM/html/LDP_man-pages/man7/signal.7.html

ここで使うシグナルはSIGWINCHで『ウィンドウ リサイズ シグナル』である、つまりwindowのサイズが変更されたらこのシグナルが発生する、これを補足して処理をすればよい事になる

では実際のコード

SIGWINCHを補足と関数の呼び出し

signal(SIGWINCH, win_size_update);

シグナルタイプの宣言と処理

sigtype win_size_update() {
    send_window_size();
}

現在のwindowサイズを取得してサーバへ送信

send_window_size() {
  int dummy = 0;
  setupterm(NULL, fileno(stdout), (int *) 0);
  my_height = tigetnum("lines");
  my_width = tigetnum("cols");
  sprintf(f3,"%c%c%c%c%c%c%c%c%c",IAC,SB,TELOPT_NAWS,dummy,my_width,dummy,my_height,IAC,SE);
  write(fp2,&f3,9);
  return;
}

では実際のログインとmanで表示させwindowサイズを変更して正常な位置に表示される事を確認します

[root@epicon-4.6]# epicon -n 127.0.0.1

** Welcome to epicon Version-4.6 Copyright Isamu Yamauchi compiled:Jun 27 2009 **
      exec shell         ~!
      send binary files  ~f
      call rz,sz,sx,rx   ~rz,~sz,~sx,~rx
      call kermit        ~sk,~rk
      external command   ~C
      exit               ~.


    epicon (Linux release 2.6.29.4-pepo #1 SMP Fri Jun 12 17:34:30 JST 2009) (0)

login: pepo1

Password:

[pepo1@~]$ man epicon

epicon(1)                       epicon Manuals                       epicon(1)

NAME
       epicon is Easy Personal Interface Console terminal software.  First I am sorry. Because
       my English linguistic power is very shabby, this sentence is being  translated  by  the
       machine.  Because of that, read it in the interpretation which it is tolerant of though
       it thinks that it is a little funny translation.

SYNOPSIS
       usage:
       epicon [-options [argument] [-options [argument]]
              [-b ] <--escape cannot be used
              [-c external_command]
              [-d send_charcacter_delay(ms)]
              [-D send_CR_delay(ms)]
              [-e escape_char]
              [-f send_file]
              [-F send_file_effective_delay]
              [-m ] <--input echo mode
              [-M ] <--line mode
:

pepo