著者 &a.kelly;
訳者 &a.kimura; LPDはあるホストのプリンタに関する制御の一切をおこないます. こ
こで言う制御としては, 次のことが挙げられます.
あなたのシステムを利用するのがあなた一人だけだとしたら, ア
クセス制御もヘッダページもプリンタ利用に対する課金も必要ないのに,
なぜわざわざスプーラに煩わされなければならないのか疑問に思うか
もしれません. プリンタに対する直接アクセスを許可することもできるので
すが, とにかくスプーラを使用するべきです. その理由は,
LPDスプーリングシステムを用いてプリンタを使用するためには,
プリンタ機器とLPD用ソフトウェアの両方を準備する必要があります.
本ドキュメントでは次の2段階のレベルに分けて説明をします.
この節では, プリンタ機器やプリンタを使用するためのLPD用ソフ
トウェアを設定する方法について述べます. この節の概要は次の通り
です.
この節では, プリンタにPCを接続するための様々な方法について
説明しています. ここでは, ポートやケーブルの種類, FreeBSDが
プリンタとの通信に必要なカーネルコンフィグレーションについて
も言及しています.
もし, プリンタが既に接続されていて, 他のオペレーティングシステ
ム上でプリンタからの印字に成功している場合は, 「」まで読み飛
ばすことが多分できるでしょう.
最近のPC用のプリンタほとんどには次のインタフェースの一つ
もしくは両方がついています.
プリンタをパラレルインタフェースを使って接続する場合は,
セントロニクスケーブルでプリンタとコンピュータをつないでくださ
い. 詳しい説明はプリンタ, コンピュータ, あるいは両方に付属す
る説明書に書かれているはずです.
その際, どのパラレルポートを使用したかを覚えておいてください.
FreeBSDでは最初のポートは /dev/lpt0, 2番目は /dev/lpt1 であ
り, 3番目以降も同様に続きます.
シリアルインタフェースを使ってプリンタを使う場合は, 適切
なシリアルケーブルでプリンタとコンピュータを接続してください.
詳しい説明はプリンタ, コンピュータ, あるいは両方に付属する説
明書に書かれているはずです.
「適切なシリアルケーブル」がよくわからないときは, 次のどれか
を試してみてください.
本節ではFreeBSDのLPDスプーリングシステムで印字をおこなうために
必要となるソフトウェアの設定について説明しています.
本節の概要は次のようになります.
オペレーティングシステムのカーネルのコンパイルをおこなうこと
によって, 指定されたのデバイスが機能するようになります. シリ
アル, または, パラレルインタフェースをプリンタで使用する場合,
必要なデバイスがこの指定の中に含まれていなくてはなりません.
したがって, 必要なデバイスがカーネルに組み込まれていない場合, 追
加のシリアル, または, パラレルポートをサポートするために, カー
ネルの再コンパイルが必要となるかもしれません.
シリアルポートが現在使用しているカーネルでサポートされている
かどうかを調べるためには, 次のように入力します.
カーネルがシリアル, または, パラレルポートを通じての通
信をサポートしていたとしても, システム上で動いているプログ
ラムがデータの送受信をおこなうためのソフトウェアインタフェース
がさらに必要になります. そのインタフェースは,
/dev ディレクトリにあるエントリに相当します.
パラレルインタフェースを使用している場合, FreeBSDでは,
割り込み駆動型にするか, プリンタとの通信の状況をカーネルに監
視させるかのいずれかを選択できます.
スプーリングシステムの設定に進む前に, オペレーティング
システムがプリンタにデータを送ることに成功しているかどうか
を確かめるべきでしょう. これにより, 印字がうまくいかないと
き, プリンタとの通信が問題なのか, スプーリングシステムが問
題なのかを分けて調べることがかなり容易になります.
プリンタをテストするためには, プリンタに何かのテキストを送
信してみます. 送信した文字をすぐに印字してくれるプリンタに
は,
%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto
/Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage
この節では, FreeBSDがパラレルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について説明し
ています.
この節では, FreeBSDがシリアルポートに接続されたプリ
ンタと通信できているかどうかを調べる方法について述べられ
ています.
ここまでで, プリンタはコンピュータに接続され, (必要なら)
プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ
リンタに送信することができているはずです. これで, LPDにプリ
ンタへのアクセスを制御させる設定をおこなう準備が整いました.
LPDの設定は /etc/printcap を編集することでおこないます.
LPDスプーリングシステムはスプーラが使われる毎にこのファイル
を参照します. そのため, ファイルを更新するとすぐにその変更が
反映されます.
/etc/printcap の編集はお好みのテキストエディタをお
使いください. このファイルの書式は,
/usr/share/misc/termcap や /etc/remote
といった他のケイパビリティファイルと一致しています. この書式
のついての詳細な情報については cgetent(3) をご覧ください.
スプーラの単純な設定法は, 次のステップでおこないます.
最初の (簡単な) ステップで, プリンタの名前を考えます. プ
リンタには別名をいくつか付けることもできるので, 機能的な名前
でも風変わりな名前でもどちらを選んでもまったく問題はありません.
少なくとも1つのプリンタには, /etc/printcap の中
で, /etc/printcap ファ
イルに設定します. プリンタ名は一番左のカラムから書き始めま
す. 別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに
コロンを置きます.
次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと
Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義
されている /etc/printcap のスケルトンを記しています.
LPDスプーリングシステムでは, デフォルトでジョブ毎に/etc/printcap スプーラの簡単な設定の次のステップでは, /var/spool 「」では, FreeBSD でプリン
タとの通信に使用される /dev ディレクトリ内の
エントリを特定します. そして, LPD にその情報を伝えま
す. 印字するジョブを受け取ると, スプーリングシステムは,
(プリンタにデータを渡す義務がある) フィルタプログラムに
代わって指定されたデバイスをオープンします.
/etc/printcap ファイルで /dev エントリを記入します.
ここでの例では, /etc/printcap には
次のようになります.
シリアルポートにプリンタを接続した場合, プリンタにデー
タを送信するフィルタプログラムに代わり, 通信速度やパリ
ティ, その他のシリアル通信パラメータを設定することがで
きます. このことによる利点は,
ここまでで, プリンタにジョブを送るために使うテキストフィ
ルタを LPD に設定する準備が整いました. 」をご覧ください.
ここでの簡単なプリンタ設定では, プリンタにジョブを送るため,
/bin/cat を実行するだけの簡単なシェルスクリプ
トで間に合います. FreeBSD に標準で付属している
」で詳しく説明します.
最初に, 簡単なテキストフィルタであるシェルスクリプト
/usr/local/libexec/if-simple を作ってみましょ
う. 次のテキストをお好みのテキストエディタでファイルに
書き込んでください.
簡単な LPD 設定も終わりにたどり着きました. 残念ながら,
設定はこれでおしまいというわけではありません. なぜなら,
さらに, 設定をテストし, すべての問題点を解決しなくては
ならないからです. 設定をテストするために, 何かを印字し
てみましょう. LPD システムで印字をするためには,
」で紹介した,
あるテスト用のテキストを生成してくれる 簡単な LPD 設定をテストするために: 次のように入力してください.
自動的に LF を CR+LF に変換してくれる
FreeBSD 用のシリアルドライバを入手する方法. も
ちろん, このドライバはプリンタ専用に接続される
シリアルポート/etc/printcap この節では, FreeBSD で設定したプリンタを使う方法について説明
します. ここでは, ユーザレベルでのコマンドを概説します.
ファイルを印字するためには, 次のように入力してください.
印字するようジョブを送った後で印字を中断したくなったときは,
特定のプリンタへのジョブを削除するときは, 以下の 以下のオプションは,
次の例では, デフォルトプリンタで 以下のオプションにより, ジョブのヘッダページに通常印字さ
れるテキストを 」を参照してください.
プリンタの管理者として, プリンタの設置, 設定, そして, それ
らのテストをおこなう必要がありました.
この節では, 特殊な形式のファイルを印字するためのフィルタ, ヘッ
ダページ, ネットワーク越しのプリンタへの印字, そして, プリンタ
使用の制限や課金について説明しています.
LPD では, ネットワークプロトコル, キュー, アクセス制御, そ
して, 印字のためのその他の側面について扱いますが, 」を参照)
しかしながら, 形式変換やプリンタ課金, 特定のプリンタの癖, など
をうまく利用するためには, フィルタがどのように機能するかという
ことを理解しておくべきです. これらの側面を扱うためには, 最終的
には, フィルタの責任であるからです. そして, これは悪い情報です
が, ほとんどの場合において, /usr/libexec/lpr/lpf 既に言及したように, フィルタとは, プリンタにデータを送る
際に, デバイスに依存した部分を取り扱うために LPD によって起動
される実行プログラムです.
LPD がジョブ中のファイルを印字しようとするとき, LPD はフィル
タプログラムを起動します. このとき, フィルタの標準入力を印字す
るファイルに, 標準出力をプリンタに, そして, 標準エラー出力をエ
ラーログファイル (/etc/printcap 内の /dev/console) にセットします.
LPD が起動するフィルタと, その引数が何であるかは,
/etc/printcap ファイルの内容と, ジョブの起動時に
ユーザが指定した 」をご覧ください).
/etc/printcap で指定可能なフィルタは次の3種類がありま
す.
コンピュータと PostScript (または, 他の言語に対応し
た) プリンタをあなたしか使用しない場合は, プリンタにプレ
インテキストを絶対に送らない, そして, プリンタにプレインテキス
トを送りたがっている様々なプログラムの機能を決して使わないこと
にしてください. そうすれば, この節に書かれたことに心を煩わせる必
要はまったくなくなります.
しかし, PostScript とプレインテキストの両方のジョブをプリン
タへ送りたいと思っている場合は, プリンタ設定についての要求が増
えるでしょう. 両者をプリンタへ送信するためには, 到着
したジョブがプレインテキストであるか PostScript であるかを
検出するテキストフィルタが必要です. PostScript のジョブは
すべて 」を参照してください).
もちろん,自分自身でプログラムを取ってきて, コンパイルし, インストールす
ることもできます. /etc/printcap の中のシリアル接続した PostScript
プリンタのエントリに対して, 次を使ってください.
PostScript は質の高い組版と印字をおこなうための
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DesJet 500
# Installed in /usr/local/libexec/hpif
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it
#
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
&& exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form
# at the end to eject the last page.
#
echo $first_line && cat && printf "\f" && exit 2
fi
exit 2
最後に, 「」
に書かれた簡単な設定が完了したら, 最初に, やってみたいと思
うことは, 多分(プレイン ASCII テキストに加えて) 好みのファイル形式
のための変換フィルタをインストールすることでしょう.
変換フィルタによって, 様々な種類のファイルを印字するこ
とが簡単になります. 例えば, TeX 組版システムでたくさんの仕事
をしたと仮定しましょう. そして, PostScript プリンタが接続
されているとします. すると, TeX で DVI ファイルを作成する度に,
DVI ファイルを印字するために, これを PostScript ファイルに
変換する必要があります. このコマンドは次のようになるでしょう.
使いたいと思う変換フィルタをインストールすべきです.
DVI のデータを頻繁に印字するならば, DVI 変換フィルタ
をインストールするのが適切でしょう. 印字しなくてはなら
ない troff を大量に抱えている場合は, 多分, troff フィ
ルタが欲しくなるはずです.
次の表は, LPD で動作するフィルタと,
/etc/printcap ファイルでのエントリする項目,
そして,
/etc/printcap
ファイル形式 項目 lpr オプション
------------ ------------- ----------
cifplot cf -c
DVI df -d
plot gf -g
ditroff nf -n
FORTRAN text rf -f
troff tf -t
raster vf -v
プレインテキスト if なし, -p, または -l
先の例のように, /etc/printcap 内のエントリで,
変換フィルタは FreeBSD の基本システムのインストールとは別
にインストールするプログラムなので, 変換フィルタは, 多
分, /usr/local ディレクトリの下に置くべ
きです. フィルタは LPD だけが実行する特別なプログラム,
すなわち, 一般ユーザが実行する必要すらない
プログラムなので, /usr/local/libexec ディレ
クトリに置くのが普通です.
変換フィルタを使用可能にするためには,
/etc/printcap の目的のプリンタの適切な項目に
フィルタがあるパス名を指定します.
DVI 変換フィルタをプリンタ /etc/printcap ファイルの例を以下
に再掲します.
変換フィルタのインストールには決まったステップがないの
で, その代わりに, 例をもっと挙げることにします. これを,
自分でフィルタを作る際のガイドにしてください. 適当な例が
あったら, それをそのまま使ってください.
次のスクリプト例は, Hewlett Packard LaserJet III-Si の
ための, raster (ええと・・実は, GIF ファイル) 用の変
換フィルタです.
ここまでに述べてきたフィルタによって, 印字環境の能率が
上がったことと思います. しかし, これはどのフィルタを使
うかを ( LPD スプーリングシステムでは, ここまでにまだ取り上げていな
いフィルタ形式, 出力フィルタをサポートしています. 出力
フィルタは, テキストフィルタのように, プレインテキスト
のみを印字するために意図されたものですが, 非常に簡単化
されています. テキストフィルタを用いずに, 出力フィルタ
を使っている場合は, 次のようになります.
プログラム /usr/libexec/lpr/lpf は, FreeBSD の
バイナリ配布に付属しているテキストフィルタ (入力フィル
タ) で, 出力を字下げしたり (/etc/printcap ファイルの中の
」をご覧ください.
あなたが管理するシステムのユーザが」をご覧ください.
「」
では, /etc/printcap ファイルの
#!/bin/sh
#
# hpof - Output filter for Hewlett Packard PCL-compatible printers
# Installed in /usr/local/libexec/hpof
printf "\033&k2G" || exit 2
exec /usr/libexec/lpr/lpf
」
をご覧ください.
次に, 以前紹介したプリンタ /etc/printcap ファイルの例を示します. ここでは, ヘッ
ダページの印字を許可し, 上記の出力フィルタを追加しました.
ヘッダページの印字が許可されていると, LPD は LPD に備わっているヘッダページ出力機能を使うと, 入力され
たジョブに対して課金をおこなうことができても, ヘッダページは
これまでに述べたように, LPD ではプレインテキストのヘッ
ダページをたくさんのプリンタに合うように生成することができます.
残念ながら, PostScript プリンタは, プレインテキストを直接
印字することができません. ですから, LPD のヘッダページ機能は
まったく役に立たない, あるいはほとんどの場合で役に立ちません.
ヘッダページを出力するための自明な方法の1つに, すべての変換フィ
ルタとテキストフィルタにヘッダページを生成させる方法があります.
フィルタは, 適切なヘッダページを生成するために, ユーザ名とホス
ト名の引数を使うべきです. この方法の欠点は, いつでも,
#!/bin/sh
#
# make-ps-header - make a PostScript header page on stdout
# Installed in /usr/local/libexec/make-ps-header
#
#
# These are PostScript units (72 to the inch). Modify for A4 or
# whatever size paper you are using:
#
page_width=612
page_height=792
border=72
#
# Check arguments
#
if [ $# -ne 3 ]; then
echo "Usage: `basename $0` FreeBSD では, ネットワーク越しの印字, すなわち, ジョブをリ
モートプリンタに送ることをサポートしています. リモートプリンタ
からの出力をするには, 一般に, 次の2つを参照してください.
LPD スプーリングシステムでは LPD (または LPD 互換のシス
テム) が起動している他のホストへジョブを送る機能が始めからサポー
トされています. この機能により, あるホストに接続されたプリンタ
へ, 他のホストからアクセスできるようになります. また, LPD プ
ロトコルを理解するネットワークインタフェースを持ったプリンタに
対しても, この機能は働きます.
リモートプリンタへの出力を許可するためには, 最初に, あるホスト
(これを, 」に書かれた簡単なプリンタの設定をおこなってください. 必要ならば,
「」にあ
る, 更に進んだ設定をおこなってください. そして, そのプリンタをテス
トしてうまく動作することを確認し, LPD に許可した機能がうまく働
くかどうかを見てください.
LPD 互換のネットワークインタフェースを持つプリンタを使用してい
る場合は, そのプリンタ自身が以下で説明する/etc/printcap プリンタのネットワークインタフェースカードは, 2種類に分
類することができます. 1つはスプーラをエミュレートするもの (高価)
で, もう1つはシリアルやパラレルポートを使うようにプリンタにデー
タを送ることができるだけのもの (安価) です. この節では, 後者の使
い方を説明します. 前者のプリンタは, 前節「」
の方法が適用できます.
/etc/printcap ファイルでは, シリアルかパラレルのイン
タフェースのどちらを使うのか, そして, (シリアルインタフェース
を使う場合) そのボーレートはいくらであるか, フロー制御は使うのか,
タブのための遅延を加えるのか, 改行文字を変換するかなどの指定を
おこなうことができます. しかし, TCP/IP や他のネットワークポートか
らデータを受け取るプリンタを接続するための指定をおこなうことはでき
ません.
ネットワーク接続されたプリンタにデータを送るためには, テキスト
フィルタと変換フィルタから呼び出すことができる通信プログラムを
開発する必要があります. 以下に, そのようなプログラムの例を示し
ます. スクリプト
#!/usr/bin/perl
#
# netprint - Text filter for printer attached to network
# Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 本節では, プリンタの利用に制約を与えるための情報を記して
います. LPD システムでは, プリンタ (ローカル, リモートのいずれ
に接続されていても) にアクセスできる人を制限する機能, 複数部の
コピーの印字の可否を制御する機能, ジョブのサイズの最大値やプリ
ンタキューに入るジョブの最大個数を制御する機能を提供しています.
LPD システムではユーザが複数部のコピーの印字を簡単におこなう
機能を提供しています. ユーザが, (例えば) /etc/printcap ファイルに それぞれのプリンタを使用できる人を限定するには, UNIX の
グループ権限のメカニズムを利用し, さらに,
/etc/printcap で たくさんのユーザからプリンタが利用される場合には, 多分,
ユーザが印字要求を出すことができるファイルのサイズに上限値を置
く必要が生じるでしょう. 結局のところ, スプーリングディレクトリ
が置かれているファイルシステムの空き容量がその上限値になる訳で
すが, あるユーザがこれを独占的に使用すること避けるために, 他ユー
ザからのジョブ用の空き容量を確保する必要もあります.
LPD では,
#
# /etc/printcap for host rose
#
#
# No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
この場合もそうですが, この制限はローカル (ホスト rose) のユーザ
のみに適用されます. リモートホストからプリンタを利用できるよう
に設定している場合は, そのリモートホストのユーザはこの制限を受
けません. これらのユーザにも制限を加える場合は, リモートホスト
の /etc/printcap の 」を参照してください.
リモートホストに接続されたプリンタへのジョブのサイズを制限する
特別な方法は他にもあります. これについては, 「」を参照してください.
LPD スプーリングシステムでは, リモートホストから要求され
たジョブの印字を制限するための方法がいくつか提供されています.
という訳で, 印字するためには料金をとることが必要です. 取ら
ない理由などありましょうか. 紙やインクにはお金がかかります. そ
して, プリンタの維持費もかかります. プリンタには可動部分が搭載
されており, これらの部分は壊れやすいという傾向があります. プリ
ンタや, その利用形態, 維持費について調査をし, 1ページ (1フィー
ト, 1メートルなど) 当たりにかかるコストを調べておいてください.
これに基づき, プリンタの利用に対する課金を, 実際に, どのように
始めればよいのでしょうか.
さて, 残念ながら, この部分に関しては LPD スプーリングシステム
はほとんど役に立ちません. 課金は使用しているプリンタの種類, 印
字するもののファイルの形式, プリンタの利用に対する課金での」をご覧く
ださい.
一般に, 課金方式には次の2つがあります.
FreeBSD には, 「定期的に課金する方法」による課金をすぐに
設定できるように, 2個のプログラムを添付しています. そ
の内の1つはテキストフィルタ 」をご覧ください. もう1つは, 」で述べたように, LPD では
テキストフィルタや変換フィルタを起動しますが, そのコマ
ンドラインで使用している課金データファイルの名前が指定
されます. 両フィルタはこの引数を使って, どの課金データ
ファイルのエントリに書き込めばよいのかを知ることができ
ます. このファイルの名前は /etc/printcap 中の
課金を, リモートホストからの印字でさえも, 正確におこなうため
には, ジョブで使用された紙が何ページであるかを特定でき
る必要があります. このことは, プリンタ利用に対する課金
をおこなう上の根本的な問題です.
プレインテキストのジョブの場合, 問題を解決するのはさほ
ど難しくはありません. ジョブが何行であったかを数え, プ
リンタがサポートしている紙1ページに印字できる最大の行
数と比較すればよいのです. 重ね打ちするために利用される
ファイル中のバックスペース文字や, 物理的に複数の行に渡
る長い論理行に対する取り扱いを忘れずにおこなってください.
(「」で紹介した) テキストフィルタ このマニュアルを最初から通読されている方ならば, ここまでで,
FreeBSD 付属の LPD スプーリングシステムに関して知っておくべき
ことすべてを学ばれたことと思います. 多分, このシステムに
あるたくさんの欠点について認識できたことでしょう. すると,
「(FreeBSD 上で動作する) スプーリングシステムには他にどのような
ものがあるのか」という疑問が自然と湧いてきます.
残念ながら, 著者は代替のスプーラを
このドキュメントの開発の手助けをして頂いた以下の方々に感謝の
意を表わしたいと思います.
printer:dv=/dev/ttyd2:br#19200:pa=none
#
# /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
この例では, 最初のプリンタに
#
# /etc/printcap for host rose - no header pages anywhere
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:
この書式を正しく使うための注意をしておきます. 最初の行は左
端のカラムから始まります. それに続く行は TAB ひとつ分だけ
字下げします. 最後の行以外のすべての行は, 行末にバックスラッ
シュを記述します.
#
# /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:
/etc/printcap でプリンタの /dev/lp を使用します. /dev/lp は,
現在の FreeBSD には存在していません.
設置したプリンタがパラレルポートに接続されている場合は,
「」まで読み飛ばしてください.
そうでない場合は, 次節の説明に続いてください.
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
/bin/cat && exit 0
exit 2
そして, このファイルを実行可能にします.
#
# /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\
:if=/usr/local/libexec/if-simple:
#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.
/bin/cat && printf "\f" && exit 0
exit 2
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Writes a form feed character
# after printing job.
printf "\033&k2G" && cat && printf "\f" && exit 0
exit 2
ホスト orchid にある /etc/printcap の
例を以下に示します. ここには, 一番目のパラレル
ポートにプリンタ (Hewlett Packard LaserJet 3Si)
が一台接続されており, そのプリンタ名は
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
#
# /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
DVI フィルタは /usr/local/libexec/psdf という
名前のシェルスクリプトです. このスクリプトは次のように
なっています.
#!bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
このスクリプトでは, 」
を参照してください) を LPD に与えられた引数を付けて起動
します.
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
ここでは, GIF ファイルから PNM (portable anymap) 形式
に変換し, 次に PGM (portable graymap) 形式に変換してか
ら, LaserJet/PCL-互換データに変換しています.
上記のフィルタを使うプリンタのためのエントリを付け加え
た /etc/printcap ファイルは次のようになります.
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
次のスクリプトは, PostScript プリンタ
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
上記のスクリプトではプリンタとの通信をおこなうため,
#!/bin/sh
#
# pstf - Convert groff's troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
これで完成しました. 次に, フィルタを使用可能にするため
に /etc/printcap に加える必要があるエントリを
示します.
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:\
:of=/usr/local/libexec/hpof:
さて, ユーザが 」
をご覧ください.
/etc/printcap 中の
#!/bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
orig_args="$@"
fail() {
echo "$@" 1>&2
exit 2
}
while getopts "x:y:n:h:" option; do
case $option in
x|y) ;; # Ignore
n) login=$OPTARG ;;
h) host=$OPTARG ;;
*) echo "LPD started `basename $0` wrong." 1>&2
exit 2
;;
esac
done
[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"
( /usr/local/libexec/make-ps-header $login $host "DVI File"
/usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
このフィルタがユーザ名やホスト名を決定するために引数リストをど
のように解析しなくてはならないかという点に注意してください. こ
の解析方法は他の変換フィルタに対しても同様です. しかしながら,
テキストフィルタについては, 引数の設定が少し異なっています (こ
れについては, 「」をご覧ください).
前述の通り, 上記の手法は, 極めて単純なのにも関らず, 」で紹介したトリックを使う必要があります. すな
わち, LPD が生成するヘッダページの解析をおこない, PostScript
版のヘッダページを出力させる出力フィルタを作るのです. この場
合, ユーザが
#!/bin/sh
#
# diablo-if-net - Text filter for Diablo printer `scrivener' listening
# on port 5100. Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
#
# /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
これ以外の /etc/printcap ファイル (ホスト orchidのもの)
はそのままにしておくことにします. もちろん, orchid のユーザは
全員
orchid
violet
madrigal.fishbaum.de
この例では, rose はホスト orchid, violet, そして
madrigal.fishbaum.de からの要求を受け付けることになり
ます. その他のホストが rose の LPD にアクセスしようと
しても, LPD はこれを拒否します (訳注:拒否されるのは,
そのホストが /etc/hosts.equiv にも含まれてい
ない場合です).