X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vsyssh%2Fvsyssh.c;h=0239fec948548d780807119f1d4c78b5d7c0234e;hb=212fd80329013ca85fb88470eeb1144816b68244;hp=b0377caa9112f04065cbd20d83f21af227279d57;hpb=d2f02b8408801a06b63b1b922f6af4c6b14fb5ef;p=vsys.git diff --git a/vsyssh/vsyssh.c b/vsyssh/vsyssh.c index b0377ca..0239fec 100644 --- a/vsyssh/vsyssh.c +++ b/vsyssh/vsyssh.c @@ -6,12 +6,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -21,37 +23,78 @@ #include #include +void pipe_handler (int sig) { + printf("SIGPIPE"); +} + int main(int argc, char **argv, char **envp) { - if (argc<3) { - printf("Usage: vsyssh \n"); + if (argc<2) { + printf("Usage: vsyssh [cmd]\n"); exit(1); } else { int vfd0,vfd1; char *inf,*outf; + struct timeval tv; + + signal(SIGPIPE,pipe_handler); inf=(char *)malloc(strlen(argv[1])+3); - outf=(char *)malloc(strlen(argv[2])+4); + outf=(char *)malloc(strlen(argv[1])+4); strcpy(inf,argv[1]); - strcpy(inf,argv[2]); + strcpy(outf,argv[1]); strcat(inf,".in"); strcat(outf,".out"); + vfd0 = open(outf,O_RDONLY|O_NONBLOCK); + printf("Out file: %d\n",vfd0); vfd1 = open(inf,O_WRONLY); - vfd0 = open(outf,O_RDONLY); + printf("In file: %d\n",vfd1); if (vfd0==-1 || vfd1 == -1) { - printf("Error opening vsys entry %s\n", argv[1]); + printf("Error opening vsys entry %s (%s)\n", argv[1],strerror(errno)); exit(1); } - close(0); - close(1); + if (argc<3) { + fd_set set; + FD_ZERO(&set); + FD_SET(0, &set); + FD_SET(vfd0, &set); - dup2(vfd0,0); - dup2(vfd1,1); + while (1) + { + int ret; + printf("vsys>");fflush(stdout); + FD_SET(0, &set); + 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); + lineread[ret]='\0'; + printf ("writing %s\n",lineread); + write(vfd1,lineread,ret); + FD_CLR(0,&set); + } if (FD_ISSET(vfd0,&set)) { + char lineread[2048]; + int ret; + ret=read(vfd0,lineread,2048); + write(1,lineread,ret); + FD_CLR(vfd0,&set); + } + } - execve(argv[3],argv+3,envp); + } + else { + close(0); + close(1); + + dup2(vfd0,0); + dup2(vfd1,1); + execve(argv[3],argv+3,envp); + } } return;