FreeBSD QandA 558

FreeBSD QandA

Q. FreeBSD 2.2.5-RELEASEにおいてリモートプリンタに印刷しようとすると、
   印刷が途中で止まってしまい、lpqコマンドで調べると
   `Warning: no daemon present'
   と言われてしまいます。何故でしょう?

A. 2.2.5-RELEASEでは、リモートプリンタへの出力中に/etc/printcapの`ct'の
      項目に指定している時間(デフォルトでは120秒)が経過すると実際にデータを
      転送している子プロセスをlpdデーモンが殺してしまうそうです。
        回避策としては、/etc/printcapのリモートプリンタの項に`ct#0'(0はこ
      の場合無限大を意味する)という記述を加える、あるいは、lpdを2.2-stable
      のものと入れ替えるといった方法があります。以下のパッチを当ててもよ
      いでしょう。

   Index: src/usr.sbin/lpr/common_source/displayq.c
   ===================================================================
   RCS file: /home/ncvs/src/usr.sbin/lpr/common_source/displayq.c,v
   retrieving revision 1.4.2.5
   retrieving revision 1.4.2.6
   diff -u -u -r1.4.2.5 -r1.4.2.6
   --- displayq.c	1997/10/15 12:25:35	1.4.2.5
   +++ displayq.c	1997/11/07 13:20:29	1.4.2.6
   @@ -242,6 +242,7 @@
    	savealrm = signal(SIGALRM, alarmhandler);
    	alarm(CT);
    	fd = getport(RM, 0);
   +	alarm(0);
    	(void)signal(SIGALRM, savealrm);
    	if (fd < 0) {
    		if (from != host)
   Index: src/usr.sbin/lpr/lpd/printjob.c
   ===================================================================
   RCS file: /home/ncvs/src/usr.sbin/lpr/lpd/printjob.c,v
   retrieving revision 1.11.2.3
   retrieving revision 1.11.2.4
   diff -u -u -r1.11.2.3 -r1.11.2.4
   --- printjob.c	1997/10/15 09:56:00	1.11.2.3
   +++ printjob.c	1997/11/07 13:20:37	1.11.2.4
   @@ -1474,6 +1474,7 @@
    		savealrm = signal(SIGALRM, alarmhandler);
    		alarm(CT);
    		pfd = getport(cp, port);
   +		alarm(0);
    		(void)signal(SIGALRM, savealrm);
    		if (pfd < 0 && errno == ECONNREFUSED)
    			resp = 1;
   @@ -1541,6 +1542,7 @@
    		savealrm = signal(SIGALRM, alarmhandler);
    		alarm(CT);
    		pfd = getport(RM, 0);
   +		alarm(0);
    		(void)signal(SIGALRM, savealrm);
    		if (pfd >= 0) {
    			(void) snprintf(line, sizeof(line), "\2%s\n", RP);

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。