前田です。

WATANABE Hirofumi <watanabe / ase.ptg.sony.co.jp> writes:

> :それって仮定しても良いと思います? 現状ならリークする代わり
> :に安全側に倒してるんで,システムのsetenv/putenvと混在しても
> :動作すると思うんですけど.
> 
> ruby_setenv を使えば Win32 とか移植性を考えなくてすむわけだ
> し, むしろ setenv/putenv を使うなと強制してもいいと思います.

ボクも賛成です。
Ruby-JedとかではS-Lang側でsetenvされるとまずそうですけど、そういう特
殊なケースではENV.deleteを再定義してやればよいので。

> まだ clearenv に関しては解決してないかもしれないけど.

実は以前は、

static void clearenv()
{
    char **env;
    int len = 0;

    env = environ;
    while (*env++) len++;
    env = (char **) alloca(sizeof(char *) * (len + 1));
    memcpy(env, environ, sizeof(char *) * (len + 1));
    while (*env) {
        char *s = strchr(*env, '=');
        if (s) {
            char *buff = (char *) malloc(sizeof(char) * ((s - *env) + 1));
            strncpy(buff, *env, s - *env);
            buff[s - *env] = '\0';
            unsetenv(buff);
            free(buff);
        }
        env++;
    }
}

などとかなり苦しいことをやっていました。
もうちょっと何とかならないかなと思って質問したわけですが、方法が他に
なければ、Windowsではこのコードを使うことにします。

-- 
前田 修吾