Le démon lpd
fournit cinq attributs que vous pouvez positionner
dans /etc/printcap
afin de contrôler le port série
sur lequel se trouve votre imprimante.
br
(numerique) definit le taux de transfert en bauds (appel a ioctl(2))
fc
(num) efface des indicateurs (sgtty.h)
fs
(num) positionne des indicateurs (inverse de `fc')
xc
xs
Pour définir la vitesse du port, la syntaxe est évidente. Exemple: br \#9600.
Les autres paramètres à positionner correspondent à un ensemble de bits, que l'on pourra soit positionner, soit mettre à 0. Pour effacer des bits, on utilisera les paramètres fc et xc, pour les positionner, fs et xs.
Faites bien attention aux bits que vous sélectionnez. Mais au fait
que sont-ils ? Souvenez-vous..., la commande stty
. Elle indique de
nombreux paramètres caractérisant un tty. La commande
stty -a
affiche en clair les paramètres du tty, certains
d'entre-eux étant précédés d'un tiret s'ils
sont invalidés et sans tiret s'ils sont validés. La commande
stty
peut être appliqués au port série (voir
exemple). Ce sont certains de ces paramètres (des drapeaux, des
flags, donc des bits) que l'on va manipuler.
# stty -a < /dev/ttyS2
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop
-echoprt -echoctl -echoke
Note: utilisez toujours stty
de cette façon (stty <
/dev/ttyS?
); cette command utilise en effet l'entrée standard).
Vous pouvez utiliser cette commande pour configurer le port de façon
à obtenir une impression correcte. Par exemple, les
différences que l'on peut noter entre le stty ci-dessus et
l'initialisation du port au démarrage de ma machine réside
dans les informations -clocal
, -crtscts
et ixon
.
(La configuration de votre port pourra très bien être
différente selon la manière dont votre imprimante gère
le contrôle de flux).
Votre port étant bien configuré, faites : cat fichier>
/dev/ttyS?
(? est le numéro de votre port) pour imprimer un
fichier.
Imprimez par exemple le fichier
/usr/src/linux/include/asm-i386/termbits.h
. Vous y
découvrirez un tas de définitions de constantes et de
structures. Nous allons voir quelles valeurs définies dans ce
fichier vont nous servir pour configurer le port, non plus avec stty, mais
avec les paramètres fc
, xc
, fs
et xs
du fichier
printcap. Regardez la section commençant par :
/* c_cflag bit meaning */
#define CBAUD 0010017
Elle décrit justement les bits manipulables à l'aide de fc et
fs dont on parlait. On y voit les constantes des vitesses de modulation en
baud, puis des lignes qui nous intéressent particulièrement :
ce sont les mêmes paramètres que dans la commande
stty
. Je sens que vous voyez où on veut en venir. stty
n'est qu'un interface nécessaire au positionnement (ou effacement)
de bits.
Vous savez maintenant que chaque paramètre affiché par
stty
correspond à un bit, et qui ont la valeur 0 lorsqu'il y a
un tiret devant. Notez alors les bits à effacer (ce sera fait avec
la paramètre fc
) et ceux à positionner (paramètre
fs
). Exemple: `fc\#0177777'
(Attention le paramètre
fc
semble surcharger le paramètre br
, donc prenez garde
à les positionner correctement).
Ensuite occupez-vous des bits à positionner. Par exemple s'il faut
positionner les bits cs8
, hupcl
et cread
, regardez les
constantes CS8
(0000060), HUPCL
(0002000) et CREAD
(0000200). Pensez à la vitesse de modulation qu'il faut aussi
définir, dans mon cas, ce sera B9600
(0000015). Tous ces bits
ensemble font `0002275'. Indiquez cette valeur au paramètre
fs
.
Effectuez les même réglages avec la section suivante intitulée
/* c_lflag bits */
Dans mon cas je n'ai rien à positionner, j'ai donc simplement
à fournir la valeur xc\#0157777
, puis xs\#0
. Une fois
votre fichier printcap correctement défini, essayez d'imprimer. Si
quelque chose ne va pas, continuez à lire les paragraphes suivants.
Souvenez-vous de toujours commencer par les bits que vous souhaitez voir
à 0 (fc
et xc
), puis de définir seulement
après des bits à positionner (fs
et xs
).
La commande cat
fonctionne pour le port série, mais pas
lpd
La mise en place de lpd
n'est pas traitée ici, mais sachez que
si vous avez des problèmes avec la configuration du port
série, vous pouvez empêcher lpd
de le configurer en
considérant votre imprimante comme ne présentant pas une
interface normale. Lisez également à ce propos le chapitre
suivant.
Donnez à votre imprimante le périphérique
/dev/null1
(mknod /dev/null1 c 1 3
). N'utilisez pas
/dev/null
, pour ne pas qu'il soit ouvert de manière
exclusive. Enlevez les paramètres de vitesse et de positionnement
des bits du fichier printcap
.
Créez un shell-script comme ci-dessous :
#!/bin/sh
echo if: $*>> /var/spool/lpd/results
# /dev/lp est un lien vers /dev/ttyS2 auquel est reliee l'imprimante
exec votre_vieux_filtre $*> /dev/lp
...ou si vous n'avez pas de paramètre `if' configuré...
#!/bin/sh
echo if: $*>> /var/spool/lpd/results
cat> /dev/lp
# la commande ``echo -ne'' suppose que /bin/sh correspond a bash
echo -en \\f> /dev/lp
Donnez-lui les droits de lecture/écriture pour tout le
monde. Essayez-le: /usr/lib/lpd/if <FICHIER
.
Définissez un filtre d'entrée dans votre fichier
printcap
pour appeler ce script. :if=/usr/lib/lpd/if:
.
Utilisez la commande stty
pour configurer le port
correctement. Essayez d'imprimer. Vous devriez pouvoir déterminer
si le(s) fichier(s) sont bien mis dans le répertoire de spool. Cela
devrait imprimer, si votre essai manuel du script précédent a
fonctionné. Bien entendu, le mieux serait de pouvoir se passer du
script d'entrée et donc du paramètre if
.
Supposons donc que la méthode précédente a
fonctionné, et que vous pensez avoir correctement configuré
votre fichier printcap. Exécutez la commande stty -a
</dev/ttyS?
. Si certains paramètres ne sont pas corrects,
vérifiez les constantes du fichier termbits.h
. Si la
configuration est incorrecte, malgré tous vos efforts de
vérification, n'hésitez pas à installer un
démon récent.
Certaines anciennes imprimantes séries ont des petits tampons
mémoire et gèrent mal le contrôle de flux. Supprimer
le FIFO du port série (16550) avec setserial
(faites croire
à setserial que c'est un port 8250 et ça marchera).