From fe6c63c617a20362a16409581197caa4d11352f4 Mon Sep 17 00:00:00 2001 From: Mike Pritchard <mpp@FreeBSD.org> Date: Wed, 24 May 2000 13:05:50 +0000 Subject: [PATCH] Remove the lpr/runqueue directory and associated files. These are not used anymore and are outdated and only cause confusion (I just committed a fix to one of these files within the last hour, thinking it was still valid). --- usr.sbin/lpr/runqueue/extern.h | 48 - usr.sbin/lpr/runqueue/lpdchar.c | 1071 ------------------- usr.sbin/lpr/runqueue/modes.c | 234 ----- usr.sbin/lpr/runqueue/printjob.c | 1661 ------------------------------ 4 files changed, 3014 deletions(-) delete mode 100644 usr.sbin/lpr/runqueue/extern.h delete mode 100644 usr.sbin/lpr/runqueue/lpdchar.c delete mode 100644 usr.sbin/lpr/runqueue/modes.c delete mode 100644 usr.sbin/lpr/runqueue/printjob.c diff --git a/usr.sbin/lpr/runqueue/extern.h b/usr.sbin/lpr/runqueue/extern.h deleted file mode 100644 index 8f390fb76636..000000000000 --- a/usr.sbin/lpr/runqueue/extern.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: @(#)extern.h 8.1 (Berkeley) 6/6/93 - * $FreeBSD$ - */ - -#include <sys/cdefs.h> - -extern char scnkey[][HEIGHT]; /* in lpdchar.c */ -extern char fromb[]; - -struct printer; - -__BEGIN_DECLS -void printjob __P((struct printer *pp)); -void startprinting __P((const char *printer)); -void recvjob __P((const char *printer)); -__END_DECLS diff --git a/usr.sbin/lpr/runqueue/lpdchar.c b/usr.sbin/lpr/runqueue/lpdchar.c deleted file mode 100644 index ba39a9f1ed3f..000000000000 --- a/usr.sbin/lpr/runqueue/lpdchar.c +++ /dev/null @@ -1,1071 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -/* -static char sccsid[] = "@(#)lpdchar.c 8.1 (Berkeley) 6/6/93"; -*/ -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - -/* - * Character set for line printer daemon - */ -#include "lp.local.h" -#include "extern.h" - -#define c_______ 0 -#define c______1 01 -#define c_____1_ 02 -#define c____1__ 04 -#define c____11_ 06 -#define c___1___ 010 -#define c___1__1 011 -#define c___1_1_ 012 -#define c___11__ 014 -#define c__1____ 020 -#define c__1__1_ 022 -#define c__1_1__ 024 -#define c__11___ 030 -#define c__111__ 034 -#define c__111_1 035 -#define c__1111_ 036 -#define c__11111 037 -#define c_1_____ 040 -#define c_1____1 041 -#define c_1___1_ 042 -#define c_1__1__ 044 -#define c_1_1___ 050 -#define c_1_1__1 051 -#define c_1_1_1_ 052 -#define c_11____ 060 -#define c_11_11_ 066 -#define c_111___ 070 -#define c_111__1 071 -#define c_111_1_ 072 -#define c_1111__ 074 -#define c_1111_1 075 -#define c_11111_ 076 -#define c_111111 077 -#define c1______ 0100 -#define c1_____1 0101 -#define c1____1_ 0102 -#define c1____11 0103 -#define c1___1__ 0104 -#define c1___1_1 0105 -#define c1___11_ 0106 -#define c1__1___ 0110 -#define c1__1__1 0111 -#define c1__11_1 0115 -#define c1__1111 0117 -#define c1_1____ 0120 -#define c1_1___1 0121 -#define c1_1_1_1 0125 -#define c1_1_11_ 0126 -#define c1_111__ 0134 -#define c1_1111_ 0136 -#define c11____1 0141 -#define c11___1_ 0142 -#define c11___11 0143 -#define c11_1___ 0150 -#define c11_1__1 0151 -#define c111_11_ 0166 -#define c1111___ 0170 -#define c11111__ 0174 -#define c111111_ 0176 -#define c1111111 0177 - -char scnkey[][HEIGHT] = /* this is relatively easy to modify */ - /* just look: */ -{ - { c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______ }, /* */ - - { c__11___, - c__11___, - c__11___, - c__11___, - c__11___, - c_______, - c_______, - c__11___, - c__11___ }, /* ! */ - - { c_1__1__, - c_1__1__, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______ }, /* " */ - - { c_______, - c__1_1__, - c__1_1__, - c1111111, - c__1_1__, - c1111111, - c__1_1__, - c__1_1__, - c_______ }, /* # */ - - { c___1___, - c_11111_, - c1__1__1, - c1__1___, - c_11111_, - c___1__1, - c1__1__1, - c_11111_, - c___1___ }, /* $ */ - - { c_1_____, - c1_1___1, - c_1___1_, - c____1__, - c___1___, - c__1____, - c_1___1_, - c1___1_1, - c_____1_ }, /* % */ - - { c_11____, - c1__1___, - c1___1__, - c_1_1___, - c__1____, - c_1_1__1, - c1___11_, - c1___11_, - c_111__1 }, /* & */ - - { c___11__, - c___11__, - c___1___, - c__1____, - c_______, - c_______, - c_______, - c_______, - c_______ }, /* ' */ - - { c____1__, - c___1___, - c__1____, - c__1____, - c__1____, - c__1____, - c__1____, - c___1___, - c____1__ }, /* ( */ - - { c__1____, - c___1___, - c____1__, - c____1__, - c____1__, - c____1__, - c____1__, - c___1___, - c__1____ }, /* ) */ - - { c_______, - c___1___, - c1__1__1, - c_1_1_1_, - c__111__, - c_1_1_1_, - c1__1__1, - c___1___, - c_______ }, /* * */ - - { c_______, - c___1___, - c___1___, - c___1___, - c1111111, - c___1___, - c___1___, - c___1___, - c_______ }, /* + */ - - { c_______, - c_______, - c_______, - c_______, - c__11___, - c__11___, - c__1____, - c_1_____, - c_______ }, /* , */ - - { c_______, - c_______, - c_______, - c_______, - c1111111, - c_______, - c_______, - c_______, - c_______ }, /* - */ - - { c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c__11___, - c__11___ }, /* . */ - - { c_______, - c______1, - c_____1_, - c____1__, - c___1___, - c__1____, - c_1_____, - c1______, - c_______ }, /* / */ - - { c_11111_, - c1_____1, - c1____11, - c1___1_1, - c1__1__1, - c1_1___1, - c11____1, - c1_____1, - c_11111_ }, /* 0 */ - - { c___1___, - c__11___, - c_1_1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c_11111_ }, /* 1 */ - - { c_11111_, - c1_____1, - c______1, - c_____1_, - c__111__, - c_1_____, - c1______, - c1______, - c1111111 }, /* 2 */ - - { c_11111_, - c1_____1, - c______1, - c______1, - c__1111_, - c______1, - c______1, - c1_____1, - c_11111_ }, /* 3 */ - - { c_____1_, - c____11_, - c___1_1_, - c__1__1_, - c_1___1_, - c1____1_, - c1111111, - c_____1_, - c_____1_ }, /* 4 */ - - { c1111111, - c1______, - c1______, - c11111__, - c_____1_, - c______1, - c______1, - c1____1_, - c_1111__ }, /* 5 */ - - { c__1111_, - c_1_____, - c1______, - c1______, - c1_1111_, - c11____1, - c1_____1, - c1_____1, - c_11111_ }, /* 6 */ - - { c1111111, - c1_____1, - c_____1_, - c____1__, - c___1___, - c__1____, - c__1____, - c__1____, - c__1____ }, /* 7 */ - - { c_11111_, - c1_____1, - c1_____1, - c1_____1, - c_11111_, - c1_____1, - c1_____1, - c1_____1, - c_11111_ }, /* 8 */ - - { c_11111_, - c1_____1, - c1_____1, - c1_____1, - c_111111, - c______1, - c______1, - c1_____1, - c_1111__ }, /* 9 */ - - { c_______, - c_______, - c_______, - c__11___, - c__11___, - c_______, - c_______, - c__11___, - c__11___ }, /* : */ - - - { c__11___, - c__11___, - c_______, - c_______, - c__11___, - c__11___, - c__1____, - c_1_____, - c_______ }, /* ; */ - - { c____1__, - c___1___, - c__1____, - c_1_____, - c1______, - c_1_____, - c__1____, - c___1___, - c____1__ }, /* < */ - - { c_______, - c_______, - c_______, - c1111111, - c_______, - c1111111, - c_______, - c_______, - c_______ }, /* = */ - - { c__1____, - c___1___, - c____1__, - c_____1_, - c______1, - c_____1_, - c____1__, - c___1___, - c__1____ }, /* > */ - - { c__1111_, - c_1____1, - c_1____1, - c______1, - c____11_, - c___1___, - c___1___, - c_______, - c___1___ }, /* ? */ - - { c__1111_, - c_1____1, - c1__11_1, - c1_1_1_1, - c1_1_1_1, - c1_1111_, - c1______, - c_1____1, - c__1111_ }, /* @ */ - - { c__111__, - c_1___1_, - c1_____1, - c1_____1, - c1111111, - c1_____1, - c1_____1, - c1_____1, - c1_____1 }, /* A */ - - { c111111_, - c_1____1, - c_1____1, - c_1____1, - c_11111_, - c_1____1, - c_1____1, - c_1____1, - c111111_ }, /* B */ - - { c__1111_, - c_1____1, - c1______, - c1______, - c1______, - c1______, - c1______, - c_1____1, - c__1111_ }, /* C */ - - { c11111__, - c_1___1_, - c_1____1, - c_1____1, - c_1____1, - c_1____1, - c_1____1, - c_1___1_, - c11111__ }, /* D */ - - { c1111111, - c1______, - c1______, - c1______, - c111111_, - c1______, - c1______, - c1______, - c1111111 }, /* E */ - - { c1111111, - c1______, - c1______, - c1______, - c111111_, - c1______, - c1______, - c1______, - c1______ }, /* F */ - - { c__1111_, - c_1____1, - c1______, - c1______, - c1______, - c1__1111, - c1_____1, - c_1____1, - c__1111_ }, /* G */ - - { c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1111111, - c1_____1, - c1_____1, - c1_____1, - c1_____1 }, /* H */ - - { c_11111_, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c_11111_ }, /* I */ - - { c__11111, - c____1__, - c____1__, - c____1__, - c____1__, - c____1__, - c____1__, - c1___1__, - c_111___ }, /* J */ - - { c1_____1, - c1____1_, - c1___1__, - c1__1___, - c1_1____, - c11_1___, - c1___1__, - c1____1_, - c1_____1 }, /* K */ - - { c1______, - c1______, - c1______, - c1______, - c1______, - c1______, - c1______, - c1______, - c1111111 }, /* L */ - - { c1_____1, - c11___11, - c1_1_1_1, - c1__1__1, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1_____1 }, /* M */ - - { c1_____1, - c11____1, - c1_1___1, - c1__1__1, - c1___1_1, - c1____11, - c1_____1, - c1_____1, - c1_____1 }, /* N */ - - { c__111__, - c_1___1_, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c_1___1_, - c__111__ }, /* O */ - - { c111111_, - c1_____1, - c1_____1, - c1_____1, - c111111_, - c1______, - c1______, - c1______, - c1______ }, /* P */ - - { c__111__, - c_1___1_, - c1_____1, - c1_____1, - c1_____1, - c1__1__1, - c1___1_1, - c_1___1_, - c__111_1 }, /* Q */ - - { c111111_, - c1_____1, - c1_____1, - c1_____1, - c111111_, - c1__1___, - c1___1__, - c1____1_, - c1_____1 }, /* R */ - - { c_11111_, - c1_____1, - c1______, - c1______, - c_11111_, - c______1, - c______1, - c1_____1, - c_11111_ }, /* S */ - - { c1111111, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___ }, /* T */ - - { c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1_____1, - c_11111_ }, /* U */ - - { c1_____1, - c1_____1, - c1_____1, - c_1___1_, - c_1___1_, - c__1_1__, - c__1_1__, - c___1___, - c___1___ }, /* V */ - - { c1_____1, - c1_____1, - c1_____1, - c1_____1, - c1__1__1, - c1__1__1, - c1_1_1_1, - c11___11, - c1_____1 }, /* W */ - - { c1_____1, - c1_____1, - c_1___1_, - c__1_1__, - c___1___, - c__1_1__, - c_1___1_, - c1_____1, - c1_____1 }, /* X */ - - { c1_____1, - c1_____1, - c_1___1_, - c__1_1__, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___ }, /* Y */ - - { c1111111, - c______1, - c_____1_, - c____1__, - c___1___, - c__1____, - c_1_____, - c1______, - c1111111 }, /* Z */ - - { c_1111__, - c_1_____, - c_1_____, - c_1_____, - c_1_____, - c_1_____, - c_1_____, - c_1_____, - c_1111__ }, /* [ */ - - { c_______, - c1______, - c_1_____, - c__1____, - c___1___, - c____1__, - c_____1_, - c______1, - c_______ }, /* \ */ - - { c__1111_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c__1111_ }, /* ] */ - - { c___1___, - c__1_1__, - c_1___1_, - c1_____1, - c_______, - c_______, - c_______, - c_______ }, /* ^ */ - - { c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______, - c1111111, - c_______ }, /* _ */ - - { c__11___, - c__11___, - c___1___, - c____1__, - c_______, - c_______, - c_______, - c_______, - c_______ }, /* ` */ - - { c_______, - c_______, - c_______, - c_1111__, - c_____1_, - c_11111_, - c1_____1, - c1____11, - c_1111_1 }, /* a */ - - { c1______, - c1______, - c1______, - c1_111__, - c11___1_, - c1_____1, - c1_____1, - c11___1_, - c1_111__ }, /* b */ - - { c_______, - c_______, - c_______, - c_1111__, - c1____1_, - c1______, - c1______, - c1____1_, - c_1111__ }, /* c */ - - { c_____1_, - c_____1_, - c_____1_, - c_111_1_, - c1___11_, - c1____1_, - c1____1_, - c1___11_, - c_111_1_ }, /* d */ - - { c_______, - c_______, - c_______, - c_1111__, - c1____1_, - c111111_, - c1______, - c1____1_, - c_1111__ }, /* e */ - - { c___11__, - c__1__1_, - c__1____, - c__1____, - c11111__, - c__1____, - c__1____, - c__1____, - c__1____ }, /* f */ - - { c_111_1_, - c1___11_, - c1____1_, - c1____1_, - c1___11_, - c_111_1_, - c_____1_, - c1____1_, - c_1111__ }, /* g */ - - { c1______, - c1______, - c1______, - c1_111__, - c11___1_, - c1____1_, - c1____1_, - c1____1_, - c1____1_ }, /* h */ - - { c_______, - c___1___, - c_______, - c__11___, - c___1___, - c___1___, - c___1___, - c___1___, - c__111__ }, /* i */ - - { c____11_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c_____1_, - c_1___1_, - c__111__ }, /* j */ - - { c1______, - c1______, - c1______, - c1___1__, - c1__1___, - c1_1____, - c11_1___, - c1___1__, - c1____1_ }, /* k */ - - { c__11___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c__111__ }, /* l */ - - { c_______, - c_______, - c_______, - c1_1_11_, - c11_1__1, - c1__1__1, - c1__1__1, - c1__1__1, - c1__1__1 }, /* m */ - - { c_______, - c_______, - c_______, - c1_111__, - c11___1_, - c1____1_, - c1____1_, - c1____1_, - c1____1_ }, /* n */ - - { c_______, - c_______, - c_______, - c_1111__, - c1____1_, - c1____1_, - c1____1_, - c1____1_, - c_1111__ }, /* o */ - - { c1_111__, - c11___1_, - c1____1_, - c1____1_, - c11___1_, - c1_111__, - c1______, - c1______, - c1______ }, /* p */ - - { c_111_1_, - c1___11_, - c1____1_, - c1____1_, - c1___11_, - c_111_1_, - c_____1_, - c_____1_, - c_____1_ }, /* q */ - - { c_______, - c_______, - c_______, - c1_111__, - c11___1_, - c1______, - c1______, - c1______, - c1______ }, /* r */ - - { c_______, - c_______, - c_______, - c_1111__, - c1____1_, - c_11____, - c___11__, - c1____1_, - c_1111__ }, /* s */ - - { c_______, - c__1____, - c__1____, - c11111__, - c__1____, - c__1____, - c__1____, - c__1__1_, - c___11__ }, /* t */ - - { c_______, - c_______, - c_______, - c1____1_, - c1____1_, - c1____1_, - c1____1_, - c1___11_, - c_111_1_ }, /* u */ - - { c_______, - c_______, - c_______, - c1_____1, - c1_____1, - c1_____1, - c_1___1_, - c__1_1__, - c___1___ }, /* v */ - - { c_______, - c_______, - c_______, - c1_____1, - c1__1__1, - c1__1__1, - c1__1__1, - c1__1__1, - c_11_11_ }, /* w */ - - { c_______, - c_______, - c_______, - c1____1_, - c_1__1__, - c__11___, - c__11___, - c_1__1__, - c1____1_ }, /* x */ - - { c1____1_, - c1____1_, - c1____1_, - c1____1_, - c1___11_, - c_111_1_, - c_____1_, - c1____1_, - c_1111__ }, /* y */ - - { c_______, - c_______, - c_______, - c111111_, - c____1__, - c___1___, - c__1____, - c_1_____, - c111111_ }, /* z */ - - { c___11__, - c__1____, - c__1____, - c__1____, - c_1_____, - c__1____, - c__1____, - c__1____, - c___11__ }, /* } */ - - { c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___, - c___1___ }, /* | */ - - { c__11___, - c____1__, - c____1__, - c____1__, - c_____1_, - c____1__, - c____1__, - c____1__, - c__11___ }, /* } */ - - { c_11____, - c1__1__1, - c____11_, - c_______, - c_______, - c_______, - c_______, - c_______, - c_______ }, /* ~ */ - - { c_1__1__, - c1__1__1, - c__1__1_, - c_1__1__, - c1__1__1, - c__1__1_, - c_1__1__, - c1__1__1, - c__1__1_ } /* rub-out */ -}; diff --git a/usr.sbin/lpr/runqueue/modes.c b/usr.sbin/lpr/runqueue/modes.c deleted file mode 100644 index 9c22055f46a9..000000000000 --- a/usr.sbin/lpr/runqueue/modes.c +++ /dev/null @@ -1,234 +0,0 @@ -/*- - * Copyright (c) 1991, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -/* -static char sccsid[] = "@(#)modes.c 8.3 (Berkeley) 4/2/94"; -*/ -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - -#include <stddef.h> -#include <string.h> -#include <termios.h> - -struct modes { - char *name; - long set; - long unset; -}; - -/* - * The code in optlist() depends on minus options following regular - * options, i.e. "foo" must immediately precede "-foo". - */ -struct modes cmodes[] = { - { "cs5", CS5, CSIZE }, - { "cs6", CS6, CSIZE }, - { "cs7", CS7, CSIZE }, - { "cs8", CS8, CSIZE }, - { "cstopb", CSTOPB, 0 }, - { "-cstopb", 0, CSTOPB }, - { "cread", CREAD, 0 }, - { "-cread", 0, CREAD }, - { "parenb", PARENB, 0 }, - { "-parenb", 0, PARENB }, - { "parodd", PARODD, 0 }, - { "-parodd", 0, PARODD }, - { "parity", PARENB | CS7, PARODD | CSIZE }, - { "-parity", CS8, PARODD | PARENB | CSIZE }, - { "evenp", PARENB | CS7, PARODD | CSIZE }, - { "-evenp", CS8, PARODD | PARENB | CSIZE }, - { "oddp", PARENB | CS7 | PARODD, CSIZE }, - { "-oddp", CS8, PARODD | PARENB | CSIZE }, - { "pass8", CS8, PARODD | PARENB | CSIZE }, - { "-pass8", PARENB | CS7, PARODD | CSIZE }, - { "hupcl", HUPCL, 0 }, - { "-hupcl", 0, HUPCL }, - { "hup", HUPCL, 0 }, - { "-hup", 0, HUPCL }, - { "clocal", CLOCAL, 0 }, - { "-clocal", 0, CLOCAL }, - { "crtscts", CRTSCTS, 0 }, - { "-crtscts", 0, CRTSCTS }, - { "ctsflow", CCTS_OFLOW, 0 }, - { "-ctsflow", 0, CCTS_OFLOW }, - { "dsrflow", CDSR_OFLOW, 0 }, - { "-dsrflow", 0, CDSR_OFLOW }, - { "dtrflow", CDTR_IFLOW, 0 }, - { "-dtrflow", 0, CDTR_IFLOW }, - { "rtsflow", CRTS_IFLOW, 0 }, - { "-rtsflow", 0, CRTS_IFLOW }, - { "mdmbuf", MDMBUF, 0 }, - { "-mdmbuf", 0, MDMBUF }, - { NULL }, -}; - -struct modes imodes[] = { - { "ignbrk", IGNBRK, 0 }, - { "-ignbrk", 0, IGNBRK }, - { "brkint", BRKINT, 0 }, - { "-brkint", 0, BRKINT }, - { "ignpar", IGNPAR, 0 }, - { "-ignpar", 0, IGNPAR }, - { "parmrk", PARMRK, 0 }, - { "-parmrk", 0, PARMRK }, - { "inpck", INPCK, 0 }, - { "-inpck", 0, INPCK }, - { "istrip", ISTRIP, 0 }, - { "-istrip", 0, ISTRIP }, - { "inlcr", INLCR, 0 }, - { "-inlcr", 0, INLCR }, - { "igncr", IGNCR, 0 }, - { "-igncr", 0, IGNCR }, - { "icrnl", ICRNL, 0 }, - { "-icrnl", 0, ICRNL }, - { "ixon", IXON, 0 }, - { "-ixon", 0, IXON }, - { "flow", IXON, 0 }, - { "-flow", 0, IXON }, - { "ixoff", IXOFF, 0 }, - { "-ixoff", 0, IXOFF }, - { "tandem", IXOFF, 0 }, - { "-tandem", 0, IXOFF }, - { "ixany", IXANY, 0 }, - { "-ixany", 0, IXANY }, - { "decctlq", 0, IXANY }, - { "-decctlq", IXANY, 0 }, - { "imaxbel", IMAXBEL, 0 }, - { "-imaxbel", 0, IMAXBEL }, - { NULL }, -}; - -struct modes lmodes[] = { - { "echo", ECHO, 0 }, - { "-echo", 0, ECHO }, - { "echoe", ECHOE, 0 }, - { "-echoe", 0, ECHOE }, - { "crterase", ECHOE, 0 }, - { "-crterase", 0, ECHOE }, - { "crtbs", ECHOE, 0 }, /* crtbs not supported, close enough */ - { "-crtbs", 0, ECHOE }, - { "echok", ECHOK, 0 }, - { "-echok", 0, ECHOK }, - { "echoke", ECHOKE, 0 }, - { "-echoke", 0, ECHOKE }, - { "crtkill", ECHOKE, 0 }, - { "-crtkill", 0, ECHOKE }, - { "altwerase", ALTWERASE, 0 }, - { "-altwerase", 0, ALTWERASE }, - { "iexten", IEXTEN, 0 }, - { "-iexten", 0, IEXTEN }, - { "echonl", ECHONL, 0 }, - { "-echonl", 0, ECHONL }, - { "echoctl", ECHOCTL, 0 }, - { "-echoctl", 0, ECHOCTL }, - { "ctlecho", ECHOCTL, 0 }, - { "-ctlecho", 0, ECHOCTL }, - { "echoprt", ECHOPRT, 0 }, - { "-echoprt", 0, ECHOPRT }, - { "prterase", ECHOPRT, 0 }, - { "-prterase", 0, ECHOPRT }, - { "isig", ISIG, 0 }, - { "-isig", 0, ISIG }, - { "icanon", ICANON, 0 }, - { "-icanon", 0, ICANON }, - { "noflsh", NOFLSH, 0 }, - { "-noflsh", 0, NOFLSH }, - { "tostop", TOSTOP, 0 }, - { "-tostop", 0, TOSTOP }, - { "flusho", FLUSHO, 0 }, - { "-flusho", 0, FLUSHO }, - { "pendin", PENDIN, 0 }, - { "-pendin", 0, PENDIN }, - { "crt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT }, - { "-crt", ECHOK, ECHOE|ECHOKE|ECHOCTL }, - { "newcrt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT }, - { "-newcrt", ECHOK, ECHOE|ECHOKE|ECHOCTL }, - { "nokerninfo", NOKERNINFO, 0 }, - { "-nokerninfo",0, NOKERNINFO }, - { "kerninfo", 0, NOKERNINFO }, - { "-kerninfo", NOKERNINFO, 0 }, - { NULL }, -}; - -struct modes omodes[] = { - { "opost", OPOST, 0 }, - { "-opost", 0, OPOST }, - { "litout", 0, OPOST }, - { "-litout", OPOST, 0 }, - { "onlcr", ONLCR, 0 }, - { "-onlcr", 0, ONLCR }, - { "tabs", 0, OXTABS }, /* "preserve" tabs */ - { "-tabs", OXTABS, 0 }, - { "oxtabs", OXTABS, 0 }, - { "-oxtabs", 0, OXTABS }, - { NULL }, -}; - -#define CHK(name, s) (*name == s[0] && !strcmp(name, s)) - -int -msearch(str, ip) - char *str; - struct termios *ip; -{ - struct modes *mp; - - for (mp = cmodes; mp->name; ++mp) - if (CHK(str, mp->name)) { - ip->c_cflag &= ~mp->unset; - ip->c_cflag |= mp->set; - return (1); - } - for (mp = imodes; mp->name; ++mp) - if (CHK(str, mp->name)) { - ip->c_iflag &= ~mp->unset; - ip->c_iflag |= mp->set; - return (1); - } - for (mp = lmodes; mp->name; ++mp) - if (CHK(str, mp->name)) { - ip->c_lflag &= ~mp->unset; - ip->c_lflag |= mp->set; - return (1); - } - for (mp = omodes; mp->name; ++mp) - if (CHK(str, mp->name)) { - ip->c_oflag &= ~mp->unset; - ip->c_oflag |= mp->set; - return (1); - } - return (0); -} diff --git a/usr.sbin/lpr/runqueue/printjob.c b/usr.sbin/lpr/runqueue/printjob.c deleted file mode 100644 index a1f3e23f411f..000000000000 --- a/usr.sbin/lpr/runqueue/printjob.c +++ /dev/null @@ -1,1661 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1983, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -/* -static char sccsid[] = "@(#)printjob.c 8.7 (Berkeley) 5/10/95"; -*/ -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - - -/* - * printjob -- print jobs in the queue. - * - * NOTE: the lock file is used to pass information to lpq and lprm. - * it does not need to be removed because file locks are dynamic. - */ - -#include <sys/param.h> -#include <sys/wait.h> -#include <sys/stat.h> -#include <sys/types.h> - -#include <pwd.h> -#include <unistd.h> -#include <signal.h> -#include <syslog.h> -#include <fcntl.h> -#include <dirent.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <sys/ioctl.h> -#include <termios.h> -#include <time.h> -#include "lp.h" -#include "lp.local.h" -#include "pathnames.h" -#include "extern.h" - -#define DORETURN 0 /* absorb fork error */ -#define DOABORT 1 /* abort if dofork fails */ - -/* - * Error tokens - */ -#define REPRINT -2 -#define ERROR -1 -#define OK 0 -#define FATALERR 1 -#define NOACCT 2 -#define FILTERERR 3 -#define ACCESS 4 - -static dev_t fdev; /* device of file pointed to by symlink */ -static ino_t fino; /* inode of file pointed to by symlink */ -static FILE *cfp; /* control file */ -static int child; /* id of any filters */ -static int lfd; /* lock file descriptor */ -static int ofd; /* output filter file descriptor */ -static int ofilter; /* id of output filter, if any */ -static int tfd = -1; /* output filter temp file output */ -static int pfd; /* prstatic inter file descriptor */ -static int pid; /* pid of lpd process */ -static int prchild; /* id of pr process */ -static char title[80]; /* ``pr'' title */ - -static char class[32]; /* classification field */ -static char fromhost[32]; /* user's host machine */ - /* indentation size in static characters */ -static char indent[10] = "-i0"; -static char jobname[100]; /* job or file name */ -static char length[10] = "-l"; /* page length in lines */ -static char logname[32]; /* user's login name */ -static char pxlength[10] = "-y"; /* page length in pixels */ -static char pxwidth[10] = "-x"; /* page width in pixels */ -static char tempfile[] = "errsXXXXXX"; /* file name for filter errors */ -static char width[10] = "-w"; /* page width in static characters */ -#define TFILENAME "fltXXXXXX" -static char tfile[] = TFILENAME; /* file name for filter output */ - -static void abortpr __P((int)); -static void alarmhandler __P((int)); -static void banner __P((struct printer *pp, char *name1, char *name2)); -static int dofork __P((const struct printer *pp, int action)); -static int dropit __P((int)); -static void init __P((struct printer *pp)); -static void openpr __P((const struct printer *pp)); -static void opennet __P((const struct printer *pp)); -static void opentty __P((const struct printer *pp)); -static void openrem __P((const struct printer *pp)); -static int print __P((struct printer *pp, int format, char *file)); -static int printit __P((struct printer *pp, char *file)); -static void pstatus __P((const struct printer *, const char *, ...)); -static char response __P((const struct printer *pp)); -static void scan_out __P((struct printer *pp, int scfd, char *scsp, - int dlm)); -static char *scnline __P((int, char *, int)); -static int sendfile __P((struct printer *pp, int type, char *file, - int format)); -static int sendit __P((struct printer *pp, char *file)); -static void sendmail __P((struct printer *pp, char *user, int bombed)); -static void setty __P((const struct printer *pp)); - -void msearch __P((char *, struct termios *)); - -void -printjob(pp) - struct printer *pp; -{ - struct stat stb; - register struct queue *q, **qp; - struct queue **queue; - register int i, nitems; - off_t pidoff; - int errcnt, count = 0; - - init(pp); /* set up capabilities */ - (void) write(1, "", 1); /* ack that daemon is started */ - (void) close(2); /* set up log file */ - if (open(pp->log_file, O_WRONLY|O_APPEND, LOG_FILE_MODE) < 0) { - syslog(LOG_ERR, "%s: %m", pp->log_file); - (void) open(_PATH_DEVNULL, O_WRONLY); - } - setgid(getegid()); - pid = getpid(); /* for use with lprm */ - setpgrp(0, pid); - signal(SIGHUP, abortpr); - signal(SIGINT, abortpr); - signal(SIGQUIT, abortpr); - signal(SIGTERM, abortpr); - - (void) mktemp(tempfile); - - /* - * uses short form file names - */ - if (chdir(pp->spool_dir) < 0) { - syslog(LOG_ERR, "%s: %m", pp->spool_dir); - exit(1); - } - if (stat(pp->lock_file, &stb) == 0 && (stb.st_mode & LFM_PRINT_DIS)) - exit(0); /* printing disabled */ - lfd = open(pp->lock_file, O_WRONLY|O_CREAT|O_EXLOCK|O_NONBLOCK, - LOCK_FILE_MODE); - if (lfd < 0) { - if (errno == EWOULDBLOCK) /* active daemon present */ - exit(0); - syslog(LOG_ERR, "%s: %s: %m", pp->printer, pp->lock_file); - exit(1); - } - /* turn off non-blocking mode (was turned on for lock effects only) */ - if (fcntl(lfd, F_SETFL, 0) < 0) { - syslog(LOG_ERR, "%s: %s: %m", pp->printer, pp->lock_file); - exit(1); - } - ftruncate(lfd, 0); - /* - * write process id for others to know - */ - sprintf(line, "%u\n", pid); - pidoff = i = strlen(line); - if (write(lfd, line, i) != i) { - syslog(LOG_ERR, "%s: %s: %m", pp->printer, pp->lock_file); - exit(1); - } - /* - * search the spool directory for work and sort by queue order. - */ - if ((nitems = getq(pp, &queue)) < 0) { - syslog(LOG_ERR, "%s: can't scan %s", pp->printer, - pp->spool_dir); - exit(1); - } - if (nitems == 0) /* no work to do */ - exit(0); - if (stb.st_mode & LFM_RESET_QUE) { /* reset queue flag */ - if (fchmod(lfd, stb.st_mode & ~LFM_RESET_QUE) < 0) - syslog(LOG_ERR, "%s: %s: %m", pp->printer, - pp->lock_file); - } - openpr(pp); /* open printer or remote */ -again: - /* - * we found something to do now do it -- - * write the name of the current control file into the lock file - * so the spool queue program can tell what we're working on - */ - for (qp = queue; nitems--; free((char *) q)) { - q = *qp++; - if (stat(q->q_name, &stb) < 0) - continue; - errcnt = 0; - restart: - (void) lseek(lfd, pidoff, 0); - (void) snprintf(line, sizeof(line), "%s\n", q->q_name); - i = strlen(line); - if (write(lfd, line, i) != i) - syslog(LOG_ERR, "%s: %s: %m", pp->printer, - pp->lock_file); - if (!pp->remote) - i = printit(pp, q->q_name); - else - i = sendit(pp, q->q_name); - /* - * Check to see if we are supposed to stop printing or - * if we are to rebuild the queue. - */ - if (fstat(lfd, &stb) == 0) { - /* stop printing before starting next job? */ - if (stb.st_mode & LFM_PRINT_DIS) - goto done; - /* rebuild queue (after lpc topq) */ - if (stb.st_mode & LFM_RESET_QUE) { - for (free(q); nitems--; free(q)) - q = *qp++; - if (fchmod(lfd, stb.st_mode & ~LFM_RESET_QUE) - < 0) - syslog(LOG_WARNING, "%s: %s: %m", - pp->printer, pp->lock_file); - break; - } - } - if (i == OK) /* file ok and printed */ - count++; - else if (i == REPRINT && ++errcnt < 5) { - /* try reprinting the job */ - syslog(LOG_INFO, "restarting %s", pp->printer); - if (ofilter > 0) { - kill(ofilter, SIGCONT); /* to be sure */ - (void) close(ofd); - while ((i = wait(NULL)) > 0 && i != ofilter) - ; - ofilter = 0; - } - (void) close(pfd); /* close printer */ - if (ftruncate(lfd, pidoff) < 0) - syslog(LOG_WARNING, "%s: %s: %m", - pp->printer, pp->lock_file); - openpr(pp); /* try to reopen printer */ - goto restart; - } else { - syslog(LOG_WARNING, "%s: job could not be %s (%s)", - pp->printer, - pp->remote ? "sent to remote host" : "printed", - q->q_name); - if (i == REPRINT) { - /* ensure we don't attempt this job again */ - (void) unlink(q->q_name); - q->q_name[0] = 'd'; - (void) unlink(q->q_name); - if (logname[0]) - sendmail(pp, logname, FATALERR); - } - } - } - free(queue); - /* - * search the spool directory for more work. - */ - if ((nitems = getq(pp, &queue)) < 0) { - syslog(LOG_ERR, "%s: can't scan %s", pp->printer, - pp->spool_dir); - exit(1); - } - if (nitems == 0) { /* no more work to do */ - done: - if (count > 0) { /* Files actually printed */ - if (!pp->no_formfeed && !pp->tof) - (void) write(ofd, pp->form_feed, - strlen(pp->form_feed)); - if (pp->trailer != NULL) /* output trailer */ - (void) write(ofd, pp->trailer, - strlen(pp->trailer)); - } - (void) close(ofd); - (void) wait(NULL); - (void) unlink(tempfile); - exit(0); - } - goto again; -} - -char fonts[4][50]; /* fonts for troff */ - -char ifonts[4][40] = { - _PATH_VFONTR, - _PATH_VFONTI, - _PATH_VFONTB, - _PATH_VFONTS, -}; - -/* - * The remaining part is the reading of the control file (cf) - * and performing the various actions. - */ -static int -printit(pp, file) - struct printer *pp; - char *file; -{ - register int i; - char *cp; - int bombed = OK; - - /* - * open control file; ignore if no longer there. - */ - if ((cfp = fopen(file, "r")) == NULL) { - syslog(LOG_INFO, "%s: %s: %m", pp->printer, file); - return(OK); - } - /* - * Reset troff fonts. - */ - for (i = 0; i < 4; i++) - strcpy(fonts[i], ifonts[i]); - sprintf(&width[2], "%ld", pp->page_width); - strcpy(indent+2, "0"); - - /* - * read the control file for work to do - * - * file format -- first character in the line is a command - * rest of the line is the argument. - * valid commands are: - * - * S -- "stat info" for symbolic link protection - * J -- "job name" on banner page - * C -- "class name" on banner page - * L -- "literal" user's name to print on banner - * T -- "title" for pr - * H -- "host name" of machine where lpr was done - * P -- "person" user's login name - * I -- "indent" amount to indent output - * R -- laser dpi "resolution" - * f -- "file name" name of text file to print - * l -- "file name" text file with control chars - * p -- "file name" text file to print with pr(1) - * t -- "file name" troff(1) file to print - * n -- "file name" ditroff(1) file to print - * d -- "file name" dvi file to print - * g -- "file name" plot(1G) file to print - * v -- "file name" plain raster file to print - * c -- "file name" cifplot file to print - * 1 -- "R font file" for troff - * 2 -- "I font file" for troff - * 3 -- "B font file" for troff - * 4 -- "S font file" for troff - * N -- "name" of file (used by lpq) - * U -- "unlink" name of file to remove - * (after we print it. (Pass 2 only)). - * M -- "mail" to user when done printing - * - * getline reads a line and expands tabs to blanks - */ - - /* pass 1 */ - - while (getline(cfp)) - switch (line[0]) { - case 'H': - strncpy(fromhost, line+1, sizeof(fromhost) - 1); - fromhost[sizeof(fromhost) - 1] = '\0'; - if (class[0] == '\0') { - strncpy(class, line+1, sizeof(class) - 1); - class[sizeof(class) - 1] = '\0'; - } - continue; - - case 'P': - strncpy(logname, line+1, sizeof(logname) - 1); - logname[sizeof(logname) - 1] = '\0'; - if (pp->restricted) { /* restricted */ - if (getpwnam(logname) == NULL) { - bombed = NOACCT; - sendmail(pp, line+1, bombed); - goto pass2; - } - } - continue; - - case 'S': - cp = line+1; - i = 0; - while (*cp >= '0' && *cp <= '9') - i = i * 10 + (*cp++ - '0'); - fdev = i; - cp++; - i = 0; - while (*cp >= '0' && *cp <= '9') - i = i * 10 + (*cp++ - '0'); - fino = i; - continue; - - case 'J': - if (line[1] != '\0') { - strncpy(jobname, line+1, sizeof(jobname) - 1); - jobname[sizeof(jobname) - 1] = '\0'; - } else - strcpy(jobname, " "); - continue; - - case 'C': - if (line[1] != '\0') - strncpy(class, line+1, sizeof(class) - 1); - else if (class[0] == '\0') - gethostname(class, sizeof(class)); - class[sizeof(class) - 1] = '\0'; - continue; - - case 'T': /* header title for pr */ - strncpy(title, line+1, sizeof(title) - 1); - title[sizeof(title) - 1] = '\0'; - continue; - - case 'L': /* identification line */ - if (!pp->no_header && !pp->header_last) - banner(pp, line+1, jobname); - continue; - - case '1': /* troff fonts */ - case '2': - case '3': - case '4': - if (line[1] != '\0') { - strncpy(fonts[line[0]-'1'], line+1, - 50-1); - fonts[line[0]-'1'][50-1] = '\0'; - } - continue; - - case 'W': /* page width */ - strncpy(width+2, line+1, sizeof(width) - 3); - width[2+sizeof(width) - 3] = '\0'; - continue; - - case 'I': /* indent amount */ - strncpy(indent+2, line+1, sizeof(indent) - 3); - indent[2+sizeof(indent) - 3] = '\0'; - continue; - - default: /* some file to print */ - switch (i = print(pp, line[0], line+1)) { - case ERROR: - if (bombed == OK) - bombed = FATALERR; - break; - case REPRINT: - (void) fclose(cfp); - return(REPRINT); - case FILTERERR: - case ACCESS: - bombed = i; - sendmail(pp, logname, bombed); - } - title[0] = '\0'; - continue; - - case 'N': - case 'U': - case 'M': - case 'R': - continue; - } - - /* pass 2 */ - -pass2: - fseek(cfp, 0L, 0); - while (getline(cfp)) - switch (line[0]) { - case 'L': /* identification line */ - if (!pp->no_header && pp->header_last) - banner(pp, line+1, jobname); - continue; - - case 'M': - if (bombed < NOACCT) /* already sent if >= NOACCT */ - sendmail(pp, line+1, bombed); - continue; - - case 'U': - if (strchr(line+1, '/')) - continue; - (void) unlink(line+1); - } - /* - * clean-up in case another control file exists - */ - (void) fclose(cfp); - (void) unlink(file); - return(bombed == OK ? OK : ERROR); -} - -/* - * Print a file. - * Set up the chain [ PR [ | {IF, OF} ] ] or {IF, RF, TF, NF, DF, CF, VF}. - * Return -1 if a non-recoverable error occured, - * 2 if the filter detected some errors (but printed the job anyway), - * 1 if we should try to reprint this job and - * 0 if all is well. - * Note: all filters take stdin as the file, stdout as the printer, - * stderr as the log file, and must not ignore SIGINT. - */ -static int -print(pp, format, file) - struct printer *pp; - int format; - char *file; -{ - register int n; - register char *prog; - int fi, fo; - FILE *fp; - char *av[15], buf[BUFSIZ]; - int pid, p[2], stopped = 0; - union wait status; - struct stat stb; - - if (lstat(file, &stb) < 0 || (fi = open(file, O_RDONLY)) < 0) - return(ERROR); - /* - * Check to see if data file is a symbolic link. If so, it should - * still point to the same file or someone is trying to print - * something he shouldn't. - */ - if ((stb.st_mode & S_IFMT) == S_IFLNK && fstat(fi, &stb) == 0 && - (stb.st_dev != fdev || stb.st_ino != fino)) - return(ACCESS); - if (!pp->no_formfeed && !pp->tof) { /* start on a fresh page */ - (void) write(ofd, pp->form_feed, strlen(pp->form_feed)); - pp->tof = 1; - } - if (pp->filters[LPF_INPUT] == NULL - && (format == 'f' || format == 'l')) { - pp->tof = 0; - while ((n = read(fi, buf, BUFSIZ)) > 0) - if (write(ofd, buf, n) != n) { - (void) close(fi); - return(REPRINT); - } - (void) close(fi); - return(OK); - } - switch (format) { - case 'p': /* print file using 'pr' */ - if (pp->filters[LPF_INPUT] == NULL) { /* use output filter */ - prog = _PATH_PR; - av[0] = "pr"; - av[1] = width; - av[2] = length; - av[3] = "-h"; - av[4] = *title ? title : " "; - av[5] = "-F"; - av[6] = 0; - fo = ofd; - goto start; - } - pipe(p); - if ((prchild = dofork(pp, DORETURN)) == 0) { /* child */ - dup2(fi, 0); /* file is stdin */ - dup2(p[1], 1); /* pipe is stdout */ - closelog(); - closeallfds(3); - execl(_PATH_PR, "pr", width, length, - "-h", *title ? title : " ", "-F", 0); - syslog(LOG_ERR, "cannot execl %s", _PATH_PR); - exit(2); - } - (void) close(p[1]); /* close output side */ - (void) close(fi); - if (prchild < 0) { - prchild = 0; - (void) close(p[0]); - return(ERROR); - } - fi = p[0]; /* use pipe for input */ - case 'f': /* print plain text file */ - prog = pp->filters[LPF_INPUT]; - av[1] = width; - av[2] = length; - av[3] = indent; - n = 4; - break; - case 'l': /* like 'f' but pass control characters */ - prog = pp->filters[LPF_INPUT]; - av[1] = "-c"; - av[2] = width; - av[3] = length; - av[4] = indent; - n = 5; - break; - case 'r': /* print a fortran text file */ - prog = pp->filters[LPF_FORTRAN]; - av[1] = width; - av[2] = length; - n = 3; - break; - case 't': /* print troff output */ - case 'n': /* print ditroff output */ - case 'd': /* print tex output */ - (void) unlink(".railmag"); - if ((fo = creat(".railmag", FILMOD)) < 0) { - syslog(LOG_ERR, "%s: cannot create .railmag", - pp->printer); - (void) unlink(".railmag"); - } else { - for (n = 0; n < 4; n++) { - if (fonts[n][0] != '/') - (void) write(fo, _PATH_VFONT, - sizeof(_PATH_VFONT) - 1); - (void) write(fo, fonts[n], strlen(fonts[n])); - (void) write(fo, "\n", 1); - } - (void) close(fo); - } - prog = (format == 't') ? pp->filters[LPF_TROFF] - : ((format == 'n') ? pp->filters[LPF_DITROFF] - : pp->filters[LPF_DVI]); - av[1] = pxwidth; - av[2] = pxlength; - n = 3; - break; - case 'c': /* print cifplot output */ - prog = pp->filters[LPF_CIFPLOT]; - av[1] = pxwidth; - av[2] = pxlength; - n = 3; - break; - case 'g': /* print plot(1G) output */ - prog = pp->filters[LPF_GRAPH]; - av[1] = pxwidth; - av[2] = pxlength; - n = 3; - break; - case 'v': /* print raster output */ - prog = pp->filters[LPF_RASTER]; - av[1] = pxwidth; - av[2] = pxlength; - n = 3; - break; - default: - (void) close(fi); - syslog(LOG_ERR, "%s: illegal format character '%c'", - pp->printer, format); - return(ERROR); - } - if (prog == NULL) { - (void) close(fi); - syslog(LOG_ERR, - "%s: no filter found in printcap for format character '%c'", - pp->printer, format); - return(ERROR); - } - if ((av[0] = strrchr(prog, '/')) != NULL) - av[0]++; - else - av[0] = prog; - av[n++] = "-n"; - av[n++] = logname; - av[n++] = "-h"; - av[n++] = fromhost; - av[n++] = pp->acct_file; - av[n] = 0; - fo = pfd; - if (ofilter > 0) { /* stop output filter */ - write(ofd, "\031\1", 2); - while ((pid = - wait3((int *)&status, WUNTRACED, 0)) > 0 && pid != ofilter) - ; - if (status.w_stopval != WSTOPPED) { - (void) close(fi); - syslog(LOG_WARNING, - "%s: output filter died " - "(retcode=%d termsig=%d)", - pp->printer, status.w_retcode, - status.w_termsig); - return(REPRINT); - } - stopped++; - } -start: - if ((child = dofork(pp, DORETURN)) == 0) { /* child */ - dup2(fi, 0); - dup2(fo, 1); - n = open(tempfile, O_WRONLY|O_CREAT|O_TRUNC, 0664); - if (n >= 0) - dup2(n, 2); - closelog(); - closeallfds(3); - execv(prog, av); - syslog(LOG_ERR, "cannot execv %s", prog); - exit(2); - } - (void) close(fi); - if (child < 0) - status.w_retcode = 100; - else - while ((pid = wait((int *)&status)) > 0 && pid != child) - ; - child = 0; - prchild = 0; - if (stopped) { /* restart output filter */ - if (kill(ofilter, SIGCONT) < 0) { - syslog(LOG_ERR, "cannot restart output filter"); - exit(1); - } - } - pp->tof = 0; - - /* Copy filter output to "lf" logfile */ - if ((fp = fopen(tempfile, "r"))) { - while (fgets(buf, sizeof(buf), fp)) - fputs(buf, stderr); - fclose(fp); - } - - if (!WIFEXITED(status)) { - syslog(LOG_WARNING, "%s: filter '%c' terminated (termsig=%d)", - pp->printer, format, status.w_termsig); - return(ERROR); - } - switch (status.w_retcode) { - case 0: - pp->tof = 1; - return(OK); - case 1: - return(REPRINT); - case 2: - return(ERROR); - default: - syslog(LOG_WARNING, "%s: filter '%c' exited (retcode=%d)", - pp->printer, format, status.w_retcode); - return(FILTERERR); - } -} - -/* - * Send the daemon control file (cf) and any data files. - * Return -1 if a non-recoverable error occured, 1 if a recoverable error and - * 0 if all is well. - */ -static int -sendit(pp, file) - struct printer *pp; - char *file; -{ - register int i, err = OK; - char *cp, last[BUFSIZ]; - - /* - * open control file - */ - if ((cfp = fopen(file, "r")) == NULL) - return(OK); - /* - * read the control file for work to do - * - * file format -- first character in the line is a command - * rest of the line is the argument. - * commands of interest are: - * - * a-z -- "file name" name of file to print - * U -- "unlink" name of file to remove - * (after we print it. (Pass 2 only)). - */ - - /* - * pass 1 - */ - while (getline(cfp)) { - again: - if (line[0] == 'S') { - cp = line+1; - i = 0; - while (*cp >= '0' && *cp <= '9') - i = i * 10 + (*cp++ - '0'); - fdev = i; - cp++; - i = 0; - while (*cp >= '0' && *cp <= '9') - i = i * 10 + (*cp++ - '0'); - fino = i; - } else if (line[0] == 'H') { - strcpy(fromhost, line+1); - if (class[0] == '\0') - strncpy(class, line+1, sizeof(class) - 1); - } else if (line[0] == 'P') { - strncpy(logname, line+1, sizeof(logname) - 1); - if (pp->restricted) { /* restricted */ - if (getpwnam(logname) == NULL) { - sendmail(pp, line+1, NOACCT); - err = ERROR; - break; - } - } - } else if (line[0] == 'I') { - strncpy(indent+2, line+1, sizeof(indent) - 3); - } else if (line[0] >= 'a' && line[0] <= 'z') { - strcpy(last, line); - while ((i = getline(cfp)) != 0) - if (strcmp(last, line)) - break; - switch (sendfile(pp, '\3', last+1, *last)) { - case OK: - if (i) - goto again; - break; - case REPRINT: - (void) fclose(cfp); - return(REPRINT); - case ACCESS: - sendmail(pp, logname, ACCESS); - case ERROR: - err = ERROR; - } - break; - } - } - if (err == OK && sendfile(pp, '\2', file, '\0') > 0) { - (void) fclose(cfp); - return(REPRINT); - } - /* - * pass 2 - */ - fseek(cfp, 0L, 0); - while (getline(cfp)) - if (line[0] == 'U' && !strchr(line+1, '/')) - (void) unlink(line+1); - /* - * clean-up in case another control file exists - */ - (void) fclose(cfp); - (void) unlink(file); - return(err); -} - -/* - * Send a data file to the remote machine and spool it. - * Return positive if we should try resending. - */ -static int -sendfile(pp, type, file, format) - struct printer *pp; - int type; - char *file; - char format; -{ - register int f, i, amt; - struct stat stb; - char buf[BUFSIZ]; - int sizerr, resp, closedpr; - - if (lstat(file, &stb) < 0 || (f = open(file, O_RDONLY)) < 0) - return(ERROR); - /* - * Check to see if data file is a symbolic link. If so, it should - * still point to the same file or someone is trying to print something - * he shouldn't. - */ - if ((stb.st_mode & S_IFMT) == S_IFLNK && fstat(f, &stb) == 0 && - (stb.st_dev != fdev || stb.st_ino != fino)) - return(ACCESS); - - sizerr = 0; - closedpr = 0; - if (type == '\3') { - if (pp->filters[LPF_INPUT]) { - /* - * We're sending something with an ifilter, we have to - * run the ifilter and store the output as a - * temporary file (tfile)... the protocol requires us - * to send the file size - */ - char *av[15]; - int n; - int ifilter; - union wait status; /* XXX */ - - strcpy(tfile,TFILENAME); - if ((tfd = mkstemp(tfile)) == -1) { - syslog(LOG_ERR, "mkstemp: %m"); - return(ERROR); - } - if ((av[0] = strrchr(pp->filters[LPF_INPUT], '/')) == NULL) - av[0] = pp->filters[LPF_INPUT]; - else - av[0]++; - if (format == 'l') - av[n=1] = "-c"; - else - n = 0; - av[++n] = width; - av[++n] = length; - av[++n] = indent; - av[++n] = "-n"; - av[++n] = logname; - av[++n] = "-h"; - av[++n] = fromhost; - av[++n] = pp->acct_file; - av[++n] = 0; - if ((ifilter = dofork(pp, DORETURN)) == 0) { /* child */ - dup2(f, 0); - dup2(tfd, 1); - n = open(tempfile, O_WRONLY|O_CREAT|O_TRUNC, - TEMP_FILE_MODE); - if (n >= 0) - dup2(n, 2); - closelog(); - closeallfds(3); - execv(pp->filters[LPF_INPUT], av); - syslog(LOG_ERR, "cannot execv %s", - pp->filters[LPF_INPUT]); - exit(2); - } - (void) close(f); - if (ifilter < 0) - status.w_retcode = 100; - else - while ((pid = wait((int *)&status)) > 0 && - pid != ifilter) - ; - switch (status.w_retcode) { - case 0: - break; - case 1: - unlink(tfile); - return(REPRINT); - case 2: - unlink(tfile); - return(ERROR); - default: - syslog(LOG_WARNING, "%s: filter '%c' exited" - " (retcode=%d)", - pp->printer, format, status.w_retcode); - unlink(tfile); - return(FILTERERR); - } - if (fstat(tfd, &stb) < 0) /* the size of tfile */ - return(ERROR); - f = tfd; - lseek(f,0,SEEK_SET); - } else if (ofilter) { - /* - * We're sending something with an ofilter, we have to - * store the output as a temporary file (tfile)... the - * protocol requires us to send the file size - */ - int i; - for (i = 0; i < stb.st_size; i += BUFSIZ) { - amt = BUFSIZ; - if (i + amt > stb.st_size) - amt = stb.st_size - i; - if (sizerr == 0 && read(f, buf, amt) != amt) { - sizerr = 1; - break; - } - if (write(ofd, buf, amt) != amt) { - (void) close(f); - return(REPRINT); - } - } - close(ofd); - close(f); - while ((i = wait(NULL)) > 0 && i != ofilter) - ; - ofilter = 0; - if (fstat(tfd, &stb) < 0) { /* the size of tfile */ - openpr(pp); - return(ERROR); - } - f = tfd; - lseek(f,0,SEEK_SET); - closedpr = 1; - } - } - - (void) sprintf(buf, "%c%qd %s\n", type, stb.st_size, file); - amt = strlen(buf); - for (i = 0; ; i++) { - if (write(pfd, buf, amt) != amt || - (resp = response(pp)) < 0 || resp == '\1') { - (void) close(f); - if (tfd != -1 && type == '\3') { - tfd = -1; - unlink(tfile); - if (closedpr) - openpr(pp); - } - return(REPRINT); - } else if (resp == '\0') - break; - if (i == 0) - pstatus(pp, - "no space on remote; waiting for queue to drain"); - if (i == 10) - syslog(LOG_ALERT, "%s: can't send to %s; queue full", - pp->printer, pp->remote_host); - sleep(5 * 60); - } - if (i) - pstatus(pp, "sending to %s", pp->remote_host); - for (i = 0; i < stb.st_size; i += BUFSIZ) { - amt = BUFSIZ; - if (i + amt > stb.st_size) - amt = stb.st_size - i; - if (sizerr == 0 && read(f, buf, amt) != amt) - sizerr = 1; - if (write(pfd, buf, amt) != amt) { - (void) close(f); - if (tfd != -1 && type == '\3') { - tfd = -1; - unlink(tfile); - if (closedpr) - openpr(pp); - } - return(REPRINT); - } - } - - (void) close(f); - if (tfd != -1 && type == '\3') { - tfd = -1; - unlink(tfile); - } - if (sizerr) { - syslog(LOG_INFO, "%s: %s: changed size", pp->printer, file); - /* tell recvjob to ignore this file */ - (void) write(pfd, "\1", 1); - if (closedpr) - openpr(pp); - return(ERROR); - } - if (write(pfd, "", 1) != 1 || response(pp)) { - if (closedpr) - openpr(pp); - return(REPRINT); - } - if (closedpr) - openpr(pp); - return(OK); -} - -/* - * Check to make sure there have been no errors and that both programs - * are in sync with eachother. - * Return non-zero if the connection was lost. - */ -static char -response(pp) - const struct printer *pp; -{ - char resp; - - if (read(pfd, &resp, 1) != 1) { - syslog(LOG_INFO, "%s: lost connection", pp->printer); - return(-1); - } - return(resp); -} - -/* - * Banner printing stuff - */ -static void -banner(pp, name1, name2) - struct printer *pp; - char *name1, *name2; -{ - time_t tvec; - - time(&tvec); - if (!pp->no_formfeed && !pp->tof) - (void) write(ofd, pp->form_feed, strlen(pp->form_feed)); - if (pp->short_banner) { /* short banner only */ - if (class[0]) { - (void) write(ofd, class, strlen(class)); - (void) write(ofd, ":", 1); - } - (void) write(ofd, name1, strlen(name1)); - (void) write(ofd, " Job: ", 7); - (void) write(ofd, name2, strlen(name2)); - (void) write(ofd, " Date: ", 8); - (void) write(ofd, ctime(&tvec), 24); - (void) write(ofd, "\n", 1); - } else { /* normal banner */ - (void) write(ofd, "\n\n\n", 3); - scan_out(pp, ofd, name1, '\0'); - (void) write(ofd, "\n\n", 2); - scan_out(pp, ofd, name2, '\0'); - if (class[0]) { - (void) write(ofd,"\n\n\n",3); - scan_out(pp, ofd, class, '\0'); - } - (void) write(ofd, "\n\n\n\n\t\t\t\t\tJob: ", 15); - (void) write(ofd, name2, strlen(name2)); - (void) write(ofd, "\n\t\t\t\t\tDate: ", 12); - (void) write(ofd, ctime(&tvec), 24); - (void) write(ofd, "\n", 1); - } - if (!pp->no_formfeed) - (void) write(ofd, pp->form_feed, strlen(pp->form_feed)); - pp->tof = 1; -} - -static char * -scnline(key, p, c) - register int key; - register char *p; - int c; -{ - register scnwidth; - - for (scnwidth = WIDTH; --scnwidth;) { - key <<= 1; - *p++ = key & 0200 ? c : BACKGND; - } - return (p); -} - -#define TRC(q) (((q)-' ')&0177) - -static void -scan_out(pp, scfd, scsp, dlm) - struct printer *pp; - int scfd, dlm; - char *scsp; -{ - register char *strp; - register nchrs, j; - char outbuf[LINELEN+1], *sp, c, cc; - int d, scnhgt; - - for (scnhgt = 0; scnhgt++ < HEIGHT+DROP; ) { - strp = &outbuf[0]; - sp = scsp; - for (nchrs = 0; ; ) { - d = dropit(c = TRC(cc = *sp++)); - if ((!d && scnhgt > HEIGHT) || (scnhgt <= DROP && d)) - for (j = WIDTH; --j;) - *strp++ = BACKGND; - else - strp = scnline(scnkey[(int)c][scnhgt-1-d], strp, cc); - if (*sp == dlm || *sp == '\0' || - nchrs++ >= pp->page_width/(WIDTH+1)-1) - break; - *strp++ = BACKGND; - *strp++ = BACKGND; - } - while (*--strp == BACKGND && strp >= outbuf) - ; - strp++; - *strp++ = '\n'; - (void) write(scfd, outbuf, strp-outbuf); - } -} - -static int -dropit(c) - int c; -{ - switch(c) { - - case TRC('_'): - case TRC(';'): - case TRC(','): - case TRC('g'): - case TRC('j'): - case TRC('p'): - case TRC('q'): - case TRC('y'): - return (DROP); - - default: - return (0); - } -} - -/* - * sendmail --- - * tell people about job completion - */ -static void -sendmail(pp, user, bombed) - struct printer *pp; - char *user; - int bombed; -{ - register int i; - int p[2], s; - register char *cp; - struct stat stb; - FILE *fp; - - pipe(p); - if ((s = dofork(pp, DORETURN)) == 0) { /* child */ - dup2(p[0], 0); - closelog(); - closeallfds(3); - if ((cp = strrchr(_PATH_SENDMAIL, '/')) != NULL) - cp++; - else - cp = _PATH_SENDMAIL; - execl(_PATH_SENDMAIL, cp, "-t", 0); - _exit(0); - } else if (s > 0) { /* parent */ - dup2(p[1], 1); - printf("To: %s@%s\n", user, fromhost); - printf("Subject: %s printer job \"%s\"\n", pp->printer, - *jobname ? jobname : "<unknown>"); - printf("Reply-To: root@%s\n\n", host); - printf("Your printer job "); - if (*jobname) - printf("(%s) ", jobname); - - cp = "XXX compiler confusion"; /* XXX shut GCC up */ - switch (bombed) { - case OK: - printf("\ncompleted successfully\n"); - cp = "OK"; - break; - default: - case FATALERR: - printf("\ncould not be printed\n"); - cp = "FATALERR"; - break; - case NOACCT: - printf("\ncould not be printed without an account on %s\n", host); - cp = "NOACCT"; - break; - case FILTERERR: - if (stat(tempfile, &stb) < 0 || stb.st_size == 0 || - (fp = fopen(tempfile, "r")) == NULL) { - printf("\nhad some errors and may not have printed\n"); - break; - } - printf("\nhad the following errors and may not have printed:\n"); - while ((i = getc(fp)) != EOF) - putchar(i); - (void) fclose(fp); - cp = "FILTERERR"; - break; - case ACCESS: - printf("\nwas not printed because it was not linked to the original file\n"); - cp = "ACCESS"; - } - fflush(stdout); - (void) close(1); - } else { - syslog(LOG_WARNING, "unable to send mail to %s: %m", user); - return; - } - (void) close(p[0]); - (void) close(p[1]); - wait(NULL); - syslog(LOG_INFO, "mail sent to user %s about job %s on printer %s (%s)", - user, *jobname ? jobname : "<unknown>", pp->printer, cp); -} - -/* - * dofork - fork with retries on failure - */ -static int -dofork(pp, action) - const struct printer *pp; - int action; -{ - register int i, pid; - struct passwd *pwd; - - for (i = 0; i < 20; i++) { - if ((pid = fork()) < 0) { - sleep((unsigned)(i*i)); - continue; - } - /* - * Child should run as daemon instead of root - */ - if (pid == 0) { - if ((pwd = getpwuid(pp->daemon_user)) == NULL) { - syslog(LOG_ERR, "Can't lookup default daemon uid (%d) in password file", - pp->daemon_user); - break; - } - initgroups(pwd->pw_name, pwd->pw_gid); - setgid(pwd->pw_gid); - setuid(pp->daemon_user); - } - return(pid); - } - syslog(LOG_ERR, "can't fork"); - - switch (action) { - case DORETURN: - return (-1); - default: - syslog(LOG_ERR, "bad action (%d) to dofork", action); - /*FALL THRU*/ - case DOABORT: - exit(1); - } - /*NOTREACHED*/ -} - -/* - * Kill child processes to abort current job. - */ -static void -abortpr(signo) - int signo; -{ - (void) unlink(tempfile); - kill(0, SIGINT); - if (ofilter > 0) - kill(ofilter, SIGCONT); - while (wait(NULL) > 0) - ; - if (ofilter > 0 && tfd != -1) - unlink(tfile); - exit(0); -} - -static void -init(pp) - struct printer *pp; -{ - char *s; - - sprintf(&width[2], "%ld", pp->page_width); - sprintf(&length[2], "%ld", pp->page_length); - sprintf(&pxwidth[2], "%ld", pp->page_pwidth); - sprintf(&pxlength[2], "%ld", pp->page_plength); - if ((s = checkremote(pp)) != 0) { - syslog(LOG_WARNING, "%s", s); - free(s); - } -} - -void -startprinting(printer) - const char *printer; -{ - struct printer myprinter, *pp = &myprinter; - int status; - - init_printer(pp); - status = getprintcap(printer, pp); - switch(status) { - case PCAPERR_OSERR: - syslog(LOG_ERR, "can't open printer description file: %m"); - exit(1); - case PCAPERR_NOTFOUND: - syslog(LOG_ERR, "unknown printer: %s", printer); - exit(1); - case PCAPERR_TCLOOP: - fatal(pp, "potential reference loop detected in printcap file"); - default: - break; - } - printjob(pp); -} - -/* - * Acquire line printer or remote connection. - */ -static void -openpr(pp) - const struct printer *pp; -{ - int p[2]; - char *cp; - - if (pp->remote) { - openrem(pp); - } else if (*pp->lp) { - if ((cp = strchr(pp->lp, '@')) != NULL) - opennet(pp); - else - opentty(pp); - } else { - syslog(LOG_ERR, "%s: no line printer device or host name", - pp->printer); - exit(1); - } - - /* - * Start up an output filter, if needed. - */ - if (pp->filters[LPF_OUTPUT] && !pp->filters[LPF_INPUT] && !ofilter) { - pipe(p); - if (pp->remote) { - strcpy(tfile, TFILENAME); - tfd = mkstemp(tfile); - } - if ((ofilter = dofork(pp, DOABORT)) == 0) { /* child */ - dup2(p[0], 0); /* pipe is std in */ - /* tfile/printer is stdout */ - dup2(pp->remote ? tfd : pfd, 1); - closelog(); - closeallfds(3); - if ((cp = strrchr(pp->filters[LPF_OUTPUT], '/')) == NULL) - cp = pp->filters[LPF_OUTPUT]; - else - cp++; - execl(pp->filters[LPF_OUTPUT], cp, width, length, 0); - syslog(LOG_ERR, "%s: %s: %m", pp->printer, - pp->filters[LPF_OUTPUT]); - exit(1); - } - (void) close(p[0]); /* close input side */ - ofd = p[1]; /* use pipe for output */ - } else { - ofd = pfd; - ofilter = 0; - } -} - -/* - * Printer connected directly to the network - * or to a terminal server on the net - */ -static void -opennet(pp) - const struct printer *pp; -{ - register int i; - int resp; - u_long port; - char *ep; - void (*savealrm)(int); - - port = strtoul(pp->lp, &ep, 0); - if (*ep != ':' || port > 65536) { - syslog(LOG_ERR, "%s: bad port number: %s", pp->printer, - pp->lp); - exit(1); - } - ep++; - - for (i = 1; ; i = i < 256 ? i << 1 : i) { - resp = -1; - savealrm = signal(SIGALRM, alarmhandler); - alarm(pp->conn_timeout); - pfd = getport(pp, ep, port); - alarm(0); - (void)signal(SIGALRM, savealrm); - if (pfd < 0 && errno == ECONNREFUSED) - resp = 1; - else if (pfd >= 0) { - /* - * need to delay a bit for rs232 lines - * to stabilize in case printer is - * connected via a terminal server - */ - delay(500); - break; - } - if (i == 1) { - if (resp < 0) - pstatus(pp, "waiting for %s to come up", - pp->lp); - else - pstatus(pp, - "waiting for access to printer on %s", - pp->lp); - } - sleep(i); - } - pstatus(pp, "sending to %s port %d", ep, port); -} - -/* - * Printer is connected to an RS232 port on this host - */ -static void -opentty(pp) - const struct printer *pp; -{ - register int i; - - for (i = 1; ; i = i < 32 ? i << 1 : i) { - pfd = open(pp->lp, pp->rw ? O_RDWR : O_WRONLY); - if (pfd >= 0) { - delay(500); - break; - } - if (errno == ENOENT) { - syslog(LOG_ERR, "%s: %m", pp->lp); - exit(1); - } - if (i == 1) - pstatus(pp, - "waiting for %s to become ready (offline?)", - pp->printer); - sleep(i); - } - if (isatty(pfd)) - setty(pp); - pstatus(pp, "%s is ready and printing", pp->printer); -} - -/* - * Printer is on a remote host - */ -static void -openrem(pp) - const struct printer *pp; -{ - register int i; - int resp; - void (*savealrm)(int); - - for (i = 1; ; i = i < 256 ? i << 1 : i) { - resp = -1; - savealrm = signal(SIGALRM, alarmhandler); - alarm(pp->conn_timeout); - pfd = getport(pp, pp->remote_host, 0); - alarm(0); - (void)signal(SIGALRM, savealrm); - if (pfd >= 0) { - if ((writel(pfd, "\2", pp->remote_queue, "\n", - (char *)0) - == 2 + strlen(pp->remote_queue)) - && (resp = response(pp)) == 0) - break; - (void) close(pfd); - } - if (i == 1) { - if (resp < 0) - pstatus(pp, "waiting for %s to come up", - pp->remote_host); - else { - pstatus(pp, - "waiting for queue to be enabled on %s", - pp->remote_host); - i = 256; - } - } - sleep(i); - } - pstatus(pp, "sending to %s", pp->remote_host); -} - -/* - * setup tty lines. - */ -static void -setty(pp) - const struct printer *pp; -{ - struct termios ttybuf; - - if (ioctl(pfd, TIOCEXCL, (char *)0) < 0) { - syslog(LOG_ERR, "%s: ioctl(TIOCEXCL): %m", pp->printer); - exit(1); - } - if (tcgetattr(pfd, &ttybuf) < 0) { - syslog(LOG_ERR, "%s: tcgetattr: %m", pp->printer); - exit(1); - } - if (pp->baud_rate > 0) - cfsetspeed(&ttybuf, pp->baud_rate); - if (pp->mode_set) { - char *s = strdup(pp->mode_set), *tmp; - - while ((tmp = strsep(&s, ",")) != NULL) { - msearch(tmp, &ttybuf); - } - } - if (pp->mode_set != 0 || pp->baud_rate > 0) { - if (tcsetattr(pfd, TCSAFLUSH, &ttybuf) == -1) { - syslog(LOG_ERR, "%s: tcsetattr: %m", pp->printer); - } - } -} - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -static void -#ifdef __STDC__ -pstatus(const struct printer *pp, const char *msg, ...) -#else -pstatus(pp, msg, va_alist) - const struct printer *pp; - char *msg; - va_dcl -#endif -{ - int fd; - char *buf; - va_list ap; -#ifdef __STDC__ - va_start(ap, msg); -#else - va_start(ap); -#endif - - umask(0); - fd = open(pp->status_file, O_WRONLY|O_CREAT|O_EXLOCK, STAT_FILE_MODE); - if (fd < 0) { - syslog(LOG_ERR, "%s: %s: %m", pp->printer, pp->status_file); - exit(1); - } - ftruncate(fd, 0); - vasprintf(&buf, msg, ap); - va_end(ap); - writel(fd, buf, "\n", (char *)0); - close(fd); - free(buf); -} - -void -alarmhandler(signo) -{ - /* ignored */ -}