1*5f1d0b02Sjoerg /* $NetBSD: irdaattach.c,v 1.9 2011/08/30 19:07:07 joerg Exp $ */
24d606df9Saugustss
34d606df9Saugustss /*
44d606df9Saugustss * Copyright (c) 2001 The NetBSD Foundation, Inc.
54d606df9Saugustss * All rights reserved.
64d606df9Saugustss *
74d606df9Saugustss * This code is derived from software contributed to The NetBSD Foundation
84d606df9Saugustss * by Lennart Augustsson (lennart@augustsson.net).
94d606df9Saugustss *
104d606df9Saugustss * Redistribution and use in source and binary forms, with or without
114d606df9Saugustss * modification, are permitted provided that the following conditions
124d606df9Saugustss * are met:
134d606df9Saugustss * 1. Redistributions of source code must retain the above copyright
144d606df9Saugustss * notice, this list of conditions and the following disclaimer.
154d606df9Saugustss * 2. Redistributions in binary form must reproduce the above copyright
164d606df9Saugustss * notice, this list of conditions and the following disclaimer in the
174d606df9Saugustss * documentation and/or other materials provided with the distribution.
184d606df9Saugustss *
194d606df9Saugustss * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
204d606df9Saugustss * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
214d606df9Saugustss * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
224d606df9Saugustss * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
234d606df9Saugustss * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
244d606df9Saugustss * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
254d606df9Saugustss * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
264d606df9Saugustss * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
274d606df9Saugustss * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
284d606df9Saugustss * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
294d606df9Saugustss * POSSIBILITY OF SUCH DAMAGE.
304d606df9Saugustss */
314d606df9Saugustss /*
324d606df9Saugustss * Inspired by slattach.c.
334d606df9Saugustss */
344d606df9Saugustss
354d606df9Saugustss #include <sys/ioctl.h>
36ddeb0819Sthorpej #include <dev/ir/irdaio.h>
374d606df9Saugustss
384d606df9Saugustss #include <err.h>
394d606df9Saugustss #include <fcntl.h>
404d606df9Saugustss #include <paths.h>
414d606df9Saugustss #include <signal.h>
424d606df9Saugustss #include <stdio.h>
434d606df9Saugustss #include <stdlib.h>
444d606df9Saugustss #include <string.h>
454d606df9Saugustss #include <termios.h>
464d606df9Saugustss #include <unistd.h>
474d606df9Saugustss #include <util.h>
484d606df9Saugustss
49*5f1d0b02Sjoerg __dead static void usage(void);
504d606df9Saugustss
514d606df9Saugustss int
main(int argc,char ** argv)524d606df9Saugustss main(int argc, char **argv)
534d606df9Saugustss {
544d606df9Saugustss int fd;
554d606df9Saugustss char *dev, devbuf[100];
566651d58dSlukem const char *donglename = "none";
574d606df9Saugustss struct termios tty;
584d606df9Saugustss tcflag_t cflag = HUPCL;
594d606df9Saugustss int ch;
60b3df6303Skleink sigset_t nsigset;
614d606df9Saugustss int opt_detach = 1;
624d606df9Saugustss int pr_pid = 0;
634d606df9Saugustss int pr_frame = 0;
644d606df9Saugustss int frdev;
654d606df9Saugustss int dongle;
664d606df9Saugustss
674d606df9Saugustss while ((ch = getopt(argc, argv, "d:fhHlmnp")) != -1) {
684d606df9Saugustss switch (ch) {
694d606df9Saugustss case 'd':
704d606df9Saugustss donglename = optarg;
714d606df9Saugustss break;
724d606df9Saugustss case 'f':
734d606df9Saugustss pr_frame = 1;
744d606df9Saugustss break;
754d606df9Saugustss case 'h':
764d606df9Saugustss cflag |= CRTSCTS;
774d606df9Saugustss break;
784d606df9Saugustss case 'H':
794d606df9Saugustss cflag |= CDTRCTS;
804d606df9Saugustss break;
814d606df9Saugustss case 'l':
824d606df9Saugustss cflag |= CLOCAL;
834d606df9Saugustss break;
844d606df9Saugustss case 'm':
854d606df9Saugustss cflag &= ~HUPCL;
864d606df9Saugustss break;
874d606df9Saugustss case 'n':
884d606df9Saugustss opt_detach = 0;
894d606df9Saugustss break;
904d606df9Saugustss case 'p':
914d606df9Saugustss pr_pid = 1;
924d606df9Saugustss break;
934d606df9Saugustss case '?':
944d606df9Saugustss default:
954d606df9Saugustss usage();
964d606df9Saugustss }
974d606df9Saugustss }
984d606df9Saugustss argc -= optind;
994d606df9Saugustss argv += optind;
1004d606df9Saugustss
1014d606df9Saugustss if (argc != 1)
1024d606df9Saugustss usage();
1034d606df9Saugustss
1044d606df9Saugustss dev = *argv;
1054d606df9Saugustss if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
1064d606df9Saugustss (void)snprintf(devbuf, sizeof(devbuf),
1074d606df9Saugustss "%s%s", _PATH_DEV, dev);
1084d606df9Saugustss dev = devbuf;
1094d606df9Saugustss }
1104d606df9Saugustss if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0)
1114d606df9Saugustss err(1, "%s", dev);
1124d606df9Saugustss tty.c_cflag = CREAD | CS8 | cflag;
1134d606df9Saugustss tty.c_iflag = 0;
1144d606df9Saugustss tty.c_lflag = 0;
1154d606df9Saugustss tty.c_oflag = 0;
1164d606df9Saugustss tty.c_cc[VMIN] = 1;
1174d606df9Saugustss tty.c_cc[VTIME] = 0;
1184d606df9Saugustss cfsetspeed(&tty, 9600);
1194d606df9Saugustss if (tcsetattr(fd, TCSADRAIN, &tty) < 0)
1204d606df9Saugustss err(1, "tcsetattr");
1214d606df9Saugustss if (ioctl(fd, TIOCSDTR, 0) < 0)
1224d606df9Saugustss err(1, "TIOCSDTR");
1234d606df9Saugustss if (ioctl(fd, TIOCSLINED, "irframe") < 0)
1244d606df9Saugustss err(1, "TIOCSLINED");
1254d606df9Saugustss if (pr_frame) {
1264d606df9Saugustss if (ioctl(fd, IRFRAMETTY_GET_DEVICE, &frdev) < 0)
1274d606df9Saugustss err(1, "IRFRAMETTY_GET_DEVICE");
128f0e6efecSaugustss printf("%sirframe%d\n", _PATH_DEV, frdev);
1294d606df9Saugustss }
1304d606df9Saugustss if (strcmp(donglename, "none") == 0)
1314d606df9Saugustss dongle = DONGLE_NONE;
1324d606df9Saugustss else if (strcmp(donglename, "tekram") == 0)
1334d606df9Saugustss dongle = DONGLE_TEKRAM;
1344d606df9Saugustss else if (strcmp(donglename, "jeteye") == 0)
1354d606df9Saugustss dongle = DONGLE_JETEYE;
1364d606df9Saugustss else if (strcmp(donglename, "actisys") == 0)
1374d606df9Saugustss dongle = DONGLE_ACTISYS;
1384d606df9Saugustss else if (strcmp(donglename, "actisys+") == 0)
1394d606df9Saugustss dongle = DONGLE_ACTISYS_PLUS;
1404d606df9Saugustss else if (strcmp(donglename, "litelink") == 0)
1414d606df9Saugustss dongle = DONGLE_LITELINK;
1424d606df9Saugustss else if (strcmp(donglename, "girbil") == 0)
1434d606df9Saugustss dongle = DONGLE_GIRBIL;
1444d606df9Saugustss else
145eda9e509Sgrant errx(1, "Unknown dongle");
1464d606df9Saugustss if (ioctl(fd, IRFRAMETTY_SET_DONGLE, &dongle) < 0)
1474d606df9Saugustss err(1, "IRFRAMETTY_SET_DONGLE");
1484d606df9Saugustss
1499ef59a85Saugustss fflush(stdout);
1504d606df9Saugustss if (opt_detach && daemon(0, 0) != 0)
1514d606df9Saugustss err(1, "couldn't detach");
1524d606df9Saugustss if (pr_pid)
1534d606df9Saugustss pidfile(NULL);
154b3df6303Skleink sigemptyset(&nsigset);
1554d606df9Saugustss for (;;)
156b3df6303Skleink sigsuspend(&nsigset);
1574d606df9Saugustss }
1584d606df9Saugustss
159*5f1d0b02Sjoerg static void
usage(void)160*5f1d0b02Sjoerg usage(void)
1614d606df9Saugustss {
1624d606df9Saugustss
1634d606df9Saugustss fprintf(stderr, "usage: %s [-d donglename] [-fhHlmnp] ttyname\n",
1644d606df9Saugustss getprogname());
1654d606df9Saugustss exit(1);
1664d606df9Saugustss }
167