diff options
author | Marc Balmer <mbalmer@cvs.openbsd.org> | 2006-07-04 05:31:55 +0000 |
---|---|---|
committer | Marc Balmer <mbalmer@cvs.openbsd.org> | 2006-07-04 05:31:55 +0000 |
commit | ec92f721beb437f1bb07bb5ca28c2966d19d8816 (patch) | |
tree | 397b540ab8a7e0e68e2996fb5eb749776fd1bff1 | |
parent | 353cfc7c783ed04ab1bbc05d697b72667268ba95 (diff) |
nmeaattach - attach serial lines as timedelta sensors. nmeaattach is used
to designate a serial line with a NMEA 0183 device (i.e. a GPS receiver) as a
source of a timedelta sensor.
ok deraadt@
-rw-r--r-- | sbin/Makefile | 6 | ||||
-rw-r--r-- | sbin/nmeaattach/Makefile | 6 | ||||
-rw-r--r-- | sbin/nmeaattach/nmeaattach.8 | 86 | ||||
-rw-r--r-- | sbin/nmeaattach/nmeaattach.c | 175 |
4 files changed, 270 insertions, 3 deletions
diff --git a/sbin/Makefile b/sbin/Makefile index 2f1a5bbdf0d..e33092d6820 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -1,11 +1,11 @@ -# $OpenBSD: Makefile,v 1.79 2006/06/26 03:40:10 deraadt Exp $ +# $OpenBSD: Makefile,v 1.80 2006/07/04 05:31:54 mbalmer Exp $ # Not ported: XNSrouted enpload scsiformat startslip # Missing: icheck SUBDIR= atactl badsect bioctl brconfig ccdconfig disklabel dmesg dhclient \ - fsck growfs ifconfig init iopctl ipsecctl isakmpd kbd \ - lmccontrol mknod modload modunload mount mountd ncheck_ffs nfsd \ + fsck growfs ifconfig init iopctl ipsecctl isakmpd kbd lmccontrol \ + mknod modload modunload mount mountd ncheck_ffs nfsd nmeaattach \ nologin pfctl pflogd ping quotacheck raidctl reboot route routed \ savecore scan_ffs scsi shutdown slattach swapctl sysctl \ ttyflags umount diff --git a/sbin/nmeaattach/Makefile b/sbin/nmeaattach/Makefile new file mode 100644 index 00000000000..db3c58ce9ba --- /dev/null +++ b/sbin/nmeaattach/Makefile @@ -0,0 +1,6 @@ +# $OpenBSD: Makefile,v 1.1 2006/07/04 05:31:54 mbalmer Exp $ + +PROG= nmeaattach +MAN= nmeaattach.8 + +.include <bsd.prog.mk> diff --git a/sbin/nmeaattach/nmeaattach.8 b/sbin/nmeaattach/nmeaattach.8 new file mode 100644 index 00000000000..a8f4a64c6dc --- /dev/null +++ b/sbin/nmeaattach/nmeaattach.8 @@ -0,0 +1,86 @@ +.\" $OpenBSD: nmeaattach.8,v 1.1 2006/07/04 05:31:54 mbalmer Exp $ +.\" +.\" Copyright (c) 2006 Marc Balmer <mbalmer@openbsd.org> +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd June 12, 2006 +.Dt NMEAATTACH 8 +.Os +.Sh NAME +.Nm nmeaattach +.Nd attach serial lines as timedelta sensors +.Sh SYNOPSIS +.Nm nmeaattach +.Op Fl dhm +.Op Fl s Ar baudrate +.Ar device +.Sh DESCRIPTION +.Nm +is used to designate a serial line with a NMEA 0183 device as a source of +timedelta sensors. +The following operands are supported by +.Nm nmeaattach : +.Bl -tag -width Ar +.It Fl d +Do not daemonize. +.It Fl h +Turn on RTS/CTS flow control. +By default, no flow control is done. +.It Fl m +Maintain modem control signals after closing the line. +Specifically, this disables HUPCL. +.It Fl s Ar baudrate +Specifies the speed of the connection. +If not specified, the default of 4800 baud is used. +.It Fl t Ar cond +Chooses the condition which will cause the current system +time to be immediately copied to the terminal timestamp storage. +Only one can be used. +.Bl -tag -width DCDXX +.It dcd +Copy the timestamp when DCD is asserted. +.It !dcd +Copy the timestamp when DCD is deasserted. +.It cts +Copy the timestamp when CTS is asserted. +.It !cts +Copy the timestamp when CTS is deasserted. +.El +.Pp +If no condition is specified, the +.Xr nmea 4 +line discipline will timestamp on receiving the leading '$' character +of each GPRMC sentence. +.It Ar device +Specifies the name of the serial line. +.Ar device +should be a string of the form +.Dq cuaXX , +or +.Dq /dev/cuaXX . +.El +.Pp +Only the superuser may designate NMEA devices. +.Pp +To detach the interface, kill off the +.Nm +process. +.Sh SEE ALSO +.Xr nmea 4 , +.Xr tty 4 +.Sh HISTORY +The +.Nm +command appeared in +.Ox 4.0 . diff --git a/sbin/nmeaattach/nmeaattach.c b/sbin/nmeaattach/nmeaattach.c new file mode 100644 index 00000000000..7acd46fca14 --- /dev/null +++ b/sbin/nmeaattach/nmeaattach.c @@ -0,0 +1,175 @@ +/* $OpenBSD: nmeaattach.c,v 1.1 2006/07/04 05:31:54 mbalmer Exp $ */ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 2006 Marc Balmer <mbalmer@openbsd.org> + * + * This code is derived from software contributed to Berkeley by + * Rick Adams. + * + * 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. 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. + */ + +#include <sys/param.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/ttycom.h> + +#include <net/if.h> +#include <netinet/in.h> + +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <netdb.h> +#include <paths.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <syslog.h> +#include <termios.h> +#include <unistd.h> + +int speed = B4800; + +char devicename[32]; + +__dead void usage(void); +void coroner(int); + +volatile sig_atomic_t dying = 0; + +__dead void +usage(void) +{ + extern char *__progname; + + fprintf(stderr, "usage: %s [-dhm] [-s speed] [-t cond] device\n", + __progname); + exit(1); +} +int +main(int argc, char *argv[]) +{ + int fd; + char *dev; + struct termios tty; + struct tstamps tstamps; + const char *errstr; + tcflag_t cflag = HUPCL; + int ch; + sigset_t sigset; + int i; + int nmeadisc = NMEADISC; + int nodaemon = 0; + + tstamps.ts_set = tstamps.ts_clr = 0; + + while ((ch = getopt(argc, argv, "dhms:t:")) != -1) { + switch (ch) { + case 'd': + nodaemon = 1; + break; + case 'h': + cflag |= CRTSCTS; + break; + case 'm': + cflag &= ~HUPCL; + break; + case 's': + speed = (int)strtonum(optarg, 50, 115200, &errstr); + if (errstr) + errx(1, "speed is %s: %s", errstr, optarg); + break; + case 't': + if (!strcasecmp(optarg, "dcd")) + tstamps.ts_set |= TIOCM_CAR; + else if (!strcasecmp(optarg, "!dcd")) + tstamps.ts_clr |= TIOCM_CAR; + else if (!strcasecmp(optarg, "cts")) + tstamps.ts_set |= TIOCM_CTS; + else if (!strcasecmp(optarg, "!cts")) + tstamps.ts_clr |= TIOCM_CTS; + else + errx(1, "'%s' not supported for timestamping", + optarg); + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc != 1) + usage(); + + dev = *argv; + if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) { + (void)snprintf(devicename, sizeof(devicename), + "%s%s", _PATH_DEV, dev); + dev = devicename; + } + if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) + err(1, "open: %s", dev); + + tty.c_cflag = CREAD | CS8 | cflag; + tty.c_iflag = 0; + tty.c_lflag = 0; + tty.c_oflag = 0; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 0; + cfsetspeed(&tty, speed); + if (tcsetattr(fd, TCSADRAIN, &tty) < 0) + err(1, "tcsetattr"); + if (ioctl(fd, TIOCSDTR, 0) < 0) + err(1, "TIOCSDTR"); + if (ioctl(fd, TIOCSETD, &nmeadisc) < 0) + err(1, "TIOCSETD"); + if ((tstamps.ts_set || tstamps.ts_clr) && + ioctl(fd, TIOCSTSTAMP, &tstamps) < 0) + err(1, "TIOCSTSTAMP"); + + if (!nodaemon && daemon(0, 0)) + errx(1, "can't daemonize"); + + signal(SIGHUP, coroner); + signal(SIGTERM, coroner); + + sigemptyset(&sigset); + for (;;) { + sigsuspend(&sigset); + if (dying) + return (0); + } +} + +void +coroner(int useless) +{ + dying = 1; +} |