c2a4061997-02-06Fredrik Hübinette (Hubbe) #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) )
d5190b1997-02-10Fredrik Hübinette (Hubbe) import Stdio;
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
dc50841997-11-05Henrik Grubbström (Grubba) // static private inherit File : file;
c2a4061997-02-06Fredrik Hübinette (Hubbe)  varargs int exec(string file,string ... foo) {
bcfe4f1997-06-09John W. Pierce  if (sizeof(file)) { string path;
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
bcfe4f1997-06-09John W. Pierce  if(search(file,"/") >= 0) return exece(combine_path(getcwd(),file),foo,getenv());
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
b6277d1997-06-10Fredrik Hübinette (Hubbe)  path=getenv("PATH");
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
b6277d1997-06-10Fredrik Hübinette (Hubbe)  foreach(path ? path/":" : ({}) , path)
bcfe4f1997-06-09John W. Pierce  if(file_stat(path=combine_path(path,file))) return exece(path, foo,getenv()); }
c2a4061997-02-06Fredrik Hübinette (Hubbe)  return 69; }
dc50841997-11-05Henrik Grubbström (Grubba) varargs int spawn(string s,object stdin,object stdout,object stderr, function|void cleanup, mixed ... args)
c2a4061997-02-06Fredrik Hübinette (Hubbe) { int pid; pid=fork(); if(pid==-1) error("No more processes.\n"); if(pid) { return pid; }else{
f95b701997-05-21Fredrik Hübinette (Hubbe)  if(stdin ) stdin ->dup2(File("stdin")); if(stdout) stdout->dup2(File("stdout")); if(stderr) stderr->dup2(File("stderr")); if(stdin ) destruct(stdin); if(stdout) destruct(stdout); if(stderr) destruct(stderr);
dc50841997-11-05Henrik Grubbström (Grubba)  if (cleanup) { cleanup(@args); }
c2a4061997-02-06Fredrik Hübinette (Hubbe)  exec("/bin/sh","-c",s); exit(69); } } string popen(string s) { object p; string t;
dc50841997-11-05Henrik Grubbström (Grubba)  object f = File(); if (!f) error("Popen failed. (couldn't create pipe)\n");
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
dc50841997-11-05Henrik Grubbström (Grubba)  p=f->pipe();
c2a4061997-02-06Fredrik Hübinette (Hubbe)  if(!p) error("Popen failed. (couldn't create pipe)\n");
dc50841997-11-05Henrik Grubbström (Grubba)  spawn(s,0,p,0, destruct, f);
ef293f1997-05-07Henrik Grubbström (Grubba)  p->close();
c2a4061997-02-06Fredrik Hübinette (Hubbe)  destruct(p);
dc50841997-11-05Henrik Grubbström (Grubba)  t=f->read(0x7fffffff);
c2a4061997-02-06Fredrik Hübinette (Hubbe)  if(!t) { int e;
dc50841997-11-05Henrik Grubbström (Grubba)  e=f->errno(); f->close(); destruct(f);
c2a4061997-02-06Fredrik Hübinette (Hubbe)  error("Popen failed with error "+e+".\n");
dc50841997-11-05Henrik Grubbström (Grubba)  } else { f->close(); destruct(f);
c2a4061997-02-06Fredrik Hübinette (Hubbe)  } return t; } void system(string s) { object p; int pid; string t;
dc50841997-11-05Henrik Grubbström (Grubba)  object f; f = File(); if (!f) error("System failed.\n");
c2a4061997-02-06Fredrik Hübinette (Hubbe) 
dc50841997-11-05Henrik Grubbström (Grubba)  p=f->pipe();
c2a4061997-02-06Fredrik Hübinette (Hubbe)  if(!p) error("System() failed.\n"); p->set_close_on_exec(0); if(pid=fork()) {
dc50841997-11-05Henrik Grubbström (Grubba)  p->close();
c2a4061997-02-06Fredrik Hübinette (Hubbe)  destruct(p); /* Nothing will ever be written here, we are just waiting for it * to close */
dc50841997-11-05Henrik Grubbström (Grubba)  f->read(1);
c2a4061997-02-06Fredrik Hübinette (Hubbe)  }else{
dc50841997-11-05Henrik Grubbström (Grubba)  f->close(); destruct(f);
c2a4061997-02-06Fredrik Hübinette (Hubbe)  exec("/bin/sh","-c",s); exit(69); } }
cb119a1997-04-07Fredrik Hübinette (Hubbe)  constant fork = predef::fork; constant exece = predef::exece;