Subject: Linux Frequently Asked Questions 6/6 [monthly posted]
From: [email-masked]
Date: Wed, 21 Jul 1993 09:52:42 GMT
Newsgroups: comp.os.linux,comp.os.linux.announce,comp.answers,news.answers

Archive-name: linux-faq/part6

Last-Modified: 93/07/11
Version: 1.20

*********************************************************
*							*
*   Answers to Frequently asked questions about Linux   *
*							*
*********************************************************

This post contains Part 6 of the Linux FAQ (6 parts).
It must be read *after* the 5 first parts. 

===================================8<====>8============================
CONTENTS (of this part)

	XIV.	EVERYTHING FOR PRINTING		(part6)
	XV.	UUCP/NEWS/MAIL for LINUX	(part6)

===================================8<====>8============================

XIV.  EVERYTHING FOR PRINTING
=============================
**** This is the lpd FAQ version 1.4 (last update july), this
**** section is maintained by Brian McCauley. Please send any
**** suggestion to: [email-masked]

 XIV.01)  What _is_ the Linux lpr/lpd package?

ANSWER: To quote the net-FAQ:

Lpr is a utility that is used to print files out to local and remote
printers. As with all networking, there are configuration files which
have to be tailored to your needs. These files are concerned with
access control, accounting and page setup of your printer(s).  Now all
control of the printer is performed by a process called lpd

Lpd is a laser printer daemon (yes I know an epson isn't a laser
printer but thats besides the point). The program lpd is normally
started in /etc/rc.local in either the forground or the background.
What happens is that lpd will sink back as a daemon, only ever being
invoked when a printer request is generated. lpd itself has some
options which are of possible intrest to some people chiefly that of
the '-l' flag which causes lpd to log requests recieved from the
network (useful for debugging). The other option is for what port lpd
should listen for data on and is generally not used.

[ Note: lp really stands for line printer but as technology has
advanced laser printer makes more sense. Note also that lpr can be
used for queuing requests to use any specialised resource on a network
not just hardcopy output devices. ]

 XIV.02)  What is _the_ Linux lpr/lpd package?

ANSWER: Up until 28th May 1993, as far as there is a definitive Linux
version of anything _the_ Linux lpr/lpd is <[email-masked]>
Ross Biro's port of the BSD sources dated 20th November 1992 (so if
you're used to AT&T's you'll find some differences).  Ross's binaries
and the diffse wer found in:

tsx-11.mit.edu:pub/linux/binaries/usr.bin/lpr.tar.Z
sunsite.unc.edu:pub/Linux/system/Daemons/lpr.tar.Z

The SLS file lpr.tgz on disk b2 contained the same stuff.

In addition to the standard BSD lpr capabilities Ross Biro's port
should have had better support for serial printers (but it didn't work
in the old binaries).

Ross's port was not based on the latest BSD sources (by about 3 years,
'88 vs '91). His new release will also be based on these sources which
can be found are at:

gatekeeper.dec.com and /afs/ir.stanford.edu/src/...

However this changed as of about 28th May 1993 so from now on this
version will be called the "old" binaries. On or about that date two
different new releases of lpd appeared. One of these was a version of
Ross's with bug fixes in:

sunsite.unc.edu:pub/Linux/system/Daemons/lpr.tar.z
tsx-11.mit.edu:pub/linux/binaries/usr.bin/lpr.tar.z

The other is a port of the '91 BSD sources by
<[email-masked]> Fred van Kempen port and is availble as
source:

tsx-11.mit.edu:pub/linux/packages/net/net-2/sources/lpd/

or as part of the net-2 binary release in:

tsx-11.mit.edu:pub/linux/packages/net/net-2/binaries/net-std.tar.z

Original '91 BSD sources are all over the place.

ftp.uu.net:systems/unix/bsd-sources/usr.sbin/lpr/
src.doc.ic.ac.uk:unix/bsd-sources/usr.sbin/lpr/

to name but two. The BSD sources have unGNU things in their Makefiles
so they don't compile ``out of the box''.

Ross agrees that Fred's version should be thought of as _the_ Linux
lpd package. There are no significant differences that I know of and
much of this FAQ refers to the BSD lpd package or Linux in general so
this is probably not too important.

There are some other versions of lpd stuff about but I have to draw
the line somewhere. If anyone whants to maintain FAQ sections on these
they are welcome to do so. The other versions include plp and the
ka9q lp
facility. There are also rumours of SysV spoolers being ported.

 XIV.03)  How do I get lpr to work properly other than for root? Where
do the files go and what should their permissions be?

ANSWER: There is quite a bit of variation between the various releases
but I'll try where possible to offer solutions that are universally
applicable. Put /etc/lpd& in your /etc/rc or /etc/rc.local (usually in
/etc/rc.local after you start syslogd (if you use syslogd)).

Set the group fields of the file permissons/ownership as follows:

-rwxr-s---   1 root     daemon      37892 Nov 19 23:32 /etc/lpd
-rwx--s--x   1 root     daemon      21508 Nov 19 23:32 /usr/bin/lpc
-rws--s--x   1 root     daemon      17412 Nov 19 23:32 /usr/bin/lpq
-rwx--s--x   1 root     daemon      17412 Nov 19 23:32 /usr/bin/lpr
-rwx--s--x   1 root     daemon      17412 Nov 19 23:32 /usr/bin/lprm
-r-xr-xr-x   1 root     daemon       2816 May 10 13:37 /usr/bin/lptest
srwxrwxrwx   1 root     daemon          0 Feb  4 20:54 /dev/printer

...and for each of the spool directories listed in the sd fields of
/etc/printcap...

