7ae4deb8cf8340f97c82c945f7a60b858c561b27
[vsys.git] / vsyssh / vsyssh.c
1 /* gcc -Wall -O2 -g chpid.c -o chpid */
2 #define _XOPEN_SOURCE
3 #define _XOPEN_SOURCE_EXTENDED
4 #define _SVID_SOURCE
5 #define _GNU_SOURCE
6 #include <stdio.h>
7 #include <errno.h>
8 #include <string.h>
9 #include <stdlib.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <sys/syscall.h>
13 #include <sys/wait.h>
14 #include <sys/time.h>
15 #include <sys/select.h>
16 #include <sys/resource.h>
17 #include <sys/mount.h>
18 #include <sys/vfs.h>
19 #include <fcntl.h>
20 #include <unistd.h>
21 #include <sched.h>
22 #include <stdarg.h>
23 #include <dirent.h>
24
25 int main(int argc, char **argv, char **envp)
26 {
27         if (argc<2) {
28                 printf("Usage: vsyssh <vsys entry> <cmd>\n");
29                 exit(1);
30         }
31         else {
32                 int vfd0,vfd1;
33                 char *inf,*outf;
34                 inf=(char *)malloc(strlen(argv[1])+3);
35                 outf=(char *)malloc(strlen(argv[2])+4);
36                 strcpy(inf,argv[1]);
37                 strcpy(inf,argv[2]);
38                 strcat(inf,".in");
39                 strcat(outf,".out");
40
41                 vfd1 = open(inf,O_WRONLY);
42                 vfd0 = open(outf,O_RDONLY);
43
44                 if (vfd0==-1 || vfd1 == -1) {
45                         printf("Error opening vsys entry %s\n", argv[1]);
46                         exit(1);
47                 }
48
49                 
50                 if (argc<3) {
51                         fd_set set;
52                         FD_ZERO(&set);
53                         FD_SET(0,&set);
54                         FD_SET(vfd0,&set);
55                         while (1) {
56                                 int ret;
57                                 ret = select(2, &set, NULL, NULL, NULL);
58                                 if (FD_ISSET(0,&set)) {
59                                         char lineread[2048];
60                                         int ret;
61                                         ret=read(0,lineread,2048);
62                                         write(vfd1,lineread,ret);
63                                         FD_CLR(0,&set);
64                                 }
65                                 else if (FD_ISSET(vfd0,&set)) {
66                                         char lineread[2048];
67                                         int ret;
68                                         ret=read(vfd0,lineread,2048);
69                                         write(1,lineread,ret);
70                                         FD_CLR(vfd0,&set);
71                                 }
72                         }
73
74                 }
75                 else {
76                         close(0);
77                         close(1);
78
79                         dup2(vfd0,0);
80                         dup2(vfd1,1);
81                         execve(argv[3],argv+3,envp);
82                 }
83        }
84
85        return;
86
87 }