[Issue 1004] Changed environment not passed to child process

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Feb 24 09:11:11 PST 2007


http://d.puremagic.com/issues/show_bug.cgi?id=1004





------- Comment #1 from t_demmer at web.de  2007-02-24 11:11 -------
These two versions work for me, someone with a way better knowledge
of D may optimize the clumsy version of spawnvp

int spawnvpe(int mode, char[] pathname, char[][]argv, char[][] envi){
  char** argv_ = cast(char**)alloca((char*).sizeof * (1 + argv.length));
  char** envi_ = cast(char**)alloca((char*).sizeof * (1 + envi.length));
  toAStringz(argv, argv_);
  toAStringz(envi, envi_);

  return std.c.process.spawnvpe(mode, toStringz(pathname), argv_, envi_ );
}

int 
spawnvp(int mode, char[] pathname, char[][] argv){
  char** argv_ = cast(char**)alloca((char*).sizeof * (1 + argv.length));
  toAStringz(argv, argv_);

  char[][] env;  
  char *eBase=cast(char *)GetEnvironmentStringsA();
  for(char *str=eBase; *str; ++str){
    int slen = std.string.strlen(str);
    env.length = env.length+1;
    env[env.length-1].length = slen;
    size_t i = 0;
    while(*str){
      env[env.length-1][i++]= *str++;
    }
  }
  char** env_ = cast(char**)alloca((char*).sizeof * (1 + env.length));
  toAStringz(env, env_);
  FreeEnvironmentStringsA(cast(char **)eBase);
  return std.c.process.spawnvpe(mode, toStringz(pathname), argv_, env_ );
}


-- 



More information about the Digitalmars-d-bugs mailing list