Next | Welcome to my ~/bin | 89 |
printlp is the program that actually copies the data to /dev/lp
Such a program needs special permissions
It must run setuid or setgid
So we want to make it as simple as possible
#!/usr/bin/suidperl
use Fcntl 'O_WRONLY';
my $printer = shift; exit 1 unless defined $printer; exit 2 unless $printer =~ m{^/dev/lp[a-zA-Z.0-9-]*\z}; exit 3 unless -c $printer; my $group = getgrgid((stat _)[5]); exit 4 unless $group eq 'lp'; untaint($printer); sysopen PRINTER, $printer, O_WRONLY or exit 5;
my($br, $buf); while ($br = read STDIN, $buf, 8192) { print PRINTER $buf; } exit 6 unless defined $br; close PRINTER or exit 7; exit 0;
sub untaint { $_[0] =~ /(.*)/; $_[0] = $1; }
This is probably the only time in my life I have used the -c operator
Next | Menu | Copyright © 2005 M. J. Dominus |