/usr/spool/lpd:
total 5
drwxrwxr-x   2 root     daemon       1024 May 18 23:00 .
drwxr-xr-x  11 root     root         1024 Feb 19 20:56 ..
-rw-rw-r--   1 root     daemon          4 May 18 23:00 .seq
-rw-rw-r--   1 root     daemon         18 May 18 23:00 lock
-rw-rw-r--   1 root     daemon         25 May 18 23:00 status

Note these 3 files are created by lpr and lpd so if you've never
run these they could be missing so touch them into being.

In Fred's port the group is ``lp'' not ``daemon''. You don't need the
socket /dev/printer for Fred's port as it keeps it's socket in
/tmp/.printer and creates/deletes it as needed.

Some of these permissions may be overkill so don't be surprised if
your system works with different permissions. The fact that lpq needs
to be suid root is inelegant and may change in the future. People tell
me that lpr must be setuid(root) but I've not seen evidence that this
is really the case as long as the file permissions on the spool queues
are right. Still as far as I know lpr is designed to be secure when
installed setuid(root).

Alternative approach: just make lpc, lpr and lprm setuid(root) then
you can almost forget the file permissions on the spool queues!

You're free to choose different directories for the executables on
your system (notably lpc is usually in /etc even though it has
commands that are useful to non-root).

There location of master lpd lock file is fixed at compile time. It is
either in /usr/spool/lpd.lock or /var/spool/lpd/lpd.lock depending on
which version of lpd you get.

My advise is keep your primary spool queue in /usr/spool/lpd and make
/var a symlink to usr or keep it in /var/spool/lpd and make /usr/spool
a symlink to ../var/spool. This gives the greatest compatibility with
the pathnames that are compiled into the various distributed binaries.

The main configuration file is /etc/printcap although the old binaries
look for it in /usr/etc/.  The old binaries' README says hosts.equiv
and hosts.lpd files are looked for in /etc/inet but again the more
accepted convention is to locate them in /etc.

Since, IMHO, working out in which particular etc directory each file
should reside is tedious, I would advise having only one:

