1330449Seadler/*- 2330449Seadler * SPDX-License-Identifier: BSD-4-Clause 3330449Seadler * 42470Scsgr * Copyright (c) 1994 Geoffrey M. Rehmet 52470Scsgr * All rights reserved. 62470Scsgr * 72470Scsgr * Redistribution and use in source and binary forms, with or without 82470Scsgr * modification, are permitted provided that the following conditions 92470Scsgr * are met: 102470Scsgr * 1. Redistributions of source code must retain the above copyright 112470Scsgr * notice, this list of conditions and the following disclaimer. 122470Scsgr * 2. Redistributions in binary form must reproduce the above copyright 132470Scsgr * notice, this list of conditions and the following disclaimer in the 142470Scsgr * documentation and/or other materials provided with the distribution. 152470Scsgr * 3. All advertising materials mentioning features or use of this software 162470Scsgr * must display the following acknowledgement: 172470Scsgr * This product includes software developed by Geoffrey M. Rehmet 182470Scsgr * 4. The name of the author may not be used to endorse or promote products 1997748Sschweikh * derived from this software without specific prior written permission 202470Scsgr * 212470Scsgr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 222470Scsgr * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 232470Scsgr * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 242470Scsgr * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 252470Scsgr * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 262470Scsgr * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 272470Scsgr * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 282470Scsgr * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 292470Scsgr * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 302470Scsgr * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 312470Scsgr */ 322470Scsgr 33114601Sobrien#include <sys/cdefs.h> 34114601Sobrien__FBSDID("$FreeBSD: stable/11/usr.sbin/lptcontrol/lptcontrol.c 330449 2018-03-05 07:26:05Z eadler $"); 3529846Scharnier 36136037Sschweikh#include <dev/ppbus/lptio.h> 37136037Sschweikh 3829846Scharnier#include <err.h> 39136037Sschweikh#include <fcntl.h> 40136037Sschweikh#include <unistd.h> 41136037Sschweikh 422484Scsgr#include <stdio.h> 432470Scsgr#include <stdlib.h> 442484Scsgr 45136037Sschweikh#define DEFAULT_DEVICE "/dev/lpt0.ctl" 46136037Sschweikh#define IRQ_UNSPECIFIED -1 472470Scsgr#define DO_POLL 0 482470Scsgr#define USE_IRQ 1 4942475Snsouch#define USE_EXT_MODE 2 5042475Snsouch#define USE_STD_MODE 3 512470Scsgr 5278714Sddstatic void usage(void) 532470Scsgr{ 54136037Sschweikh fprintf(stderr, 55136037Sschweikh "usage: lptcontrol -e | -i | -p | -s [[-d] controldevice]\n"); 562470Scsgr exit(1); 572470Scsgr} 582470Scsgr 59136037Sschweikhint main (int argc, char **argv) 602470Scsgr{ 61136037Sschweikh const char *device; 62136037Sschweikh int fd; 63136037Sschweikh int irq_status; 64136037Sschweikh int opt; 652470Scsgr 66136037Sschweikh device = DEFAULT_DEVICE; 67136037Sschweikh irq_status = IRQ_UNSPECIFIED; 68136037Sschweikh while ((opt = getopt(argc, argv, "d:eips")) != -1) 69136037Sschweikh switch (opt) { 70136037Sschweikh case 'd': 71136037Sschweikh device = optarg; 72136037Sschweikh break; 73136037Sschweikh case 'e': 74136037Sschweikh irq_status = USE_EXT_MODE; 75136037Sschweikh break; 76136037Sschweikh case 'i': 77136037Sschweikh irq_status = USE_IRQ; 78136037Sschweikh break; 79136037Sschweikh case 'p': 80136037Sschweikh irq_status = DO_POLL; 81136037Sschweikh break; 82136037Sschweikh case 's': 83136037Sschweikh irq_status = USE_STD_MODE; 84136037Sschweikh break; 85136037Sschweikh case '?': 86136037Sschweikh default: 87136037Sschweikh usage(); 88136037Sschweikh /* NOTREACHED */ 89136037Sschweikh } 90136037Sschweikh argc -= optind; 91136037Sschweikh argv += optind; 92136037Sschweikh /* POLA: DTRT if -d was forgotten, but device name was specified. */ 93136037Sschweikh if (argc == 1) { 94136037Sschweikh device = argv[0]; 95136037Sschweikh --argc; 96136037Sschweikh } 97136037Sschweikh 98136037Sschweikh if (irq_status == IRQ_UNSPECIFIED || argc != 0) 99136037Sschweikh usage(); 100136037Sschweikh 101140814Sssouhlal if ((fd = open(device, O_WRONLY)) < 0) 10229846Scharnier err(1, "open"); 103136037Sschweikh if (ioctl(fd, LPT_IRQ, &irq_status) < 0) 10429846Scharnier err(1, "ioctl"); 1052470Scsgr close(fd); 1062470Scsgr 107136037Sschweikh return(0); 1082470Scsgr} 109