summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-12-08 23:39:50 -0500
committerJune McEnroe <june@causal.agency>2020-12-08 23:39:50 -0500
commit3411d53d4993cbc54531687492d530b8422d4fac (patch)
treeeb12dfa5fa845f3970a9871fa748a7cfe01f3abd
parentClean up variable expansions in c.sh (diff)
downloadsrc-3411d53d4993cbc54531687492d530b8422d4fac.tar.gz
src-3411d53d4993cbc54531687492d530b8422d4fac.zip
Add modem -r flag to set baud rate
Also fix it to continue reading output, rather than exiting as soon as
the child exits... Except on macOS this still doesn't seem to work
correctly for some reason.
Diffstat (limited to '')
-rw-r--r--bin/man1/modem.114
-rw-r--r--bin/modem.c29
2 files changed, 28 insertions, 15 deletions
diff --git a/bin/man1/modem.1 b/bin/man1/modem.1
index 522242b3..a4bbc3f1 100644
--- a/bin/man1/modem.1
+++ b/bin/man1/modem.1
@@ -1,4 +1,4 @@
-.Dd July 8, 2019
+.Dd December  8, 2020
 .Dt MODEM 1
 .Os
 .
@@ -8,6 +8,7 @@
 .
 .Sh SYNOPSIS
 .Nm
+.Op Fl r Ar rate
 .Ar command ...
 .
 .Sh DESCRIPTION
@@ -15,8 +16,15 @@
 runs the
 .Ar command
 in a new PTY
-with a fixed baud rate
-of 19.2 kbps.
+with a fixed baud rate.
+.
+.Pp
+The arguments are as follows:
+.Bl -tag -width Ds
+.It Fl r Ar rate
+Set the baud rate.
+The default is 19200.
+.El
 .
 .Sh BUGS
 Window size changes are not propagated
diff --git a/bin/modem.c b/bin/modem.c
index 5ee35822..4392e071 100644
--- a/bin/modem.c
+++ b/bin/modem.c
@@ -34,8 +34,6 @@
 typedef unsigned uint;
 typedef unsigned char byte;
 
-static const uint BaudRate = 19200;
-
 static struct termios saveTerm;
 static void restoreTerm(void) {
 	tcsetattr(STDIN_FILENO, TCSADRAIN, &saveTerm);
@@ -44,7 +42,14 @@ static void restoreTerm(void) {
 int main(int argc, char *argv[]) {
 	int error;
 
-	if (argc < 2) return EX_USAGE;
+	uint baudRate = 19200;
+	for (int opt; 0 < (opt = getopt(argc, argv, "r:"));) {
+		switch (opt) {
+			break; case 'r': baudRate = strtoul(optarg, NULL, 10);
+			break; default:  return EX_USAGE;
+		}
+	}
+	if (argc - optind < 1) return EX_USAGE;
 
 	error = tcgetattr(STDIN_FILENO, &saveTerm);
 	if (error) err(EX_IOERR, "tcgetattr");
@@ -64,8 +69,8 @@ int main(int argc, char *argv[]) {
 	if (pid < 0) err(EX_OSERR, "forkpty");
 
 	if (!pid) {
-		execvp(argv[1], &argv[1]);
-		err(EX_NOINPUT, "%s", argv[1]);
+		execvp(argv[optind], &argv[optind]);
+		err(EX_NOINPUT, "%s", argv[optind]);
 	}
 
 	byte c;
@@ -73,7 +78,7 @@ int main(int argc, char *argv[]) {
 		{ .events = POLLIN, .fd = STDIN_FILENO },
 		{ .events = POLLIN, .fd = pty },
 	};
-	while (usleep(8 * 1000000 / BaudRate), 0 < poll(fds, 2, -1)) {
+	while (usleep(8 * 1000000 / baudRate), 0 < poll(fds, 2, -1)) {
 		if (fds[0].revents) {
 			ssize_t size = read(STDIN_FILENO, &c, 1);
 			if (size < 0) err(EX_IOERR, "read(%d)", STDIN_FILENO);
@@ -84,14 +89,14 @@ int main(int argc, char *argv[]) {
 		if (fds[1].revents) {
 			ssize_t size = read(pty, &c, 1);
 			if (size < 0) err(EX_IOERR, "read(%d)", pty);
+			if (!size) break;
 			size = write(STDOUT_FILENO, &c, 1);
 			if (size < 0) err(EX_IOERR, "write(%d)", STDOUT_FILENO);
 		}
-
-		int status;
-		pid_t dead = waitpid(pid, &status, WNOHANG);
-		if (dead < 0) err(EX_OSERR, "waitpid");
-		if (dead) return WIFEXITED(status) ? WEXITSTATUS(status) : EX_SOFTWARE;
 	}
-	err(EX_IOERR, "poll");
+
+	int status;
+	pid_t dead = waitpid(pid, &status, 0);
+	if (dead < 0) err(EX_OSERR, "waitpid");
+	return WIFEXITED(status) ? WEXITSTATUS(status) : EX_SOFTWARE;
 }
2021-09-10Publish "git-comment"June McEnroe 2021-09-10Add git comment --pretty optionJune McEnroe 2021-09-08Defer printing comment if line is blank or closing braceJune McEnroe 2021-09-08Up default min-repeat to 30 linesJune McEnroe 2021-09-08Handle dirty lines in git-commentJune McEnroe 2021-09-08Document and install git-commentJune McEnroe 2021-09-08Add repeat and all options to git-commentJune McEnroe 2021-09-08Add group threshold to git-commentJune McEnroe