mv -i /usr/etc/inet/* /etc/inet/* /usr/etc/* /etc/
rmdir /usr/etc/inet /etc/inet /usr/etc
ln -s ../etc /usr/etc
ln -s . /etc/inet

[But make sure the files in /usr/etc and /etc/inet are not already
symlinks into /etc or you'll be in deep water.]

This makes your /etc huge but I think it's safe as I'm not aware of
any packages that require different files or the same name in /etc and
/usr/etc. [Health warning: this is IMHO - other people have different
ideas.]

 XIV.04)  What are all these diretrories for? (/etc, /usr/etc,
/etc/inet,
/usr/spool, /var/spool)

ANSWER: This is one to which I can't find a staight answer.

For various reasons including the difficulties of fsck'ing / some
people like to put all things that aren't needed during bootstrap in
/usr so that / is as small as possible. They therefore move
unessential big files (usually the binaries) from /etc/ to /usr/etc/.

Unless you know what you are doing I'd advise keeping it all in /etc
with /usr/etc and /etc/inet being symlinks back to /etc. (In fact
these links are probably soon to be redundant as most recent binaires
now look in /etc/.)

The alternative approach is to have a real /usr/etc directory
containing all the non-essential stuff and make symlinks to each file
therein from its namesake in /etc.

Also a few people like all their internet stuff in /etc/inet but as
recent binaries excpect to find this stuff in /etc they must create
links for each file from /etc into /etc/inet.

If you want to spread out your configuration files for the sake of
tidiness then a better solution is to have a directory tree called
/conf and make the files in /etc symlinks into this tree.

To avoid the problem of your /usr filesystem filling up as a result of
stuff in spool queues some poeple perfer to keep their spool queues
and such like in a separate filesystem called /var. If you don't have
a /var file system then you should make /var a symlink to usr. If you
_do_ have a /var filesystem to may want to make /usr/spool a symlink
to ../var/spool so that any programs expecting to find /usr/spool will
not be dissapointed.

 XIV.05)  Why do I get ``jobs queued, but cannot start daemon'' or
``lpc: connect: No such file or directory'' ?

ANSWER: Firstly this "start" in the context of this error really means
"wake". If ``ps ax'' does not reveal a lpd then you daemon has died
(or was never started).

If you so have an lpd then you are having trouble with the socket
connection to lpd.  I don't really understand this but the problem was
common in early days with the old binaries but developments in the
TCP/IP code in the kernel fixed it for most people. Using the new lpd
from the net-2 package without the net-2 kernel stuff sometimes gives
this problem.

When I get it I find that kill and restarting lpd a few times will
eventually get rid of the problem. There has also been a suggestion
that recompiling your kernel without TCP/IP at all can help. If
linux-0.99pl10 with it's all new TCP/IP stuff doesn't fix this then 
further research is probably called for.

 XIV.06)  Where do I get a printcap for a xxxxx?

ANSWER: This question is essentially meaningless - see next question.

 XIV.07)  What is the content of /etc/printcap?

ANSWER: Given the similarity in appearence and name between
/etc/termcap and /etc/printcap one could be forgiven for assuming that
they contain analogous infomation. This is not the case. Whereas
termcap contains informations about terminal *types* - (mostly escape
seqences) printcap contains information about *specific* printers
(like the directory that holds the spool queue and the device name of
the printer). The information about a printer model's escape sequences
and so on are held in the various filters which are _programs_ called
by lpd to drive the printer. /etc/printcap simply gives the locations
of these filters.  For details RTFM(printcap). [Alternatively the
net-FAQ has a summary of some of the more important fileds.]

One last point you should always specify ``suppress header'' ``:sh:''
unless you have *text* (_not_ postscript) printer and want banners. On
a text printer they are usually a waste of time and paper. On a
postscript printer they usually stop your printer working.  (See the
banners question for further expanation).

 XIV.08)  What is the format of a /etc/printcap?

ANSWER: Ideally RTFM(termcap) (yes, I said *termcap*) but since most
people don't have TFM(termcap) here are the essentials.

Lines starting # are comments (as you might have guessed).

For each printer usable from the lpr command on your system there is
one logical line in the file. For the sake of readability each logical
line may be spread over several physical lines by making the last
character on all but the last physical line a backslash.

Each logical line has the following format:

name1|name2|name3:string_capability=string:\
       :numeric_capability#number:boolean_capability:

The leading spaces and colon on the second line are for readability
only.

A printer can have as many names as you like but conventionally the
final name is used as a longhand description of the printer. (Still
people are free to say `lpr -P "Fred's grotty teletype"' if that's
the description you've given.)

The list of capabilities can be as long as needed and the order is not
significant. Each ``capability'' is denoted by a two character code.
(The name ``capability'' comes form the file format's termcap heritage
- parameter or attribute would be a more sensible terms.) [Note from
Ross Biro: capabilities with 3 character names don't work properly
which is why the serial port stuff in the old binaries failed.]
Capabilities having string value and have a = delimiter between the
capability name and the value while those having a numeric value use a
# (actually they can use either a # or an =). Boolean ``capablilties''
are true if they appear in the list and false if they do not.

Special characters in a string value can be expressed using `\'-escape
sequences as in C; in addition, `\E' stands for ESC.  `^' is also a
kind of escape character; `^' followed by CHAR stands for the
control-equivalent of CHAR.  Thus, `^a' stands for the character
control-a, just like `\001'. `\' and `^' themselves can be represented
as `\\' and `\^' respectively. `\:' for `:' seems to work but the
source code contains a comment to the effect that it is unsafe and
`\072' is a better idea.

Example:

lp|bam|BAM's Epson FX-80:lp=/dev/lp1:sd=/usr/spool/lp1:sh:mx#0:\
    :df=/usr/local/lib/magic-filter/lp.df:\
    :if=/usr/local/lib/magic-filter/lp.if:

Name is lp (this is the printer that lpr uses by default). It's also
known as bam or "BAM's Epson FX-80".

The printer is on /dev/lp1 (aka AT-bus LPT1:). I don't want a burst
page. I don't want a file length limit. Files queued by `lpr -d' are
passed through /usr/local/lib/magic-filter/lp.df and those queued by
`lpr' through /usr/local/lib/magic-filter/lp.lf.

See also the next question.

 XIV.09)  My /etc/printcap looks identical to someone else's but it
doesn't work - why?

ANSWER: See if lpc stat reports a printer called ` :'. The last
character on a continued line must be a \. If there are whitespace
characters after the \ then it doesn't register the next line as a
continuation.

 XIV.10)  What's the minimum /etc/printcap?

ANSWER: This is a silly question but it _is_ frequently asked. The
answer is ``lp:sh'' (that's 6 bytes including the required linefeed
character on the end). To use this /etc/printcap you must make /dev/lp
a symlink to your printer and create your spool queue directory as
/usr/spool/lpd.  (You might think that if you wanted banner pages you
could loose the ``:sh'' but the termcap syntax requires at least one
capability per entry).

 XIV.11)  How do I prevent the `staircase effect'?

ANSWER: Unix terminates each line of a file with a linefeed but not a
carriage return so taken literally a Unix text file printed on an
ASCII device will start each line below the end of the previous line.
Some printers can be set to treat "linefeed" as "carriage return,
linefeed", others can't. If yours can then do simply do that. If the
printer cannot be fixed create a shell script filter that reads:

#!/bin/sh
if [ $1 = -c ]; then
  cat
else
  sed -e s/$/^M/
fi
# the ``echo -ne'' assumes that /bin/sh is realy bash
echo -ne \\f

where ^M is a carriage return character not a ^ followed by a M.  To
type ^M in emacs use the sequence C-q C-m and in vi use C-v C-m.
Conventionally this script is called /usr/lib/lpf. The test of $1
allows the isertion of carriage returns to be switched off by the `-l'
switch on lpr.

Alternatively your printer may have an escape sequence that will set
the way it handles linefeed characters. A simple filter that uses an
`echo -ne' command to send this sequence may be appropriate.

#!/bin/sh
# Filter for HP printers to treat LF as CRLF
# the ``echo -ne'' assumes that /bin/sh is realy bash
echo -ne \\033\&k2G
cat
echo -ne \\f

[Ross Biro's new release includes a slightly more complex filter
stript called /usr/lib/hpof that does this and a few other things to
make an HP printer behave sensibly even if it was in the wrong
language when you started.]

 XIV.12)  How do I get my printer to go back to the default font after
each printout?

ANSWER: Either make your filters do it or define the `tr'
``capability'' in /etc/printcap to be your printer's font reset
command. For details of the format of this string see the question on
the format of printcap. This may not work if a printout crashes in the
middle of an escape sequence - putting a lot of ^@ on the front may
help but this probably won't be enough it you were printing raster
graphics when the filter died.

 XIV.13)  How do I prevent a formfeed at the end of every printout?

ANSWER: If you don't have an `if' specified in /etc/printcap then lpd
will automatically put a formfeed at the end of each file. If you're
using a filter then it's up to the filter to decide if it wants to put
a formfeed. To disable formfeed completely if you don't have an `if'
put :ff=: in your /etc/printcap.  But please note this suppresses the
formfeed that would usually be printed if a filter dies. If you want
formfeeds after text printouts but not on printouts printed with `lpr
-l' then create the following `if' filter:

#!/bin/sh
# the ``echo -ne'' assumes that /bin/sh is realy bash
cat
if [ "$1" != -c ]; then
  echo -ne \\f
fi

If you want a formfeed after `lpr -l' to be optional you can misuse
the
`-i' switch to suppress the formfeed with the following trick (after
all `lpr -i -l' would usually not be implemented).

#!/bin/sh
cat
# use lpr -i -l to print raw without trailing formfeed
if [ "$1" != -c -o "$4" = -i0 ]; then
  # the ``echo -ne'' assumes that /bin/sh is realy bash
  echo -ne \\f
fi

 XIV.14)  How do I print to a serial port?

ANSWER: This answer and the following ones are supplied by Andrew
Tefft <[email-masked]> and apply to those using a local
serial printer. The first section applies to both net-2 and pre-net-2
implementations of lpd; then there is a section applicable only to the
older implementation; the rest applies to net-2 only.

First, there is a kernel patch you need to make. This applies to
pre-net-2 lpd as well (actually, the use of this should probably
just be commented out of the lpd source code). The change is for
at least patchlevel 10, but probably all others as well.

in /usr/src/linux/kernel/chr_drv/tty_ioctl.c, around line 390,
you will see:

        case TIOCEXCL:
            return -EINVAL; /* not implemented */

