Библиотека сайта rus-linux.net
| Purchase | Copyright © 2002 Paul Sheer. Click here for copying permissions. | Home |
|
| |
Next: 34. uucp and uux Up: rute Previous: 32. init, ? getty,   Contents
Subsections
33. Sending Faxes
This chapter discusses the
sendfax program, with reference to the
specific example of setting up an artificial printer that will automatically use a
modem to send its print jobs to remote fax machines.
33.1 Fax Through Printing
Continuing from Section 21.10...
You should go now and read the
sendfax section of the
info page
for
mgetty. The
sendfax command is just one program that
sends faxes through the modem. Like
mgetty, it reads a config file
in
/etc/mgetty+sendfax/. This
config file is just
sendfax.config
and can contain as little as
5 |
verbose ydebug 5fax-devices ttyS0fax-id 27 21 7654321max-tries 3max-tries-continue y |
Below,
fax_filter.sh
is a script that sends the print job
through the fax machine after requesting the telephone number through
gdialog. [
gdialog is part of the
gnome-utils
package.] An appropriate
/etc/printcap entry is:
5 |
fax:\ :sd=/var/spool/lpd/fax:\ :mx#0:\ :sh:\ :lp=/dev/null:\ :if=/var/spool/lpd/fax/fax_filter.sh: |
The file
fax_filter.sh itself could contain a script like
this [Remember to rotate the
/var/log/fax log file, see page
.] for a modem on
/dev/ttyS0:
5 10 15 20 25 30 35 40 45 50 55 |
#!/bin/sh exec 1>>/var/log/faxexec 2>>/var/log/fax echoechoecho $@ echo "Starting fax `date`: I am `id`" export DISPLAY=localhost:0.0export HOME=/home/lp function error(){ gdialog --title "Send Fax" --msgbox "$1" 10 75 || \ echo 'Huh? no gdialog on this machine' cd / rm -Rf /tmp/$$fax || \ gdialog \ --title "Send Fax" \ --msgbox "rm -Rf /tmp/$$fax failed" \ 10 75 exit 1} mkdir /tmp/$$fax || error "mkdir /tmp/$$fax failed"cd /tmp/$$fax || error "cd /tmp/$$fax failed" cat > fax.ps if /usr/bin/gdialog \ --title "Send Fax" \ --inputbox "Enter the phone number to fax:" \ 10 75 "" 2>TEL ; then :else echo "gdialog failed `< TEL`" rm -Rf /tmp/$$fax exit 0fi TEL=`< TEL`test -z "$TEL" && error 'no telephone number given' cat fax.ps | gs -r204x98 -sOutputFile=- -sDEVICE=faxg3 -dBATCH -q - \ 1>fax.ps.g3 || error 'gs failed' ls -al /var/lock//usr/sbin/sendfax -x 5 -n -l ttyS0 $TEL fax.ps.g3 || \ error "sendfax failed" rm -Rf /tmp/$$fax exit 0 |
33.2 Setgid Wrapper Binary
The above script is not enough however. Above,
sendfax requires access to the
/dev/ttyS0 device as well as the
/var/lock/ directory (to
create a modem lock file--see Section 34.4). It cannot do
that as the
lp user (under which the above filter runs).
On RedHat, the command
ls -ald /var/lock /dev/ttyS0 reveals that only
uucp is allowed to access modems.
We can get around this restriction
by creating a setgid
(see Chapter 14) binary that runs as the
uucp user. Do this by compiling the C program,
5 10 15 20 25 30 |
#include <stdlib.h>#include <string.h>#include <stdio.h>#include <unistd.h> int main (int argc, char **argv){ char **a; int i; /* set the real group ID to that of the effective group ID */ if (setgid (getegid ())) { perror ("sendfax_wrapper: setgid failed"); exit (1); } /* copy all arguments */ a = (char **) malloc ((argc + 1) * sizeof (char *)); for (i = 1; i < argc; i++) a[i] = (char *) strdup (argv[i]); a[argc] = NULL; /* execute sendfax */ a[0] = "/usr/sbin/sendfax"; execvp (a[0], a); /* exit on failure */ perror ("sendfax_wrapper: failed to exececute /usr/sbin/sendfax"); exit (1);} |
using the commands,
|
gcc sendfax_wrapper.c -o /usr/sbin/sendfax_wrapper -Wallchown lp:uucp /usr/sbin/sendfax_wrapperchmod g+s,o-rwx /usr/sbin/sendfax_wrapper |
Then, replace
sendfax with
sendfax_wrapper in the filter script. You can
see that
sendfax_wrapper just executes
sendfax after changing
the group ID to the effective group ID (GID) as obtained from the
getegid
function on line 12. The effective group ID is
uucp because of the
setgid group bit (i.e.,
g+s) in the
chmod command, and hence
sendfax runs under the
uucp group with full access to the modem
device.
On your own system it may be cleaner to try implement this without a
wrapper. Debian, for example, has a
dialout group for the
purposes of accessing modems. Also be aware that some distributions may
not use the
uucp user in the way RedHat does and you may have to
create an alternative user especially for this task.
Next: 34. uucp and uux Up: rute Previous: 32. init, ? getty,   Contents
