summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Balmer <mbalmer@cvs.openbsd.org>2006-07-04 05:31:55 +0000
committerMarc Balmer <mbalmer@cvs.openbsd.org>2006-07-04 05:31:55 +0000
commitec92f721beb437f1bb07bb5ca28c2966d19d8816 (patch)
tree397b540ab8a7e0e68e2996fb5eb749776fd1bff1
parent353cfc7c783ed04ab1bbc05d697b72667268ba95 (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/Makefile6
-rw-r--r--sbin/nmeaattach/Makefile6
-rw-r--r--sbin/nmeaattach/nmeaattach.886
-rw-r--r--sbin/nmeaattach/nmeaattach.c175
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;
+}