Change this to return 0, recompile the kernel, and you'll be all set.

The following applies only to the "old" lpd, before net-2.

You cannot set any serial port settings (including baud rate) in your
printcap. Leave them all out and use stty to set up the port (if
necessary)
in your rc.local, and you should be all set (to find the correct
stty settings, start with the default and twiddle until you can
correctly
cat a file out the port).

The rest of this applies only to net-2 lpd although it may be
helpful to read. I put more detail into this because it's what I use.

 XIV.15)  What serial settings do I have to put in my printcap? How do
I know how to set them?

ANSWER: There are two sets of flags which you will need to set, plus
the baud rate (Note: the "fc" flag setting seems to override the br#
capability, so be sure to set that correctly as well as the br#!).

Each of the flags can have bits set and cleared. Clearing is done
first, so specify the clear flags (fc# and xc#) before the set flags
(fs and xs).

   Setting the br# capability is self-explanatory. Example: br#9600

   It is very easy to translate from 'stty' settings to printcap flag
   settings. If you need to, see the man page for stty now.

   Use stty to set up the printer port so that you can cat a file
   to it and have it print correctly. Here's what "stty -a" looks like
   for my printer port:

dina:/usr/users/andy/work/lpd/lpd# 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

   The only changes between this and the way the port is initialized
   at bootup are -clocal, -crtscts, and ixon. Your port may well be
   different depending on how your printer does flow control.

   Once you have your stty settings right, so that cat file >
/dev/ttyS2
   (in my case) sends the file to the printer, look at the
   file /usr/src/linux/include/linux/termios.h. This contains a lot of
   #defines and a few structs (You may wish to cat this file to the
   printer (you do have that working, right?) and use it as scratch
paper
   -- I did!). Go to the section that starts out

/* c_cflag bit meaning */
#define CBAUD   0000017

   This section lists the meaning of the "fc#" and "fs#" bits.
   You will notice that the names there (after the baud rates) match
   up with one of the lines of stty output. Didn't I say this was
going
   to be easy?

   Note which of those settings are preceded with a - in your stty
   output. Sum up all those numbers (they are octal). This represents
the
   bits you want to *clear*, so the result is your fc# capability.
   Of course, remember that you will be setting bits directly after
   you clear, so you can just use fc#0177777 (I do).

   Now do the same for those settings (listed in this section) which
   do not have a - before them in your stty output. In my example
   the important ones are CS8 (0000060), HUPCL (0002000), and CREAD
(0000200).
   Also note the flags for your baud rate -- mine is 0000015. Add
those
   all up, and in my example you get 0002275. This goes in your fs#
   capability (fs#02275 works fine in my example).

   Do the same with set & clear for the next section of the include
file,
   "c_lflag bits". In my case I didn't have to set anything, so I just
   use "xc#0157777" and "xs#0".

   Once your printcap is set up, try it out. If things don't work,
   see the next section.

 XIV.16)  I can cat to the serial port, but lpd won't print anything
(1).

ANSWER: Generally getting lpd up and running is explained elsewhere,
but if
you are having trouble with serial port settings you can prevent lpd
from trying to configure your port by treating you printer as one that
does not present a normal device interface (qv).

   1. Set your printer (in your printcap) to /dev/null1. Create
/dev/null1
      using mknod /dev/null1 c 1 3 (because you don't want /dev/null
to be
      opened exclusively).

      remove the baud rate and flags settings from your printcap.

   2. Create a script such as this:

#!/bin/sh
echo if: $* >> /var/spool/lpd/results
# /dev/lp is linked to /dev/ttyS2 which has the printer
exec your-old-input-filter $* > /dev/lp

   ...or if you didn't have an old if installed...

#!/bin/sh
echo if: $* >> /var/spool/lpd/results
cat > /dev/lp
# the ``echo -ne'' assumes that /bin/sh is realy bash
echo -en \\f > /dev/lp

      Make sure it's world-executable and world-readable. I call my
      script /var/spool/lpd/if, to make things easy. Try out
      your script (/var/spool/lpd/if < somefile) and see if it prints.

   3. Set the if= capability in your printcap to call this script,
      e.g. if=/var/spool/lpd/if

   4. Use stty to correctly set your port settings. Try to print now.
      You should be able to tell if things are being spooled, and
      things *should* be printed, if your manual testing of the if
      script works. But this is a kludge, so the idea is not to use
the
      if script.

 XIV.17)  I can cat to the serial port, but lpd won't print anything
