材料
Solaris [ developper ]がインストールされたコンピュータ。
今回は Solaris2.6 / Ultra1 を素材にしました。
プリンター
今回は Canon 製の LBP を素材にしました。
プリンタ用のフィルタープログラム
今回は plane text を LIPS に出力する txttolips , xwd の結果を lips に出力する xwdtolips を素材にしました。
料理の方法
料理方法に 3 種類あります。目的と性格に合わせて選びましょう。
terminfo にプリンタの機種を登録
terminfo データベースに接続するプリンタを登録します。きっと希望のプリンタは無いのではないかと思います。
# cd /usr/share/lib/terminfo
# ls
1 3 5 7 9 B H P a c e g i k m o q s u w y
2 4 6 8 A G M S b d f h j l n p r t v x z
ディレクトリ u の中に unknown というまるで見透かしたようなエントリがあるので、これをベースに Canon LBP の terminfo データを作成します。
# cd u
# ls
ubell ubellchar unitrm18 unix_pc unixpc unknown uts30
infocmp (1m) を使用して unknown をテキストデータに変換します。バイナリーデータを直接エディットするのが好きな人は止めませんが、テキストの方がいいでしょ ? 名前は好きにつけてね。今回は lbp なんて名前にしましょう。
# infocmp unknown > /tmp/lbp
そのテキストデータを変更します。変更しなくても大丈夫みたいです。几帳面な方はもっと細かくチマチマ変更してください。こんな風にしてみました。
# cat /tmp/lbp
# Reconstructed via infocmp from file: /usr/share/lib/terminfo/u/unknown
unknown,
am, gn,
cols#80,
bel=~G, cr=\r, cud1=\n, ind=\n,
# vi /tmp/lbp
# cat /tmp/lpb
# Reconstructed via infocmp from file: /usr/share/lib/terminfo/l/lbp
lbp,
am, gn,
cols#80,
bel=~G, cr=\r, cud1=\n, ind=\n, ff=\f,
編集の終わったテキストデータを tic (1m) を使ってコンパイルしてバイナリデータに戻します。
で、ちゃんとできたか確認しましょう。
# tic /tmp/lpb
# cd /usr/share/lib/terminfo/l
# ls
la100 la120 lbp ln03
# infocmp lbp
# Reconstructed via infocmp from file: /usr/share/lib/terminfo/l/lbp
lbp,
am, gn,
cols#80,
bel=~G, cr=\r, cud1=\n, ind=\n, ff=\f,
プリンタの設定 ○☆
プリンタの設定を確認しましょ。
セントロニクス接続ならべつにどうでもいいです。 RS-232C の接続の場合は転送速度なんかを確認しておかないと困ってしまいます。
パラレルポートのデバイスファイルは機種によって異なるようです。
- SPARCstation5 / Ultra1 - /dev/bpp*
- Ultra5 / Ultra10 - /dev/ecpp*
になります。
プリンタ・エントリの設定 ○☆
プリンタのエントリを設定します。lpadmi
n (1m) を使用してプリンタのエントリを作成します。
- プリンタ名 ( -p )
- 使用ポート ( -v )
- プリンタ・タイプ ( -T )
さっき terminfo データベースに登録したやつね。
[お気楽料理][超お気軽料理]なら terminfo を省いたので unknown になります。 ( unknown ってフィルター・プログラムが責任持つならワイルドカードですね。 )
- デフォルト・プリンタにするかどうか ( -d )
な内容のを設定します。 admintool でもいいですよ。
シリアルポート ( /dev/term/a || /dev/term/b ) で lp というエントリをデフォルトとして作成する時
シリアル・ポートの設定は、
- cs7 : 7bit
- cs8 : 8bit
- parenb ( -parenb ) : パリティあり ( パリティなし )
- parodd ( -parodd ) : 奇数パリティ ( 偶数パリティ )
- crtscts ( -crtscts ) : ハードウェアフロー制御あり ( ハードウェアフロー制御なし )
- istrip ( -istrip ) : 最上位ビットを無視する ( 最上位ビットを無視しない )
- ixon ( -ixon ) : XON/XOFF フロー制御あり ( XON/XOFF フロー制御なし )
- tabs ( -tabs ) : タブコードを保存する ( タブコードを保存しない )
- defeucw : 文字幅デフォルト
なんてのがあります。
# lpstat -r
# lpadmin -p lp -v /dev/term/b
# lpadmin -p lp -T lbp
# lpadmin -p -o "stty='19200 -tabs -istrip -parenb cs8 defeucw'"
# lpadmin -p lp -o nobanner
# accept lp
# enable lp
# lpadmin -d lp
# lpstat -t
パラレルポート ( /dev/bpp0 or /dev/ecpp0 ) で lp というエントリをデフォルトとして作成する時
# lpstat -r
# lpadmin -p lp -v /dev/bpp0
# lpadmin -p lp -T lbp
# lpadmin -p lp -o nobanner
# accept lp
# enable lp
# lpadmin -d lp
# lpstat -t
terminfo データベースを作成せずにきちゃった時
[お気楽料理][超お気軽料理]の場合、ワイルドカードのような unknown を使用します。
# lpstat -r
# lpadmin -p lp -v /dev/bpp0
# lpadmin -p lp -T unknown
# lpadmin -p lp -o nobanner
# accept lp
# enable lp
# lpadmin -d lp
# lpstat -t
試食 1 ( 味見 ) ○☆
基本的にこれで垂れ流し状態になったはずなので、確認してみましょう。
これで何も送られてないとすると、プリンタの接続やポートの間違いなんかが考えられます。
制御コードは何も送られないので、プリンターに送られているけど排出されない事があります。その時はプリンターの[排出]ボタンかなんかで対応してください。
# lp -d lp /etc/passwd
フィルター・ファイルの設定 ○☆
フィルタープログラムなんかを置いておきます。
例では txttolips xwdtolips なんてフィルター・プログラムを使用しています。
目的に合わせたフィルターを用意しましょう。
フィルター・プログラムを置いておく場所はどこでもいいんですけど、 /usr/lib/lp の下に OS 添付のフィルターがあるようなんでそこを利用しましょ。local なんていうディレクトリを作成してその中を使うことにしましょう。
/anywhere は、適当なディレクトリに読み替えてくだされ。フィルター・プログラムの置いてある場所って感じでね。
# cd /usr/lib/lp
# mkdir local
# chown lp local; chgrp lp local
# cd local
# cp /anywhere/txttolips .
# cp /anywhere/xwdtolips .
# chown lp *; chgrp lp *
# chmod 755 *
無理矢理フィルターの登録 ☆
[超お気軽料理]だけの方法です。強制的にフィルターを使用するようにしてしまいます。これでいいのかな ? わからないけど、動きます。責任は持ちませんよ。
/etc/lp/interfaces というディレクトリの下にプリンタ・エントリ名のファイルが出来ているはずなので、強制的に書き換えてしまいます。下の例のあたり ... に
# cd /etc/lp/interfaces
# vi lp
:${CHARSET:=cs0}
if [ -z "$(FILTER)" ]
↓
:${CHARSET:=cs0}
FILTER="/usr/lib/lp/local/txttolips"
if [ -z "$(FILTER)" ]
フィルタ記述ファイルの登録 ○
/etc/lp/fd/***.fd というフィルタ記述ファイルにフィルターを登録します。
# cd /etc/lp/fd
# vi txttolips.fd
# cat txttolips.fd
Input type: simple
Output type: lipstxt
Printer type: lbp
Printers: any
filter type: fast
Command: /usr/lib/lp/local/txttolips
[お気楽料理]の時は Printer type は、 unknown にしましょ。
# cd /etc/lp/fd
# vi txttolips.fd
# cat txtf.fd
Input type: simple
Output type: lipstxt
Printer type: unknown
Printers: any
filter type: fast
Command: /usr/lib/lp/local/txttolips
フィルタの設定 ○
プリンタ名とフィルタを関連付けましょう。
-l で指定する lipstxt は先に作成した txttolips の Output type: に書かれたものと同じにしましょう。これで File Contents が指定されるようです。
# lpadmin -p lp -I lipstxt
# lpfilter -f txttolips -F /etc/lp/fd/txttolips.fd
この後、 admintool で[変更]なんてすると File Comtents が初期値の PostScript になってしまうので、これをやり直すことになります。
試食 2 ( 味見 ) ○☆
また印刷してみましょう。
これでフィルターを通った出力になっているはずです。
# lp -d lp /etc/passwd
味の調製 ○☆
プリンタ・エントリの作成時に lpadmin -p lp -o nobanner と設定しているのにバナーがでちゃうと思います。この設定ってなんなんだろう ?
バナーがいらない時 lp の出力時にまたオプションで指定しなければなりません。
なので、強制的にいらない場合は設定ファイルを直接編集しちゃいましょう。
/etc/lp/interfaces というディレクトリにプリンタ・エントリ名でファイルがあると思いますので banner の項をいじっちゃいます。
# cd /etc/lp/interfases
# vi lp
nobanner="no" → nobanner="yes"
プリンタ・エントリの削除 ○☆
作ったプリンタ・エントリを削除したい時は lpadmin -x で行います。 間違えないように lpstat -t で確認してからにしましょ ... lpadmin -x ってなんのメッセージもださないんもん。
# lpstat -t
# lpadmin -x lp
プリンタの状況確認
プリンタ君はご飯を食べてる最中かな ? なにか食事中なら job id と共に表示されます。
# lpstat -o
プリンタ君のご飯を中断しちゃえ。
上の lpstat -o の出力結果の request ID を使用します。ユーザーは自分で出力したのしか中断できませんよ。
# cancel [ request ID ]
どのプリンタ君が使用可能か調べちゃえ。
# lpstat -s
プリンタ君のいろんな状態を調べちゃえ。
# lpstat -t
# lpstat -tl
# lpstat -l raw -l
プリンタ君が元気かどうか調べちゃえ。
# lpstat -p