a few usability improvements
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 20 Sep 2011 17:37:03 +0000 (19:37 +0200)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 20 Sep 2011 17:37:03 +0000 (19:37 +0200)
(*) warn when getuid is not 0, suggests to use sudo
(*) look for pipe files in /vsys/

vsyssh/Makefile
vsyssh/vsyssh.c

index 9458790..425dca3 100644 (file)
@@ -1,4 +1,4 @@
 all: vsyssh
 
 vsyssh: vsyssh.c
-       gcc -g vsyssh.c -o vsyssh
+       gcc -Wall -g vsyssh.c -o vsyssh
index bfb68d7..fd5d62a 100644 (file)
@@ -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 <sys/resource.h>
 #include <sys/mount.h>
 #include <sys/vfs.h>
+#include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <sched.h>
 #include <dirent.h>
 
 void pipe_handler (int sig) {
-       printf("SIGPIPE");
+  printf("SIGPIPE");
 }
 
-int main(int argc, char **argv, char **envp)
-{
-       if (argc<2) {
-               printf("Usage: vsyssh <vsys entry> [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 <vsys entry> [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;
 
 }