(2).

ANSWER: Assuming the above method using the "if" filter works and that
you belive that you have specified what you think are the correct
flags and baud rate in printcap; check ``stty -a < /dev/ttyS2'' (or
whatever your printer port is).  If the settings are not correct,
check your flags against your printout from termios.h. If the settings
are *way* not correct, you may need to fix lpd itself. The patch
follows, and you can probably see why it's needed :-) It gets applied
in the lpd/ subdirectory of the lpd source.

(the patch is coming in just a sec)

When I was setting mine up, I followed a sequence like this:

lprm (whatever -- make sure queue is empty and lpd is running)
stty (correct settings) < /dev/ttyS2
lpr (something small)
stty -a < /dev/ttyS2   (often had to ctrl-c out of this one)
(twiddle with flags)
lprm (whatever -- make sure queue is empty again...)

Here's the patch:

-------------------------------Cut Here-------------------------------
------
*** printjob.c  Thu Jul  8 20:56:59 1993
--- printjob.c~ Sat Feb 27 09:07:01 1993
***************
*** 1271,1277 ****
        }
  #ifdef LINUX
        ttybuf.c_cflag &= ~FC;          /* not quite right! */
!       ttybuf.c_cflag |= FS;           /* not quite right! */
  #else
        ttybuf.sg_flags &= ~FC;
        ttybuf.sg_flags |= FS;
--- 1271,1277 ----
        }
  #ifdef LINUX
        ttybuf.c_cflag &= ~FC;          /* not quite right! */
!       ttybuf.c_cflag |= ~FS;          /* not quite right! */
  #else
        ttybuf.sg_flags &= ~FC;
        ttybuf.sg_flags |= FS;
-------------------------------Cut Here-------------------------------
------

 XIV.18)  How do I use a printer that's doesn't present a normal
device interface?

ANSWER: [Firstly I'll explain the question.] The most common example
is a printer that is connected via a network in some strange way.  For
example consider a printer conneccted to a host running some esoteric
OS with which you can only communicate via E-mail. To use this printer
without going through lpr you would say something like:

  | uuencode tmp | mail printer-request@eosteric

in place of:

  > /dev/lp

To use such a printer through lpr the ``lp'' capability of the print
queue should be directed to a /dev/null type device (e.g. ``mknod
/dev/null1 c 1 3'') but not /dev/null itself as lpd opens the device
exclusively. _Each_ filter must must explicitly uuencode and mail its
output. In more complex cases if you already have an ``if'' or ``of''
filter for a strangely connected printer then other filters can pass
their output to/through this filter to avoid duplication of effort.
In this case the ``if'' filter should usually be called with the
``-c'' switch to minimise the further manipulations if performs.

 XIV.19)  How do I get burst/banner pages?

ANSWER: For a simple text printer (in particular not postscript) and a
simple text banner simply take :sh: out of the printcap record. If you
want to prevent the banner comming out in whatever font was last used
on the printer then define the `tr' ``capability'' to be your
printer's font reset command.

If you want a fancy cusomised banner (or have a postscript printer)
leave :sh: in the printcap and make each of your filters print the
banner. All the information to put on the banner is included in the
filter's positional parameters.  RTFM(printcap) for details. [ If
you're using <[email-masked]>'s magic-filter package then
call the code to print the banners from the config script. ]

 XIV.20)  How do I print text on a PS printer?

ANSWER: You need a filter based on a program that converts ascii to
postscript. The most well known of these is ``enscript'' but it's also
the hardest to find. Others include ``a2ps'' and ``mpage'' (for
details of these see the periodic c.o.l.a posting "How to print under
Linux" by <[email-masked]> Grant Taylor)

In order to get the Grant Taylor's document you can send mail
To: [email-masked]
Subject: send printing.how-to  -or-  Subject: printing.how-to.z.uue
and for a list of other linux printing-related files: 
Subject: help

The nearest thing to enscript that an archie search revealed was a
package called ``nenscript-1.13++.tar.Z'' deep in the guts of
gatekeeper.dec.com which appears to do the job but it's prone to
trimming off the tops of your pages.  (It didn't compile ``out of the
box'' with the GNU libs but all it needed was one #undef.)

[I've not looked into these in detail as I don't have a PS printer. I
would like someone to send me an exaple of a filter that they use
using one of these.]

 XIV.21)  Why do files with a lot of graphics get truncated?

ANSWER: Usually because you've got a limit set on the maximum size
file that can sit in the spool queue. Put `mx#0' in your printcap.

 XIV.22)  Why doesn't `lpr -i' work?

ANSWER: To get lpr -i to work you need a filter istalled as `if' that
implements it.  The -i switch is simply passed on by lpd to the
filter.
There is such a filter usually called /usr/lib/lpf that can be
obtained from
bsd source archives in the directory bsd-source/lpr/filters.  It's
also part
of Fred's port but he put it in /usr/bin/.  If you whant to use this
program
but still want your filter to do some printer specific initialisation
then
write script thus:

#!/bin/sh
# My initialisation stuff goes here
exec /usr/lib/lpf $*

 XIV.23)  Why doesn't `lpr -p' work?

ANSWER: Because it's broken. lpd always thinks that the printer is 0
characters wide regardless of what printcap says. This is still broken
in Ross's new release and Fred's port of the '91 sources. Looking at
the
sources the fix for Fred's port appears to be:

-------------------------------Cut Here-------------------------------
------
*** printjob.c.old  Sat Feb 27 14:07:01 1993
--- printjob.c  Sun Jun  6 11:02:36 1993
***************
*** 265,271 ****
     */
    for (i = 0; i < 4; i++)
        strcpy(fonts[i], ifonts[i]);
