From 352b41c12eec3297ca1cd40841002800737be5d6 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Tue, 20 Sep 2011 19:37:03 +0200 Subject: [PATCH] a few usability improvements (*) warn when getuid is not 0, suggests to use sudo (*) look for pipe files in /vsys/ --- vsyssh/Makefile | 2 +- vsyssh/vsyssh.c | 156 ++++++++++++++++++++++++++---------------------- 2 files changed, 86 insertions(+), 72 deletions(-) diff --git a/vsyssh/Makefile b/vsyssh/Makefile index 9458790..425dca3 100644 --- a/vsyssh/Makefile +++ b/vsyssh/Makefile @@ -1,4 +1,4 @@ all: vsyssh vsyssh: vsyssh.c - gcc -g vsyssh.c -o vsyssh + gcc -Wall -g vsyssh.c -o vsyssh diff --git a/vsyssh/vsyssh.c b/vsyssh/vsyssh.c index bfb68d7..fd5d62a 100644 --- a/vsyssh/vsyssh.c +++ b/vsyssh/vsyssh.c @@ -1,4 +1,4 @@ -/* gcc -Wall -O2 -g chpid.c -o chpid */ +/* gcc -Wall -O2 -g vsyssh.c -o vsyssh */ #define _XOPEN_SOURCE #define _XOPEN_SOURCE_EXTENDED #define _SVID_SOURCE @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -24,86 +25,99 @@ #include void pipe_handler (int sig) { - printf("SIGPIPE"); + printf("SIGPIPE"); } -int main(int argc, char **argv, char **envp) -{ - if (argc<2) { - printf("Usage: vsyssh [cmd]\n"); - exit(1); - } - else { - int vfd0,vfd1; - char *inf,*outf; - struct timeval tv; +#define FILELEN 256 + +int main(int argc, char **argv, char **envp) { - signal(SIGPIPE,pipe_handler); - inf=(char *)malloc(strlen(argv[1])+3); - outf=(char *)malloc(strlen(argv[1])+4); - strcpy(inf,argv[1]); - strcpy(outf,argv[1]); - strcat(inf,".in"); - strcat(outf,".out"); + if ( (argc<2) || (strcmp(argv[1],"--help")==0) ) { + printf("Usage: vsyssh [cmd]\n"); + exit(1); + } - vfd0 = open(outf,O_RDONLY|O_NONBLOCK); - vfd1 = open(inf,O_WRONLY); + { + uid_t uid=getuid(); + if (uid!=0) { + printf ("%s requires root privileges, please run under sudo\n",argv[0]); + exit(1); + } + } - if (vfd0==-1 || vfd1 == -1) { - printf("Error opening vsys entry %s (%s)\n", argv[1],strerror(errno)); - exit(1); - } + { + int vfd0,vfd1; + char inf[FILELEN], outf[FILELEN]; + int fatal=0; - if (fcntl(vfd0, F_SETFL, O_RDONLY) == -1) { - printf("Error making pipe blocking: %m\n"); - exit(1); - } + signal(SIGPIPE,pipe_handler); + + sprintf(inf,"/vsys/%s.in",argv[1]); + sprintf(outf,"/vsys/%s.out",argv[1]); + vfd0 = open(outf,O_RDONLY|O_NONBLOCK); + if (vfd0<0) { + printf("Error opening vsys channel %s (%m)\n",outf); + fatal=1; + } + vfd1 = open(inf,O_WRONLY); + if (vfd1<0) { + printf("Error opening vsys channel %s (%m)\n",inf); + fatal=1; + } - if (argc<3) { - fd_set set; - char do_input = 1, do_output = 1; + if (fcntl(vfd0, F_SETFL, O_RDONLY) == -1) { + printf("Error making pipe blocking: %m\n"); + fatal=1; + } - while (1) - { - int ret; - printf("vsys>");fflush(stdout); - 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); - } - if (FD_ISSET(vfd0,&set)) { - char lineread[2048]; - int ret; - ret = read(vfd0,lineread,2048); - if (ret == 0) - break; - write(1,lineread,ret); - } - } + if (fatal) { exit(1);} + + if (argc<3) { + /* interactive mode */ + fd_set set; + char do_input = 1, do_output = 1; + + while (1) { + int ret; + printf("vsys>");fflush(stdout); + 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); + /*printf ("read=%d\n",ret);*/ + if (ret == 0) + do_input = 0; + lineread[ret]='\0'; + printf ("writing %s\n",lineread); + write(vfd1,lineread,ret); + } + if (FD_ISSET(vfd0,&set)) { + char lineread[2048]; + int ret; + ret = read(vfd0,lineread,2048); + if (ret == 0) + break; + write(1,lineread,ret); + } + } - } - else { - close(0); - close(1); + } else { + /* line mode */ + close(0); + close(1); - dup2(vfd0,0); - dup2(vfd1,1); - execve(argv[2],argv+2,envp); - } - } + dup2(vfd0,0); + dup2(vfd1,1); + execve(argv[2],argv+2,envp); + } + } - return -1; + return -1; } -- 2.43.0