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:
parent
939a1da9e6
commit
4632b3c157
23
tools/exec.c
23
tools/exec.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user