tools/exec: exec specified file instead of hardcoding on stdin

Under OpenBSD, stdin is already used by the device itself because of
the whole "stty has no memory" situation.
This commit is contained in:
Virgil Dupras 2020-08-02 16:11:19 -04:00
parent 939a1da9e6
commit 4632b3c157

View File

@ -2,33 +2,46 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <string.h>
#include "common.h" #include "common.h"
/* Execute code from stdin on the target machine. /* Execute code from target file on the target machine.
fname can be "-" for stdin.
*/ */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
if (argc != 2) { if (argc != 3) {
fprintf(stderr, "Usage: ./exec device\n"); fprintf(stderr, "Usage: ./exec device fname\n");
return 1; return 1;
} }
FILE *fp = stdin;
if (strcmp(argv[2], "-") != 0) {
fp = fopen(argv[2], "r");
}
int fd = ttyopen(argv[1]); int fd = ttyopen(argv[1]);
if (fd < 0) { if (fd < 0) {
fprintf(stderr, "Could not open %s\n", argv[1]); fprintf(stderr, "Could not open %s\n", argv[1]);
return 1; return 1;
} }
set_blocking(fd, 0); set_blocking(fd, 0);
int c = getchar(); int c = getc(fp);
while (c != EOF) { while (c != EOF) {
if (c == '\n') c = '\r'; if (c == '\n') c = '\r';
write(fd, &c, 1); write(fd, &c, 1);
usleep(1000); // let it breathe
while (read(fd, &c, 1) == 1) { while (read(fd, &c, 1) == 1) {
putchar(c); putchar(c);
fflush(stdout); fflush(stdout);
} }
c = getchar(); c = getc(fp);
}
if (fd > 0) {
close(fd);
}
if (strcmp(argv[2], "-") != 0) {
fclose(fp);
} }
printf("Done!\n"); printf("Done!\n");
return 0; return 0;