1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
95
  
96
  
97
  
98
  
#!/usr/local/bin/pike 
 
inherit Stdio.Port; 
 
void handle_incoming_connection(object(Stdio.File) io) 
{ 
  object p; 
  sscanf(io->read(4),"%4c",int args); 
  string *cmd=allocate(args); 
  for(int e=0;e<args;e++) 
  { 
    sscanf(io->read(4),"%4c",int len); 
    cmd[e]=io->read(len); 
  } 
 
  object pi=Stdio.File(); 
  object p2=pi->pipe(); 
  string dir=cmd[0]; 
  cmd=cmd[1..]; 
 
  write("Doing "+cmd*" "+"\n"); 
 
  switch(cmd[0]) 
  { 
    case "getenv": 
    { 
      string s=getenv(cmd[1])+"\n"; 
      io->write(sprintf("%4c%s",strlen(s),s)); 
      io->write(sprintf("%4c",0)); 
      io->write(sprintf("%4c",0)); 
      break; 
    } 
 
    default: 
      mixed err=catch { 
        p=Process.create_process(cmd, 
                                 ([ 
                                   "stdin":io, 
                                   "stdout":p2, 
                                   "stderr":p2, 
                                   "cwd":dir, 
                                   ])); }; 
       
      destruct(p2); 
       
      if(!err) 
      { 
        while(1) 
        { 
          string s=pi->read(1000,1); 
          if(!s || !strlen(s)) break; 
          io->write(sprintf("%4c%s",strlen(s),s)); 
        } 
         
        io->write(sprintf("%4c",0)); 
        io->write(sprintf("%4c",p->wait())); 
      }else{ 
        io->write(sprintf("%4c",0)); 
        io->write(sprintf("%4c",69)); 
      } 
  } 
  io->close("w"); 
  destruct(io); 
} 
 
 
int main(int argc, string *argv) 
{ 
  if(argc<2) 
  { 
    werror("Usage: sprshd <port> <host to accept connections from>\n"); 
    exit(1); 
  } 
  if(!bind((int)argv[1])) 
  { 
    werror("Failed to bind port.\n"); 
    exit(1); 
  } 
 
  string *hosts=gethostbyname(argv[2])[1]; 
 
  while(1) 
  { 
    if(object io=accept()) 
    { 
      sscanf(io->query_address(),"%s ",string ip); 
      if(search(hosts, ip)==-1) 
      { 
        destruct(io); 
        continue; 
      } 
      thread_create(handle_incoming_connection,io); 
    }else{ 
      werror("Accept failed "+errno()+"\n"); 
    } 
  } 
}