summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcsgr <csgr@FreeBSD.org>1994-09-03 22:47:08 +0000
committercsgr <csgr@FreeBSD.org>1994-09-03 22:47:08 +0000
commit7b6e72a847a7d44c2c26046d7b7b45ffb24d6bac (patch)
treefae137773c8b7b37ab895b0c2108c844082d5eb7
parent010d228ad6975af67848079ecbeca590d3ac7ed1 (diff)
downloadFreeBSD-src-7b6e72a847a7d44c2c26046d7b7b45ffb24d6bac.zip
FreeBSD-src-7b6e72a847a7d44c2c26046d7b7b45ffb24d6bac.tar.gz
Make it possible to run lptcontrol on a printer port which does not
actually have a printer connected or online: - MAKEDEV: remove all signs of lpa add lpctl? devices (minor # = unit + 128) - usr.sbin/Makefile add lptcontrol - sys/i386/isa/lpt.c implement the LP_BYPASS flag: when a unit is opened with this flag set, the printer is not primed, and no check is made to see that the printer is online. This can only be used to pass ioctls. (giving us /dev/lpctl?) - lptcontrol.c use /dev/lpctl? (LP_BYPASS) -f flag removed, -u flag added - lptcontrol.8 document changes in lptcontrol rewrite using mandoc macros Submitted by: Geoff.
-rw-r--r--etc/MAKEDEV17
-rw-r--r--etc/etc.i386/MAKEDEV17
-rw-r--r--sys/i386/isa/lpt.c28
-rw-r--r--usr.sbin/Makefile3
-rw-r--r--usr.sbin/lptcontrol/lptcontrol.884
-rw-r--r--usr.sbin/lptcontrol/lptcontrol.c54
6 files changed, 117 insertions, 86 deletions
diff --git a/etc/MAKEDEV b/etc/MAKEDEV
index de7d633..1da5366 100644
--- a/etc/MAKEDEV
+++ b/etc/MAKEDEV
@@ -64,7 +64,6 @@
#
# Printers:
# lpt* stock lp
-# lpa* interruptless lp
#
# Call units:
#
@@ -76,7 +75,7 @@
# snd* various sound cards
# pcaudio PCM audio driver
#
-# $Id: MAKEDEV,v 1.36 1994/05/30 03:53:01 ache Exp $
+# $Id: MAKEDEV,v 1.37 1994/06/17 21:50:07 jkh Exp $
#
PATH=/sbin:/bin/:/usr/bin:/usr/sbin:
@@ -89,7 +88,7 @@ all)
sh MAKEDEV std # standard
sh MAKEDEV wd0 wd1 fd0 fd1 ft0 wt0 sd0 sd1 st0 cd0 mcd0 # bdev
sh MAKEDEV pty0 tty0 tty1 pc0 lpt0 lpt1 lpt2 # cdev
- sh MAKEDEV ch0 tw0 bpf0 dcf0 lpa0 lpa1 lpa2 # cdev
+ sh MAKEDEV ch0 tw0 bpf0 dcf0 # cdev
sh MAKEDEV speaker pcaudio psm0 mse0 ttyd2 ttyd3 # cdev
sh MAKEDEV vty4 # cdev
;;
@@ -418,7 +417,10 @@ cd*|mcd*)
lpt*)
unit=`expr $i : 'lpt\(.*\)'`
rm -f lpt$unit
+ rm -f lpctl$unit
mknod lpt$unit c 16 $unit
+ mknod lpctl$unit c 16 `expr $unit + 128`
+ chown root.wheel lpt$unit
chown root.wheel lpt$unit
;;
@@ -469,15 +471,6 @@ dcf*)
chown root.wheel dcf$unit
;;
-lpa*)
- unit=`expr $i : 'lpa\(.*\)'`
- chr=25
- rm -f lpa$unit lpa${unit}p
- mknod lpa${unit} c $chr `expr $unit + 0`
- mknod lpa${unit}p c $chr `expr $unit + 32`
- chown root.wheel lpa${unit} lpa${unit}p
- ;;
-
speaker)
rm -f speaker
mknod speaker c 26 0
diff --git a/etc/etc.i386/MAKEDEV b/etc/etc.i386/MAKEDEV
index de7d633..1da5366 100644
--- a/etc/etc.i386/MAKEDEV
+++ b/etc/etc.i386/MAKEDEV
@@ -64,7 +64,6 @@
#
# Printers:
# lpt* stock lp
-# lpa* interruptless lp
#
# Call units:
#
@@ -76,7 +75,7 @@
# snd* various sound cards
# pcaudio PCM audio driver
#
-# $Id: MAKEDEV,v 1.36 1994/05/30 03:53:01 ache Exp $
+# $Id: MAKEDEV,v 1.37 1994/06/17 21:50:07 jkh Exp $
#
PATH=/sbin:/bin/:/usr/bin:/usr/sbin:
@@ -89,7 +88,7 @@ all)
sh MAKEDEV std # standard
sh MAKEDEV wd0 wd1 fd0 fd1 ft0 wt0 sd0 sd1 st0 cd0 mcd0 # bdev
sh MAKEDEV pty0 tty0 tty1 pc0 lpt0 lpt1 lpt2 # cdev
- sh MAKEDEV ch0 tw0 bpf0 dcf0 lpa0 lpa1 lpa2 # cdev
+ sh MAKEDEV ch0 tw0 bpf0 dcf0 # cdev
sh MAKEDEV speaker pcaudio psm0 mse0 ttyd2 ttyd3 # cdev
sh MAKEDEV vty4 # cdev
;;
@@ -418,7 +417,10 @@ cd*|mcd*)
lpt*)
unit=`expr $i : 'lpt\(.*\)'`
rm -f lpt$unit
+ rm -f lpctl$unit
mknod lpt$unit c 16 $unit
+ mknod lpctl$unit c 16 `expr $unit + 128`
+ chown root.wheel lpt$unit
chown root.wheel lpt$unit
;;
@@ -469,15 +471,6 @@ dcf*)
chown root.wheel dcf$unit
;;
-lpa*)
- unit=`expr $i : 'lpa\(.*\)'`
- chr=25
- rm -f lpa$unit lpa${unit}p
- mknod lpa${unit} c $chr `expr $unit + 0`
- mknod lpa${unit}p c $chr `expr $unit + 32`
- chown root.wheel lpa${unit} lpa${unit}p
- ;;
-
speaker)
rm -f speaker
mknod speaker c 26 0
diff --git a/sys/i386/isa/lpt.c b/sys/i386/isa/lpt.c
index 00080c3..4b03ae3 100644
--- a/sys/i386/isa/lpt.c
+++ b/sys/i386/isa/lpt.c
@@ -46,7 +46,7 @@
* SUCH DAMAGE.
*
* from: unknown origin, 386BSD 0.1
- * $Id: lpt.c,v 1.15 1994/08/14 01:46:28 phk Exp $
+ * $Id: lpt.c,v 1.16 1994/08/23 07:52:20 paul Exp $
*/
/*
@@ -397,7 +397,7 @@ lptattach(struct isa_device *isdp)
sc->sc_irq = LP_HAS_IRQ | LP_USE_IRQ | LP_ENABLE_IRQ;
printf("lpt%d: Interrupt-driven port\n", isdp->id_unit);
#ifdef INET
- lpattach(sc,isdp->id_unit);
+ lpattach(sc,isdp->id_unit);
#endif
} else {
sc->sc_irq = 0;
@@ -410,6 +410,8 @@ lptattach(struct isa_device *isdp)
/*
* lptopen -- reset the printer, then wait until it's selected and not busy.
+ * If LP_BYPASS flag is selected, then we do not try to select the
+ * printer -- this is just used for passing ioctls.
*/
int
@@ -434,8 +436,15 @@ lptopen(dev_t dev, int flag)
return(EBUSY);
} else sc->sc_state |= INIT;
- s = spltty();
sc->sc_flags = LPTFLAGS(minor(dev));
+
+ /* Check for open with BYPASS flag set. */
+ if(sc->sc_flags & LP_BYPASS) {
+ sc->sc_state = OPEN;
+ return(0);
+ }
+
+ s = spltty();
lprintf("lp flags 0x%x\n", sc->sc_flags);
port = sc->sc_port;
@@ -540,6 +549,9 @@ lptclose(dev_t dev, int flag)
struct lpt_softc *sc = lpt_sc + LPTUNIT(minor(dev));
int port = sc->sc_port;
+ if(sc->sc_flags & LP_BYPASS)
+ goto end_close;
+
sc->sc_state &= ~OPEN;
/* if the last write was interrupted, don't complete it */
@@ -551,10 +563,11 @@ lptclose(dev_t dev, int flag)
"lpclose", hz) != EWOULDBLOCK)
break;
- sc->sc_state = 0;
- sc->sc_xfercnt = 0;
outb(sc->sc_port+lpt_control, LPC_NINIT);
brelse(sc->sc_inbuf);
+end_close:
+ sc->sc_state = 0;
+ sc->sc_xfercnt = 0;
lprintf("closed.\n");
return(0);
}
@@ -634,6 +647,11 @@ lptwrite(dev_t dev, struct uio * uio)
int pl, err;
struct lpt_softc *sc = lpt_sc + LPTUNIT(minor(dev));
+ if(sc->sc_flags & LP_BYPASS) {
+ /* we can't do writes in bypass mode */
+ return(EPERM);
+ }
+
sc->sc_state &= ~INTERRUPTED;
while (n = min(BUFSIZE, uio->uio_resid)) {
sc->sc_cp = sc->sc_inbuf->b_un.b_addr ;
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index 0a9704f..7c0c5d5 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -4,7 +4,8 @@
# XXX MISSING SOURCES: ac quot
# XXX TEMP. BROKEN: iostat xntpd
SUBDIR= accton amd arp chown chroot cron dbsym dev_mkdb diskpart \
- edquota inetd kbdcontrol kgmon kvm_mkdb lpr mtree portmap pstat \
+ edquota inetd kbdcontrol kgmon kvm_mkdb lpr lptcontrol \
+ mtree portmap pstat \
pwd_mkdb quotaon repquota routed rmt rtprio rwhod sendmail \
sliplogin sysctl syslogd tcpdump traceroute trpt vidcontrol \
vipw ypbind yppoll ypset
diff --git a/usr.sbin/lptcontrol/lptcontrol.8 b/usr.sbin/lptcontrol/lptcontrol.8
index 52c34a6..4a02390 100644
--- a/usr.sbin/lptcontrol/lptcontrol.8
+++ b/usr.sbin/lptcontrol/lptcontrol.8
@@ -12,56 +12,62 @@
.\"
.\"
.\" $Id: lptcontrol.1,v 1.3 1994/05/22 12:31:54 csgr Exp $
-.TH lptcontrol 1 "March 12, 1994" "" "FreeBSD"
-
-.SH NAME
-lptcontrol - a utility for manipulating the lpt printer driver.
-.SH SYNOPSIS
-.na
-.B lptcontrol
-.RB [options]
-.SH DESCRIPTION
+.Dd September 3, 1994
+.Dt LPTCONTROL 8
+.Os FreeBSD 2
+.Sh NAME
+.Nm \&lptcontrol
+.Nd a utility for manipulating the lpt printer driver.
+.Sh SYNOPSIS
+.Nm \&lptcontrol
+.Cm -i
+|
+.Cm -p
+.Op Fl u Ar unit no
+.Sh DESCRIPTION
The
-.B lptcontrol
+.Nm lptcontrol
command is used to set either the interrupt-driven or polling mode
-of individual lpt devices. When a printer is switched between
+of individual
+.Xr lpt 4
+devices. When a printer is switched between
interrupt-driven and polled mode, this change will only take effect
the next time the device is opened.
-.SH OPTIONS
+.Sh OPTIONS
.TP
-The following command line options are supported.
-.TP
-.B \-i
+The following command line options are supported:
+.Bl -tag -width indent
+.It Fl i
Turns on interrupt-driven mode.
-.TP
-.B \-p
+.It Fl p
Turns on polled mode.
-.TP
-.BI "\-f\ " file
+.It Fl u Ar n
Sets the mode of the printer device specified by
-.I file.
+.Em n .
The default value for
-.I file
+.Em n
is
-.I /dev/lpt0
-.TP
+.Em 0 (ie. /dev/lpt0)
+.El
+.Pp
One of
-.B \-i
+.Fl i
or
-.B \-p
+.Fl p
must be specified.
-.PP
-.SH FILES
-/dev/lpt?
-.PP
-.SH BUGS
-If the port to be controlled does not have a printer connected and
-on-line, then lptcontrol will not be able to open the port in question
-for performing ioctl's and will fail.
-.sp
-Sure to be others.
-.SH "SEE ALSO"
-.BR lpt (4) ,
-.BR /sys/i386/conf/GENERICAH
-.SH AUTHOR
+.Pp
+.Sh FILES
+.Bl -tag -width indent -compact
+.It Pa /dev/lpt? - printer devices
+.It Pa /dev/lpctl? - printer control devices
+.El
+.Sh BUGS
+Sure to be some.
+.Sh "SEE ALSO"
+.Xr lpt 4
+.Xr /sys/i386/conf/GENERICAH
+.Sh AUTHOR
Geoffrey M. Rehmet
+.Sh HISTORY
+.Nm lptcontrol
+first appeared in FreeBSD 1.1.5
diff --git a/usr.sbin/lptcontrol/lptcontrol.c b/usr.sbin/lptcontrol/lptcontrol.c
index bcb3ad3..cbe0410 100644
--- a/usr.sbin/lptcontrol/lptcontrol.c
+++ b/usr.sbin/lptcontrol/lptcontrol.c
@@ -27,30 +27,35 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: lptcontrol.c,v 1.2 1994/04/08 22:23:39 csgr Exp $
+ * $Id: lptcontrol.c,v 1.1.1.1 1994/09/03 13:10:09 csgr Exp $
*/
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <machine/lpt.h>
-#include <stdlib.h>
-#include <unistd.h>
+#include <ctype.h>
+#include <limits.h>
+#include <paths.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+
+#include <machine/lpt.h>
#include <sys/errno.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
-#define DEFAULT_LPT "/dev/lpt0"
+#define PATH_LPCTL _PATH_DEV "lpctl"
+#define DEFAULT_UNIT "0"
#define IRQ_INVALID -1
#define DO_POLL 0
#define USE_IRQ 1
-static char default_printer[] = DEFAULT_LPT;
-
static void usage(const char * progname)
{
- fprintf(stderr, "usage: %s -i | -p [-f <file name>]\n", progname);
+ fprintf(stderr, "usage: %s -i | -p [-u <unit no.>]\n", progname);
+ fprintf(stderr, "\tUnit no. is a value in the range 0 to 3\n");
+ fprintf(stderr, "\tThe default unit no is 0 (ie. /dev/lpt0)\n");
exit(1);
}
@@ -69,23 +74,38 @@ static void set_interrupt_status(int irq_status, const char * file)
close(fd);
}
+static char * dev_file(char unit_no)
+{
+ static char devname[_POSIX_PATH_MAX+1];
+ int len;
+
+ strncpy(devname, PATH_LPCTL, _POSIX_PATH_MAX);
+ devname[len = strlen(devname)] = unit_no;
+ devname[++len] = '\0';
+
+ return(devname);
+}
int main (int argc, char * argv[])
{
int opt;
- int irq_status = -1;
- char * file = default_printer;
+ int irq_status = IRQ_INVALID;
+ char * unit = DEFAULT_UNIT;
- while((opt = getopt(argc, argv, "pif:")) != -1)
+ while((opt = getopt(argc, argv, "ipu:")) != -1)
switch(opt) {
case 'i': irq_status = USE_IRQ; break;
case 'p': irq_status = DO_POLL; break;
- case 'f': file = optarg; break;
+ case 'u': unit = optarg;
+ if(!isdigit(*unit))
+ usage(argv[0]);
+ break;
default : usage(argv[0]);
}
- if(irq_status == IRQ_INVALID) usage(argv[0]);
+ if(irq_status == IRQ_INVALID)
+ usage(argv[0]);
- set_interrupt_status(irq_status, file);
+ set_interrupt_status(irq_status, dev_file(*unit));
exit(0);
}
OpenPOWER on IntegriCloud