1186284Sbms/*- 2186284Sbms * Copyright (c) 2008 Bruce Simpson. 3186284Sbms * All rights reserved. 4186284Sbms * 5186284Sbms * Redistribution and use in source and binary forms, with or without 6186284Sbms * modification, are permitted provided that the following conditions 7186284Sbms * are met: 8186284Sbms * 1. Redistributions of source code must retain the above copyright 9186284Sbms * notice, this list of conditions and the following disclaimer. 10186284Sbms * 2. Redistributions in binary form must reproduce the above copyright 11186284Sbms * notice, this list of conditions and the following disclaimer in the 12186284Sbms * documentation and/or other materials provided with the distribution. 13186284Sbms * 14186284Sbms * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15186284Sbms * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16186284Sbms * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17186284Sbms * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18186284Sbms * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19186284Sbms * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20186284Sbms * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21186284Sbms * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22186284Sbms * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23186284Sbms * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24186284Sbms * SUCH DAMAGE. 25186284Sbms * 26186284Sbms * $FreeBSD$ 27186284Sbms */ 28186284Sbms 29186284Sbms#include <sys/param.h> 30186284Sbms#include <sys/types.h> 31186284Sbms#include <sys/ioctl.h> 32186284Sbms 33186284Sbms#include <stdlib.h> 34186284Sbms#include <stdio.h> 35186284Sbms#include <string.h> 36186284Sbms#include <errno.h> 37186284Sbms#include <err.h> 38186284Sbms#include <fcntl.h> 39186284Sbms#include <unistd.h> 40186284Sbms 41186284Sbms#include <libgen.h> 42186284Sbms#include <sysexits.h> 43186284Sbms 44186284Sbms#define DEVPATHNAME "/dev" 45186284Sbms 46186284Sbmsint 47186284Sbmsmain(int argc, char *argv[]) 48186284Sbms{ 49186284Sbms char *progname; 50186284Sbms char *ttyname; 51186284Sbms int fd; 52186284Sbms int dofree; 53186284Sbms 54186284Sbms dofree = 0; 55186284Sbms 56186284Sbms progname = basename(argv[0]); 57186284Sbms if (argc != 2) 58186284Sbms errx(EX_USAGE, "usage: %s <ttyname>\n", progname); 59186284Sbms if (geteuid() != 0) 60186284Sbms errx(EX_NOPERM, "Sorry\n"); 61186284Sbms 62186284Sbms if (argv[1][0] == '/') { 63186284Sbms ttyname = argv[1]; 64186284Sbms } else { 65186284Sbms size_t len, maxpath, result; 66186284Sbms 67186284Sbms len = strlen(argv[1]) + sizeof(DEVPATHNAME) + 1; 68186284Sbms 69186284Sbms maxpath = pathconf(DEVPATHNAME, _PC_PATH_MAX); 70186284Sbms if (len > maxpath) { 71186284Sbms warnc(ENAMETOOLONG, ttyname); 72186284Sbms exit(EX_DATAERR); 73186284Sbms } 74186284Sbms 75186284Sbms ttyname = malloc(len); 76186284Sbms if (ttyname == NULL) { 77186284Sbms warnc(ENOMEM, "malloc"); 78186284Sbms exit(EX_OSERR); 79186284Sbms } 80186284Sbms dofree = 1; 81186284Sbms 82186284Sbms result = snprintf(ttyname, len, "%s/%s", DEVPATHNAME, argv[1]); 83186284Sbms if (result >= len) 84186284Sbms warnc(ENOMEM, "snprintf"); 85186284Sbms } 86186284Sbms 87186284Sbms fd = open(ttyname, O_RDWR); 88186284Sbms if (fd == -1) { 89186284Sbms warnc(errno, "open %s", ttyname); 90186284Sbms if (dofree) 91186284Sbms free(ttyname); 92186284Sbms exit(EX_OSERR); 93186284Sbms } 94186284Sbms 95186284Sbms if (0 != ioctl(fd, TIOCNXCL, 0)) 96186284Sbms warnc(errno, "ioctl TIOCNXCL %s", ttyname); 97186284Sbms 98186284Sbms if (dofree) 99186284Sbms free(ttyname); 100186284Sbms exit(0); 101186284Sbms} 102