!   strcpy(width+2, "0");
    strcpy(indent+2, "0");

    /*
--- 265,271 ----
     */
    for (i = 0; i < 4; i++)
        strcpy(fonts[i], ifonts[i]);
!   sprintf(&width[2], "%d", PW);
    strcpy(indent+2, "0");

    /*
***************
*** 1081,1087 ****
        FF = DEFFF;
    if ((PW = pgetnum("pw")) < 0)
        PW = DEFWIDTH;
-   sprintf(&width[2], "%d", PW);
    if ((PL = pgetnum("pl")) < 0)
        PL = DEFLENGTH;
    sprintf(&length[2], "%d", PL);
--- 1081,1086 ----
----------------------------------Cut Here----------------------------
--

This patch is untested as I don't have a complete set of net-2 include
files on my machine yet.

One other thing: lpd calls pr by full pathname so if you keep pr
somewhere different from where lpd looks you will need a symlink.
Where lpd expects to find pr varies from version to version but I
think /usr/bin/pr is the usual place.

 XIV.24)  Why does lprm say `too many users'?

ANSWER: This was a bug in the C library in the scandir() function
which failed when an unsorted directory list was requested. This has
been fixed now so just get a new libc.so. Alternatively there is a
lprm with a workround (by [email-masked]) in:

sunsite.unc.edu:/pub/Linux/system/Daemons/lprm-fix.tar.z

 XIV.25)  Why does lpc complain that it hasn't stopped a daemon?

ANSWER: There's one lpd process that runs all the time and it spawns
off children to handle each printer as needed. These children leave
lock files lying about so lpc thinks that they are still running and
tries to kill them. Was a bug but it was not serious and is fixed in
the latest releases.

 XIV.26)  Why does

 XIV.27)  How do I print over a Network?

ANSWER: To print on the printer "foo" connected to the machine
"bar.baz.net" from the machine "mine.baz.net" you put an entry like
this in your /etc/printcap (on mine.baz.net):

foo:lp=:rm=bar.baz.net:rp=foo:sd=/usr/lpd/spool/foo:

and, of course, create the spool directory /usr/lpd/spool/foo.

There's no point specitying filters and the like in
mine.baz.net:/etc/printcap as it's the one in
bar.baz.net:/etc/printcap that will get used.

On the machine bar.baz.foo, you need to put "mine.baz.net" on a line
by itself in either /etc/hosts.equiv or /etc/hosts.lpd; note that
putting it in /etc/hosts.equiv will allow for unauthenticated logins
as
well as printing.  /etc/hosts.lpd is printing only.

[ Editors note: I realise there are more questions about net printing
but I don't know them. If you find any let me know (with answers if
possible). See also the net FAQ ]

 XIV.28)  Which /dev/{tty,cua,lp}*  is my printer?

ANSWER: On an XT bus system LPT1: becomes /dev/lp0 (major=6, minor=0),
on an AT LPT1: becomes /dev/lp1 (major=6, minor=1). To be more
precise:

Name Major Minor I/O address
 lp0   6     0       0x3bc
 lp1   6     1       0x378
 lp2   6     2       0x278

For a serial printer use the ttyS? (or ttys?, if you follow that
scheme) device, not the cua?  device. The ttyS? devices have major 4;
the cua? devices have major 5.

You must specify the device in printcap or make /dev/lp a symlink to
the actual device.

 XIV.29)  When the kernel boots it says `using polling driver,' is
there an interrupt driven driver?

ANSWER: Yes the latest kernels support parrallel port IRQs but to
enable them you must ether: edit the IRQ number into lp_table[] in
lp.c in the kernel source, or use `lpcntl'. The interrupt driver uses
less processor time and gives a faster throughput but sometimes one
may choose sacrifice this to free up an IRQ line. If your printer is
/dev/lp1 using IRQ 7 put:

/etc/lpcntl /dev/lp1 7

in your /etc/rc.

If you don't have lpcntl get it from:

tsx-11.mit.edu:/pub/Linux/BETA/lp/lpirq.4.tar.Z

 XIV.30)  What's the difference between the polling driver and an the
interrupt driven one?

ANSWER: A polling sits in a loop repeatedly reading the port hardware
to see if it is ready for another character and then gives it one. An
interrupt driver goes to sleep and is woken by the port hardware
(using a hardware interrupt) when it wants another character. Polling
drivers are easier to write but in multitasking environments they are
a bad thing.) I have seen some OSs for PC/AT machines where the
polling printer drivers are more reliable than the interrupt ones but
I doubt this is the case in Linux :-).

 XIV.31)  How do I write filters?

ANSWER: In normal Unix terminology, filters are just programs (so they
must have execute permission) that read a stream from their standard
input and write to their standard output.

lpd filters are filters in the sense that thay read from their STDIN
and write to their STDOUT but are not necessarily true filters in that
they may assume that their standard input is a file and perform
lseek() operations on it. I'm not sure that such filters are strictly
conforming but they seem to work OK.

All lpd filters must conform to a particular command line syntax (or
more often simply ignore command line parameters). For details of the
command line parameters RTFM(printcap).

It's easier to debug filters if you test them in an immediate shell
before you install them. (If your filter make use of its command line
arguments you'll have to specify them too).

my-new-filter <file >/dev/lp1

If you want to write a shell script filter it must have a #!/bin/sh
header.  Here for example is my Epson FX-80 dvi filter:

#!/bin/sh
/usr/TeX/bin/dvips -f | \
/usr/bin/gs -q -sDEVICE=eps9high -r120x216 -dNOPAUSE -sOutputFile=- -

More good specific examples can be found in the peroidic c.o.l.a
posting "How to print under Linux" by <[email-masked]> Grant
Taylor. The document also explains to print out the types of file you
wouldn't normally have a filter for eg. texinfo. (Not that you can't
have a texinfo filter - I have one but it does leave the printer
idling for a long time while tex runs.)

 XIV.32)  I've written a filter in shell script which works OK when I
use it from the shell prompt but fails when I tell lpd to use it?

ANSWER: You may need a #!/bin/sh header. You may also need to set PATH
within the script since the daemon's PATH may not have everything you
need.

 XIV.33)  When should I define an `of' filter?

ANSWER: Never. (Well strictly speaking there are circumstances but
you're unlikey to meet them until you're so familar with lpd that you
won't need this FAQ.)

 XIV.34)  Where do I get filters for given printers?

ANSWER: From BSD source archives (I think). [Editors note: I need a
better answer here ].

If you already have a program to print say DVI on your printer by some
mechanism then making it into a filter is usually a matter of writting
trivial shell script - see this FAQ. If the program you are using
insists on reading a names file as input see the next question. Text
mode filters are trivial too (see this FAQ) unless you want lpr to
have a choice of fonts in which case they are slightly harder than
trivial.  You will probably want to insert and `echo -ne' command at
the beginning and end of your filter to set up the font etc to your
liking.

 XIV.35)  How do I get a program that won't read from STDIN to act as
a filter?

ANSWER: For example dvilj2p insists on a named file as its input (and
what's more expects one with a .dvi suffix). To make a dvi filter for
a laserjet you'll have to capture the STDIN into a temporary file.

#!/bin/sh
cat >/tmp/$$.dvi
dvilj2p /tmp/$$
rm /tmp/$$.dvi

The problem with this kludge is that is may have a very high disk
overhead. (In the long term dvilj2p should be fixed).

If you have procfs you can use the following trick:

#!/bin/sh
ln -s /proc/self/fd/0 /tmp/$$.dvi
dvilj2p /tmp/$$
rm /tmp/$$.dvi

Note: If it wasn't for the fact that dvilj2p adds a .dvi suffix you
wouldn't need the temporary symlink and could just specify
/proc/self/fd/0 directly. People who use this trick often usually keep
permanent symlinks to /proc/self/fd/* in /dev.

 XIV.36)  The set of filters supported by lpd seem strange - why
aren't there filters for Postscript, GIF, TIFF and so on?

ANSWER: History. You can, in fact, use any of the filters (with the
possible exception of the default filter) for any reason. If you're
never going to use Benson Varian raster files you could use the -v
switch for GIF files. Remember that if you create a filter for a file
format that takes a long time to process then your printer may sit
idle between print jobs even when there are things in the queue.

If you are on a network remember that the filter setups go on the
print server so you will need to consider other people's needs too.
One way to avoid running out of filter options is to define several
logical printers in /etc/printcap that all point to the same physical
one. One small problem with this is that you have no control over the
order in which files from separate queues are printed. Another way to
avoid running out of possible types is to use magic filters.

 XIV.37)  What are magic filters?

ANSWER: Magic filters deduce their input files' types from `magic
numbers' (distictive byte patterns at particular offsets).  Magic
filters are usually perl scripts, shell scripts or C programs that
simply identify the file type then call the appropriate non-magic
filter. Blatent plug :-) I <[email-masked]> have a generic
magic filter bash script that selects the right filter to use based on
the output of the `file' command. With my magic ``dvi'' filter (and
3 associated non-magic filters) I can do things like:

lpr -d file1.dvi file2.div.Z file3.ps file4.texinfo.z

(BTW confguring lpr to handle texinfo files getting a bit silly - see
previous question).

This is now at:

tsx-11.mit.edu:pub/linux/sources/usr.bin/magic-filter-0.3.tar.gz

(Although the release number will possibly change in future).

Other examples of magic filters (a simpler shell one and one in C)
can be found in the periodic c.o.l.a posting "How to print under
Linux" by <[email-masked]> Grant Taylor.

Magic filters should never specified as `of' as the output filter only
gets called once if a number of files are printed without a gap.

IMHO magic filters as `if' can also cause problems as they may prevent
you, say, _listing_ a PostScript or nroff file. (Other people disagree
as, if you are making your printer available on a network, it can be a
pain having people accidently listing ps files.)

XV. UUCP/NEWS/MAIL for LINUX
============================
*** This section is an expert of the UUCP-NEWS-MAIL-FAQ, posted twice
*** monthly in c.o.l.a. This section and the complete FAQ about UUCP
*** and others is written by Vince Skahan ([email-masked]),
*** mail him for any corrections and information.
***
*** Last update 93/06/11

XV.A. General Information
XV.B. UUCP

XV.C. News
XV.D. Mail

XV.A. General Information
~~~~~~~~~~~~~~~~~~~~~~~~~

  XV.01)  What uucp, news, and mail software works under Linux ?

ANSWER:
Just about everything, most with no (or minimal) patching required...

The following is a quick but not all-inclusive list of software known to work
under Linux:

	UUCP 		- Taylor UUCP 1.04
	News transport	- Cnews 12/22/91 patchdate (no 'optional' speedups)
                          Cnews 'performance release' (needs patching)
                          INN 1.4 (needs patching)
                          dynafeed
                          nntp 1.5.11 'reference' release, slurp 1.05
	News readers	- tin-1.2-p0
                          trn-2.5 (probably also 3.0)
                          nn-6.4.18
                          tass
                          rn4.4
                          waffle 1.65
	Mail transport  - smail2.5
                          smail3.1.28
                          sendmail5.65c+IDA
	Mail program	- elm2.4.21 (probably also 2.4.22)
                          pine
                          procmail
                          deliver

  XV.02)  So where are the sources ?

ANSWER:
At your friendly neighborhood archive site where you find sources normally.
Consult archie for a list.

Config files for the portions of UUCP/News/Mail currently in the SLS
distribution of Linux can be found on sunsite.unc.edu in the file
sunsite.unc.edu:/pub/Linux/system/Mail/newspak-1.4.tar

  XV.03)  Do I really need the sources ?

ANSWER:
Yes, if you want to *really* understand how the pieces are configured and
how they fit together.  If you already know how...probably not unless you
want to change the paths used or do custom patching for some reason.

There is considerable documentation in the sources that doesn't get
"installed" that helps fill in the blanks between what you need to know, and
what you can figure out.

  XV.04)  How do I get my system a news/mail/uucp feed ?

ANSWER:
	Please see the "how to become a USENET site" periodic posting
	in news.answers

XV.B. UUCP
~~~~~~~~~~

  XV.05)  Why do I get 'timeout' on connections when I upgraded to
uucp-1.04 ? 

ANSWER:
	If you use a 'Direct' device in the Devices file, there's now a
	10 second timeout compiled in.  Make the name of the Device anything
	other than 'Direct'.

  XV.06)  Why doesn't anonymous uucp seem to work ?

ANSWER:
	The SLS anonymous uucp only works in Taylor mode because it's
	compiled with HAVE_TAYLOR_CONFIG.  If you want to do anon uucp in HDB
	mode, you'll have to recompile the sources with just HDB defined.

	HDB mode also seems rather particular about things like blank spaces
	and blank lines in your Permissions file.  If you get log file entries
	that indicate 'no permission' for anon uucp, a good place to start is
	to make sure that there are no blank lines (comment 'em out).

XV.C News
~~~~~~~~~

  XV.07)   What newsreader is best ?

ANSWER:
	No way I'll open that can of worms other than to say that you
	definitely want something with "kill files" and probably want
	something with 'threads'.  

	For what little it's worth, I use 'nn'.
	
  XV.08)  with trn - why do I get the message 'dbinit failed' ? 

ANSWER:
	Because you didn't run mthreads from cron to keep the threads database
	up-to-date.

  XV.09)  why is my 'nn' database getting continuously corrupted ?

ANSWER:
	If you built it from sources and you asked for the 'words' method of
	building the database,  it will definitely get corrupted if your
	filesystem doesn't handle long filenames (ie...comp.os.linux.announce
	is more than 14-characters).  Build it with the 'by-number' way of
	creating the database and you'll be fine.

  XV.10)  why can't I post to moderated groups ?

ANSWER:
	Probably because the newsreader is trying to call /bin/mail to send
	the mail and it doesn't like it.  Replace the /bin/mail in SLS with
	the port of mailx-5.3a.tar.z from the pub/Linux/system/Mail dir on
	sunsite.unc.edu and make it mode 2755 and group mail (like 'elm') and
	you'll be all set.

	Another possibility is that you have a moderated newsgroup set up on
	your local system as not-moderated and somebody upstream is quietly
	deleting the article (some system's software, not a person).  Make
	sure you run a 'checkgroups' every now and then when the checkgroups
	article rolls by in news.admin every few weeks.

  XV.11)  Why do I have problems that appear to be permission-related ?

ANSWER:
	All the stuff in /usr/local/lib/news should be news.news except
	/usr/local/lib/news/setnewsids which should be setuid root.

	Past versions of SLS had no 'news' group or user by default, which
	caused lots of problems for people if they installed the news 
	software *before* they added the 'news' group and user.

  XV.12)  Why doesn't SLS have the 'Performance Release' of C-news?
	  INN ? NNTP ? 

ANSWER:
	Because SLS can't have *everything*.  It has the pre-performance C-news
	because it's a very fast and stable implementation for non-nntp sites
	that fits the needs of a normal uucp-only site.  If you're that into
	having the most current of everything, you should probably be building
	it from the sources.

  XV.13)  Why does doexpire say "severe space shortage" when there's
	lots of room ? 

ANSWER:
	Because it can't read /etc/mtab.  Make it mode 644.  This happens
	when you unmount a mounted filesystem by root with a umask that
	doesn't permit world-read of files owned by root.

  XV.14)  How do I set up NNTP?

ANSWER:
	Please see the extended description from Matt Welsh in the
	UUCP-NEWS-MAIL-FAQ that appears routinely in c.o.l.a.

XV.D. Mail
~~~~~~~~~~

  XV.15)  Why is my hostname.domainname not in my headers and
something funky's there ? 

ANSWER:
	Because you didn't edit one or more of the following files like the
	README.linux files in the lib directories told you to:

		/usr/local/lib/smail/paths
		/usr/local/lib/smail/config
		/usr/local/lib/elm/elm.rc 

  XV.16)  Why can't elm write to my mailbox ?

ANSWER:
	You need elm and filter to be mode 2755 and group mail
	and also have /usr/spool/mail mode 775 and group mail.

  XV.17)  is sendmail+IDA available for Linux instead of smail ?

ANSWER:
   Yes !!! I've recently switched from smail to sendmail+IDA from the binary
   distribution on sunsite.unc.edu and it works great...and I'm a uucp-only
   site.  Look in pub/Linux/system/Mail for it...

	   ===================8<==========>8================

-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#	LaBRI 			 |					    #
#  351 cours de la Liberation    |  e-mail:  [email-masked]   #
#  33405 Talence Cedex		 |  e-mail:  [email-masked]    #
#  				 |					    #
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 
	 There will be a sig when our local net is reliable.
	       For now, I would rather stay anonymous.