add 'ttyflags', to set driver specific tty flags

This commit is contained in:
cgd 1994-03-30 09:29:16 +00:00
parent a1fcdedb9d
commit 30783705f5
3 changed files with 297 additions and 0 deletions

5
sbin/ttyflags/Makefile Normal file
View File

@ -0,0 +1,5 @@
# $Id: Makefile,v 1.1 1994/03/30 09:29:16 cgd Exp $
PROG= ttyflags
.include <bsd.prog.mk>

82
sbin/ttyflags/ttyflags.8 Normal file
View File

@ -0,0 +1,82 @@
.\"
.\" Copyright (c) 1994 Christopher G. Demetriou
.\" 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 Christopher G. Demetriou.
.\" 3. The name of the author may not be used to endorse or promote products
.\" derived from this software without specific prior written permission
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
.\"
.\" $Id: ttyflags.8,v 1.1 1994/03/30 09:29:18 cgd Exp $
.\"
.Dd March 30, 1994
.Dt TTYFLAGS 8
.Os NetBSD 0.9a
.Sh NAME
.Nm ttyflags
.Nd set device-specific flags for terminals
.Sh SYNOPSIS
.Nm ttyflags
.Op Fl v
.Op Fl a | Ar tty ...
.Sh DESCRIPTION
.Nm Ttyflags
sets the device-specific flags for terminals, based on the flags
found on the terminal's line in
.Pa /etc/ttys .
.Pp
The options are as follows:
.Bl -tag -width Ds
.It Fl a
Set the flags for all terminals in
.Pa /etc/ttys .
.It Fl v
Be verbose about what the terminals' flags will be set to.
.El
.Pp
The
.Ar tty
arguments are optional, but must not be specified if the
.Fl a
flag is used. If specified, the
.Ar tty
arguments should be the base names of
the ttys, as found in
.Pa /etc/ttys .
.Sh FILES
.Bl -tag -width /etc/ttys -compact
.It Pa /etc/ttys
.El
.Sh SEE ALSO
.Xr getttyent 3 ,
.Xr ttys 5
.Sh HISTORY
The
.Nm ttyflags
utility appeared in
.Nx 0.9a .
.Sh BUGS
The conditions on which to report an error are ill-defined.
.Nm Ttyflags
tries to report all significant errors, perhaps going over-board
at times.

210
sbin/ttyflags/ttyflags.c Normal file
View File

@ -0,0 +1,210 @@
/*
* Copyright (c) 1994 Christopher G. Demetriou
* 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 Christopher G. Demetriou.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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
char copyright[] =
"@(#) Copyright (c) 1994 Christopher G. Demetriou\n\
All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char rcsid[] = "$Id: ttyflags.c,v 1.1 1994/03/30 09:29:19 cgd Exp $";
#endif /* not lint */
#include <sys/types.h>
#include <sys/cdefs.h>
#include <sys/ioctl.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
#include <stdio.h>
#include <stdlib.h>
#include <ttyent.h>
#include <unistd.h>
int change_all __P((void));
int change_ttyflags __P((struct ttyent *));
int change_ttys __P((char **));
void usage __P((void));
int nflag, vflag;
/*
* Ttyflags sets the device-specific tty flags, based on the contents
* of /etc/ttys. It can either set all of the ttys' flags, or set
* the flags of the ttys specified on the command line.
*/
int
main(argc, argv)
int argc;
char *argv[];
{
int aflag, ch, rval;
aflag = nflag = vflag = 0;
while ((ch = getopt(argc, argv, "anv")) != EOF)
switch (ch) {
case 'a':
aflag = 1;
break;
case 'n': /* undocumented */
nflag = 1;
break;
case 'v':
vflag = 1;
break;
case '?':
default:
usage();
}
argc -= optind;
argv += optind;
if (aflag && argc != 0)
usage();
rval = 0;
if (setttyent() == 0)
err(1, "setttyent");
if (aflag)
rval = change_all();
else
rval = change_ttys(argv);
if (endttyent() == 0)
warn("endttyent");
exit(rval);
}
/*
* Change all /etc/ttys entries' flags.
*/
int
change_all()
{
struct ttyent *tep;
int rval;
rval = 0;
for (tep = getttyent(); tep != NULL; tep = getttyent())
if (change_ttyflags(tep))
rval = 1;
return (rval);
}
/*
* Change the specified ttys' flags.
*/
int
change_ttys(ttylist)
char **ttylist;
{
struct ttyent *tep;
int rval;
rval = 0;
for (; *ttylist != NULL; ttylist++) {
tep = getttynam(*ttylist);
if (tep == NULL) {
warnx("couldn't find an entry in %s for \"%s\"",
_PATH_TTYS, *ttylist);
rval = 1;
continue;
}
if (change_ttyflags(tep))
rval = 1;
}
return (rval);
}
/*
* Acutually do the work; find out what the new flags value should be,
* open the device, and change the flags.
*/
int
change_ttyflags(tep)
struct ttyent *tep;
{
int fd, flags, rval, st;
char path[PATH_MAX];
st = tep->ty_status;
flags = rval = 0;
/* Convert ttyent.h flags into ioctl flags. */
if (st & TTY_LOCAL)
flags |= TIOCFLAG_CLOCAL;
if (st & TTY_RTSCTS)
flags |= TIOCFLAG_CRTSCTS;
if (st & TTY_SOFTCAR)
flags |= TIOCFLAG_SOFTCAR;
if (st & TTY_MDMBUF)
flags |= TIOCFLAG_MDMBUF;
/* Find the full device path name. */
(void)snprintf(path, sizeof path, "%s%s", _PATH_DEV, tep->ty_name);
if (vflag)
warnx("setting flags on %s to %0x", path, flags);
if (nflag)
return (0);
/* Open the device NON-BLOCKING, set the flags, and close it. */
if ((fd = open(path, O_RDONLY | O_NONBLOCK, 0)) == -1) {
warn("open %s", path);
return (1);
}
if (ioctl(fd, TIOCSFLAGS, &flags) == -1 && errno != ENOTTY) {
warn("TIOCSFLAGS on %s", path);
rval = 1;
}
if (close(fd) == -1) {
warn("close %s", path);
return (1);
}
return (rval);
}
/*
* Print usage information when a bogus set of arguments is given.
*/
void
usage()
{
(void)fprintf(stderr, "usage: ttyflags [-v] [-a | tty ... ]\n");
exit(1);
}