다음 이전 차례

13. 다섯번째 예: XmDipmon

Bullwinkle: Hey Rocky, watch me pull a rabbit out of my hat.
Rocky:      But that trick never works.
Bullwinkle: This time for sure.
            Presto!
            Well, I'm gettin' close.
Rocky:      And now it's time for another special feature.
            --- "Rocky and His Friends"

XmDipmon 은 인터넷 연결 상태를 보여주는 버튼을 표시하는 작고 재미있는 응용 프로그램이다. 낡은 전화선에서는 흔히 연결이 끊어지곤 하는데, 그런 경우에는 반짝거리면서 경고음을 낸다. 불행히도, XmDipmon은 dip 과만 작동하는데, 이때문에 인터넷 연결에 chat를 쓰는 대부분의 사람들에게는 쓸모가 없다.

XmDipmon 을 컴파일하는 것은 문제가 아니다. XmDipmon은 Motif 라이브러리에 링크되어 있지만, Lesstif와도 잘 컴파일되고 잘 실행된다. 이번 도전은 chat를 쓸 때도 작동되도록 패키지를 고치는 것이다. 이 작업은 실제로 소스 코드를 땜질하는 것까지 포함하고 있으며, 따라서 프로그래밍에 대한 지식이 어느 정도 필요하다.

         "실행되면, xmdipmon 은 /etc/dip.pid 라는 파일을 확인한다. (-pidfile 의 
         명령행 인자를 써서 다른 파일을 찾도록 할 수도 있다.)  이 파일은 dip 
         데몬의 PID 를 포함하고 있다. (dip 는 일단 연결이 이루어지면 자신을 
         데몬 모드로 전환한다.)"
                       --- XmDipmon README 파일로부터 인용.

-pidfile 옵션을 주어 실행하면, XmDipmon이 chat 로그인이 성공했을 때에만 존재하는 다른 파일을 확인하도록 할 수 있다. 명백한 후보는 모뎀의 lock 파일이다. 따라서 xmdipmon -pidfile /var/lock/LCK..ttyS3 로 프로그램을 실행시켜 보자. (이 명령은 모뎀이 4번 com 포트, 즉 ttyS3에 있다고 가정한 것이다.) 하지만 이것은 문제의 일부를 푼 것일 뿐이다. 프로그램은 계속 dip 데몬을 감시하며, 따라서 우리는 dip 데몬 대신 chatppp와 관련된 프로세스를 감시하도록 바꿔야 한다.

소스 파일은 하나 밖에 없으며, 다행히도 주석문이 잘 달려있다. xmdipmon.c 파일을 보면, 헤더가 아래와 같이 되어 있는 getProcFile 함수를 찾을 수 있다.

/*****
* Name:                 getProcFile
* Return Type:  Boolean
* Description:  tries to open the /proc entry as read from the dip pid file.
<snip>
*****/

결정적인 단서다. 함수 내부를 찾아보자.

                        /* we watch the status of the real dip deamon */
                        sprintf(buf, "/proc/%i/status", pid);
                        procfile = (String)XtMalloc(strlen(buf)*sizeof(char)+1);
                        strcpy(procfile, buf);
                        procfile[strlen(buf)] = '\0';

범인은 2383째 줄이다.

                        sprintf(buf, "/proc/%i/status", pid);
                                      ^^^^^^^^^^^^^^^^^^^^^

이 함수가 dip 데몬 프로세스가 실행되고 있는지 검사하는 것이다. 그러면, 대신 pppd 데몬을 감시하도록 하려면 이 부분을 어떻게 고치면 될까?

pppd 의 맨페이지를 보자.

FILES
       /var/run/pppn.pid (BSD or Linux), /etc/ppp/pppn.pid (others)
                     Process-ID for pppd process on ppp interface unit n.

xmdipmon.c의 2383째 줄을 아래와 같이 고치자.

                        sprintf(buf, "/var/run/ppp0.pid" );

고친 패키지를 다시 컴파일하자. 문제없이 컴파일된다. 이제 새로운 명령행 인자를 써서 시험해 보자. 아마 신통하게 잘 실행될 것이다. 인터넷 서비스 제공자(ISP)로 ppp 연결이 이루어져 있을 때에는 작고 파란 버튼이 표시되고, 연결이 끊어지면 반짝거리면서 경고음을 낸다. 이제 우리는 완벽하게 작동하는 chat 모니터를 갖게 되었다.

XmDipmon는 Ripley Linux Tools에서 다운받을 수 있다.


다음 이전 차례