a1ad681998-01-16Fredrik Hübinette (Hubbe) #!/usr/local/bin/pike inherit Stdio.Port;
d6a1a81998-01-25Fredrik Hübinette (Hubbe) void monitor(object(Stdio.File) io, object proc) { proc->wait(); io->close("rw"); io->close(); destruct(io); }
a1ad681998-01-16Fredrik Hübinette (Hubbe) 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..];
242a4c1998-01-19Fredrik Hübinette (Hubbe)  write("Doing "+cmd*" "+"\n");
47a5f41998-01-21Fredrik Hübinette (Hubbe)  switch(lower_case(cmd[0]))
a1ad681998-01-16Fredrik Hübinette (Hubbe)  {
47a5f41998-01-21Fredrik Hübinette (Hubbe)  case "mkdir": { io->write(sprintf("%4c",0)); mkdir(combine_path(combine_path(getcwd(),dir),cmd[1])); io->write(sprintf("%4c",0)); break; } case "copy": { string from=combine_path(combine_path(getcwd(),dir),cmd[1]); string to=combine_path(combine_path(getcwd(),dir),cmd[2]); if(mixed stat=file_stat(to)) if(stat[1]==-2) to=combine_path(to,cmd[1]); io->write(sprintf("%4c",0)); io->write(sprintf("%4c",!Stdio.cp(from,to))); break; }
a1ad681998-01-16Fredrik Hübinette (Hubbe)  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,
d6a1a81998-01-25Fredrik Hübinette (Hubbe)  ])); };
a1ad681998-01-16Fredrik Hübinette (Hubbe)  if(!err) {
d6a1a81998-01-25Fredrik Hübinette (Hubbe)  thread_create(monitor,p2,p);
a1ad681998-01-16Fredrik Hübinette (Hubbe)  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{
d6a1a81998-01-25Fredrik Hübinette (Hubbe)  destruct(p2);
a1ad681998-01-16Fredrik Hübinette (Hubbe)  io->write(sprintf("%4c",0)); io->write(sprintf("%4c",69)); } } io->close("w"); destruct(io); } int main(int argc, string *argv) {
d95dc91998-01-19Fredrik Hübinette (Hubbe)  if(argc<2)
a1ad681998-01-16Fredrik Hübinette (Hubbe)  { 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];
47a5f41998-01-21Fredrik Hübinette (Hubbe)  write("Ready.\n");
a1ad681998-01-16Fredrik Hübinette (Hubbe)  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"); } } }