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
  
99
  
100
  
101
  
102
  
103
  
104
  
#if !constant(strerror) 
#define strerror(X) X 
#endif 
 
string fixpath(string s) 
{ 
  string mnt=getenv("NTMOUNT"); 
  if(mnt && strlen(mnt)) s=replace(s,mnt,""); 
  return replace(s,"/","\\"); 
} 
 
 
string fixabspath(string s) 
{ 
  return replace(s,"/","\\"); 
} 
 
string handle_input(object o) 
{ 
  if(o->proxy) 
    o->proxy(Stdio.File("stdin")); 
  else 
    thread_create(lambda(object o) 
                 { 
                   object stdin=Stdio.File("stdin"); 
                   while(string s=stdin->read(1000,1)) 
                     o->write(s); 
                 },o); 
} 
 
 
object low_do_cmd(string *cmd) 
{ 
  object(Stdio.File) f=Stdio.File(); 
  if(!f->connect(getenv("NTHOST"),(int)getenv("NTPORT"))) 
  { 
    werror("Failed to connect "+strerror(errno())+".\n"); 
    exit(1); 
  } 
 
  string tmp=getcwd(); 
  string mnt=getenv("NTMOUNT"); 
  if(mnt && strlen(mnt)) tmp=replace(tmp,mnt,""); 
  cmd=({getenv("NTDRIVE")+replace(tmp,"/","\\")})+cmd; 
  f->write(sprintf("%4c",sizeof(cmd))); 
  for(int e=0;e<sizeof(cmd);e++) 
    f->write(sprintf("%4c%s",strlen(cmd[e]),cmd[e])); 
  return f; 
} 
 
int silent_do_cmd(string *cmd, mixed|void filter) 
{ 
  object(Stdio.File) f=low_do_cmd(cmd); 
 
  handle_input(f); 
  string ret=""; 
  while(1) 
  { 
    string s; 
    sscanf(f->read(4),"%4c",int len); 
    if(!len) break; 
    write(s=f->read(len)); 
    ret+=s; 
  } 
  if(filter) filter(ret); 
  sscanf(f->read(4),"%4c",int code); 
  f->close("r"); 
  f->close("w"); 
  destruct(f); 
  return code; 
} 
 
string getntenv(string var) 
{ 
  string s=""; 
  object(Stdio.File) f=low_do_cmd( ({"getenv",var}) ); 
   
  while(1) 
  { 
    sscanf(f->read(4),"%4c", int len); 
    if(!len) break; 
    s+=f->read(len); 
  } 
 
  sscanf(f->read(4),"%4c",int code); 
  f->close("r"); 
  f->close("w"); 
  destruct(f); 
  return s; 
} 
 
 
int do_cmd(string *cmd, mixed|void filter) 
{ 
  werror("DOING "+cmd*" "+"\n"); 
  return silent_do_cmd(cmd,filter); 
} 
 
string find_lib_location() 
{ 
  return __FILE__; 
}