1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-30 19:22:12 +00:00

LibC: Add setenv().

If I'm understanding the standard C library correctly, setenv() copies while
putenv() does not. That's really confusing and putenv() basically sucks.
To know which environment variables to free on replacement and which ones to
leave alone, we keep track of the ones malloced by setenv in a side table.

This patch also moves Shell to using setenv() instead of putenv().

Fixes #29.
This commit is contained in:
Andreas Kling 2019-05-30 02:51:15 +02:00
parent d31ce9eccd
commit 96db775ac1
3 changed files with 27 additions and 10 deletions

View file

@ -72,13 +72,7 @@ static int sh_export(int argc, char** argv)
return 1;
}
// FIXME: Yes, this leaks.
// Maybe LibCore should grow a CEnvironment which is secretly a map to char*,
// so it can keep track of the environment pointers as needed?
const auto& s = String::format("%s=%s", parts[0].characters(), parts[1].characters());
char *ev = strndup(s.characters(), s.length());
putenv(ev);
return 0;
return setenv(parts[0].characters(), parts[1].characters(), 1);
}
static int sh_unset(int argc, char** argv)
@ -494,9 +488,7 @@ int main(int argc, char** argv)
if (pw) {
g.username = pw->pw_name;
g.home = pw->pw_dir;
const auto& s = String::format("HOME=%s", pw->pw_dir);
char *ev = strndup(s.characters(), s.length());
putenv(ev);
setenv("HOME", pw->pw_dir, 1);
}
endpwent();
}