slcanpty: probe stdin capabilities at startup

/dev/null returns EOF therefore select() finishes immediately.
Now EOF is probed on start.

Other /dev/null as stdin workarounds:
- lscanpty ... < /dev/ptmx (dirty but works)
- cat </dev/null | slcanpty ... (doesn't work for me and even the patch
  is "disabled" then)

Signed-off-by: Janusz Uzycki <j.uzycki@elproma.com.pl>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
pull/1/head
Oliver Hartkopp 2013-06-11 22:21:38 +02:00
parent d469336649
commit c05267faca
1 changed files with 29 additions and 2 deletions

View File

@ -386,6 +386,27 @@ int can2pty(int pty, int socket, int *tstamp)
return 0;
}
int check_select_stdin(void)
{
fd_set rdfs;
struct timeval timeout;
int ret;
FD_ZERO(&rdfs);
FD_SET(0, &rdfs);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
ret = select(1, &rdfs, NULL, NULL, &timeout);
if (ret < 0)
return 0; /* not selectable */
if (ret > 0 && getchar() == EOF)
return 0; /* EOF, eg. /dev/null */
return 1;
}
int main(int argc, char **argv)
{
@ -395,6 +416,7 @@ int main(int argc, char **argv)
struct sockaddr_can addr;
struct termios topts;
struct ifreq ifr;
int select_stdin = 0;
int running = 1;
int tstamp = 0;
int is_open = 0;
@ -416,6 +438,8 @@ int main(int argc, char **argv)
return 1;
}
select_stdin = check_select_stdin();
/* open pty */
p = open(argv[1], O_RDWR);
if (p < 0) {
@ -489,7 +513,10 @@ int main(int argc, char **argv)
while (running) {
FD_ZERO(&rdfs);
if (select_stdin)
FD_SET(0, &rdfs);
FD_SET(p, &rdfs);
FD_SET(s, &rdfs);