pike.git / lib / modules / Process.pmod

version» Context lines:

pike.git/lib/modules/Process.pmod:1:   #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) )      import Stdio;    - // static private inherit File : file; + program create_process = _static_modules.Builtin()->create_process;      varargs int exec(string file,string ... foo)   {    if (sizeof(file)) {    string path;       if(search(file,"/") >= 0)    return exece(combine_path(getcwd(),file),foo,getenv());       path=getenv("PATH");       foreach(path ? path/":" : ({}) , path)    if(file_stat(path=combine_path(path,file)))    return exece(path, foo,getenv());    }    return 69;   }    - varargs int spawn(string s,object stdin,object stdout,object stderr, + string *split_quoted_string(string s) + { +  s=replace(s, ({"\"","'","\\"," "}), ({"\0\"","\0'","\0\\","\0 "})); +  string *x=s/"\0"; +  string *ret=({x[0]}); +  +  for(int e=1;e<sizeof(x);e++) +  { +  switch(x[e][0]) +  { +  case '"': +  ret[-1]+=x[e][1..]; +  while(x[++e][0]!='"') ret[-1]+=x[e]; +  ret[-1]+=x[e][1..]; +  break; +  +  case '\'': +  ret[-1]+=x[e][1..]; +  while(x[++e][0]!='\'') ret[-1]+=x[e]; +  ret[-1]+=x[e][1..]; +  break; +  +  case '\\': +  if(strlen(x[e])>1) +  { +  ret[-1]+=x[e][1..]; +  }else{ +  ret[-1]+=x[++e]; +  } +  break; +  +  case ' ': +  if(strlen(x[e]) > 1 || sizeof(x)==e+1 || x[e+1][0]!=' ') +  ret+=({x[e][1..]}); +  break; +  +  default: +  ret[-1]+="\0"+x[e]; +  break; +  } +  } +  return ret; + } +  + varargs object spawn(string s,object stdin,object stdout,object stderr,    function|void cleanup, mixed ... args)   { -  int pid; + #if 1 +  mapping data=([]); +  if(stdin) data->stdin=stdin; +  if(stdout) data->stdout=stdout; +  if(stderr) data->stderr=stderr; +  return create_process(split_quoted_string(s),data); + #else    -  +  object pid; +    #if constant(fork)    pid=fork(); - #else -  pid=-1; +    #endif    -  if(pid==-1) -  error("No more processes.\n"); -  +     if(pid)    {    return pid;    }else{    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);       if (cleanup) {    cleanup(@args);    }       exec("/bin/sh","-c",s);    exit(69);    } -  + #endif   }      string popen(string s)   {    object p;    string t;    object f = File();       if (!f) error("Popen failed. (couldn't create pipe)\n");   
pike.git/lib/modules/Process.pmod:78:    f->close();    destruct(f);    error("Popen failed with error "+e+".\n");    } else {    f->close();    destruct(f);    }    return t;   }    - #if constant(fork) - void system(string s) + int system(string s)   { -  object p; -  int pid; -  string t; -  object f; -  -  f = File(); -  if (!f) error("System failed.\n"); -  -  p=f->pipe(); -  if(!p) error("System() failed.\n"); -  p->set_close_on_exec(0); -  if(pid=fork()) -  { -  p->close(); -  destruct(p); -  /* Nothing will ever be written here, we are just waiting for it -  * to close -  */ -  f->read(1); -  }else{ -  f->close(); -  destruct(f); -  exec("/bin/sh","-c",s); -  exit(69); +  return spawn(s)->wait();   } - } +     -  + #if constant(fork)   constant fork = predef::fork;   #endif      #if constant(exece)   constant exece = predef::exece;   #endif      #if constant(fork)   class Spawn   {    object stdin;    object stdout;    object stderr;    array(object) fd;    -  int pid; +  object pid;    -  private int low_spawn(array(void|object(Stdio.File)) fdp, +  private object low_spawn(array(void|object(Stdio.File)) fdp,    array(void|object(Stdio.File)) fd_to_close,    string cmd, void|string *args,    void|mapping(string:string) env,    string|void cwd)    {    object(Stdio.File) pie,pied; /* interprocess communication */ -  int pid; +  object pid;       pie=Stdio.File();    pied=pie->pipe();       if(!(pid=fork()))    {    mixed err=catch    {    if(cwd && !cd(cwd))    {
pike.git/lib/modules/Process.pmod:212: Inside #if constant(fork)
   else    {    fd=ownpipes;    if (sizeof(fd)>0) stdin=fd[0]; else stdin=0;    if (sizeof(fd)>1) stdout=fd[1]; else stdout=0;    if (sizeof(fd)>2) stderr=fd[2]; else stderr=0;    }    pid=low_spawn(fd,fds_to_close||({}),cmd,args,env,cwd);    }    + #if constant(kill)    int kill(int signal)    {    return predef::kill(pid,signal);    } -  + #endif    -  void wait() +  int wait()    { -  while (kill(0)) sleep(0.01); +  return pid->wait();    }       // void set_done_callback(function foo,mixed ... args);    // int result();    // array rusage();   }   #endif