From 08f81807b0c4b0f53c33818e0727e97ccfc943af Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Thu, 20 Jan 2011 09:50:00 -0500 Subject: [PATCH] Make output pipe blocking once the input has been opened. Prevent infinite loops. Use correct argument for mode. --- vsyssh/vsyssh.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/vsyssh/vsyssh.c b/vsyssh/vsyssh.c index 0239fec..bfb68d7 100644 --- a/vsyssh/vsyssh.c +++ b/vsyssh/vsyssh.c @@ -47,42 +47,49 @@ int main(int argc, char **argv, char **envp) strcat(outf,".out"); vfd0 = open(outf,O_RDONLY|O_NONBLOCK); - printf("Out file: %d\n",vfd0); vfd1 = open(inf,O_WRONLY); - printf("In file: %d\n",vfd1); if (vfd0==-1 || vfd1 == -1) { printf("Error opening vsys entry %s (%s)\n", argv[1],strerror(errno)); exit(1); } + if (fcntl(vfd0, F_SETFL, O_RDONLY) == -1) { + printf("Error making pipe blocking: %m\n"); + exit(1); + } + if (argc<3) { fd_set set; - FD_ZERO(&set); - FD_SET(0, &set); - FD_SET(vfd0, &set); + char do_input = 1, do_output = 1; while (1) - { + { int ret; printf("vsys>");fflush(stdout); - FD_SET(0, &set); - FD_SET(vfd0, &set); + FD_ZERO(&set); + if (do_input) + FD_SET(0, &set); + if (do_output) + FD_SET(vfd0, &set); ret = select(vfd0+1, &set, NULL, NULL, NULL); if (FD_ISSET(0,&set)) { char lineread[2048]; int ret; ret=read(0,lineread,2048); + if (ret == 0) + do_input = 0; lineread[ret]='\0'; printf ("writing %s\n",lineread); write(vfd1,lineread,ret); - FD_CLR(0,&set); - } if (FD_ISSET(vfd0,&set)) { + } + if (FD_ISSET(vfd0,&set)) { char lineread[2048]; int ret; - ret=read(vfd0,lineread,2048); + ret = read(vfd0,lineread,2048); + if (ret == 0) + break; write(1,lineread,ret); - FD_CLR(vfd0,&set); } } @@ -93,10 +100,10 @@ int main(int argc, char **argv, char **envp) dup2(vfd0,0); dup2(vfd1,1); - execve(argv[3],argv+3,envp); + execve(argv[2],argv+2,envp); } } - return; + return -1; } -- 2.43.0