I've been running the below patch for about a year, which makes rfcomm_sppd (bluetooth-related) optionally use openpty(3) when the argument to -t is "auto".
I'm neither sure this is the right way to do it, nor that support for manually specifying a tty is still needed at all. Anyway I figured I toss it here for people to look at. If it is considered okay, I'd also update the man page to reflect the change. It might be somewhat hackish. Any comments? CC plunky since they seem to have done most of the work on rfcomm_sppd. diff --git a/usr.bin/rfcomm_sppd/Makefile b/usr.bin/rfcomm_sppd/Makefile index 92aeded..8ca43ea 100644 --- a/usr.bin/rfcomm_sppd/Makefile +++ b/usr.bin/rfcomm_sppd/Makefile @@ -6,6 +6,6 @@ PROG= rfcomm_sppd SRCS= rfcomm_sppd.c DPADD+= ${LIBBLUETOOTH} -LDADD+= -lbluetooth +LDADD+= -lbluetooth -lutil .include <bsd.prog.mk> diff --git a/usr.bin/rfcomm_sppd/rfcomm_sppd.c b/usr.bin/rfcomm_sppd/rfcomm_sppd.c index 561b806..49b207c 100644 --- a/usr.bin/rfcomm_sppd/rfcomm_sppd.c +++ b/usr.bin/rfcomm_sppd/rfcomm_sppd.c @@ -84,10 +84,11 @@ __RCSID("$NetBSD: rfcomm_sppd.c,v 1.16 2013/12/09 09:35:17 wiz Exp $"); #include <syslog.h> #include <termios.h> #include <unistd.h> +#include <util.h> #include <netbt/rfcomm.h> -static int open_tty(const char *); +static int open_tty(const char *, char *, size_t); static int open_client(bdaddr_t *, bdaddr_t *, int, uintmax_t, const char *); static int open_server(bdaddr_t *, uint16_t, uint8_t, int, const char *); static void copy_data(int, int); @@ -121,7 +122,7 @@ main(int argc, char *argv[]) bdaddr_t laddr, raddr; struct pollfd pfd[2]; const char *service; - char *ep, *tty; + char *ep, *tty, pts[PATH_MAX]; int n, lm, rfcomm, tty_in, tty_out; uint16_t psm; uint8_t channel; @@ -190,7 +191,7 @@ main(int argc, char *argv[]) break; case 't': /* Slave TTY name */ - if (optarg[0] != '/') + if (optarg[0] != '/' && strcmp(optarg, "auto") != 0) asprintf(&tty, "%s%s", _PATH_DEV, optarg); else tty = optarg; @@ -218,8 +219,13 @@ main(int argc, char *argv[]) tty_in = STDIN_FILENO; tty_out = STDOUT_FILENO; } else { - tty_in = open_tty(tty); + tty_in = open_tty(tty, pts, sizeof(pts)); tty_out = tty_in; + if (strcmp(tty, "auto") == 0) { + tty = pts; + puts(pts); + fflush(stdout); + } } /* open RFCOMM */ @@ -286,12 +292,25 @@ main(int argc, char *argv[]) } static int -open_tty(const char *tty) +open_tty(const char *tty, char *pts, size_t pts_sz) { char pty[PATH_MAX], *slash; struct group *gr = NULL; gid_t ttygid; - int master; + int master, slave; + + /* + * Automatic pty via openpty(3), if requested + */ + if (strcmp(tty, "auto") == 0) { + if (openpty(&master, &slave, pty, NULL, NULL) == -1) + err(EXIT_FAILURE, "openpty"); + + if (pts && pts_sz && strlcpy(pts, pty, pts_sz) >= pts_sz) + errx(EXIT_FAILURE, "Pts name too long `%s'", pty); + + return master; + } /* * Construct master PTY name. The slave tty name must be less than