[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