- if (env.envp != environ)
- sync_env();
-
- varlen = strlen(var);
- for (nep = env.envp; *nep; nep++) {
- if (strncmp(var, *nep, varlen) == 0 && (*nep)[varlen] == '=') {
- /* Found it; move everything over by one and update len. */
- memmove(nep, nep + 1,
- (env.env_len - (nep - env.envp)) * sizeof(char *));
+ /* XXX - this could be optimized to include the search */
+ if (env.envp != environ) {
+ for (ep = environ; *ep != NULL; ep++)
+ continue;
+ len = ep - environ;
+ if (len + 1 > env.env_size) {
+ efree(env.envp);
+ env.env_size = len + 1 + 128;
+ env.envp = emalloc2(env.env_size, sizeof(char *));
+#ifdef ENV_DEBUG
+ memset(env.envp, 0, env.env_size * sizeof(char *));
+#endif
+ }
+ memcpy(env.envp, environ, len * sizeof(char *));
+ env.envp[len] = NULL;
+ env.env_len = len;
+ environ = env.envp;
+#ifdef ENV_DEBUG
+ } else {
+ if (env.envp[env.env_len] != NULL)
+ errorx(1, "unsetenv: corrupted envp, len mismatch");
+#endif
+ }
+
+ len = strlen(var);
+ for (ep = env.envp; *ep; ep++) {
+ if (strncmp(var, *ep, len) == 0 && (*ep)[len] == '=') {
+ /* Found it; shift remainder + NULL over by one and update len. */
+ memmove(ep, ep + 1,
+ (env.env_len - (ep - env.envp)) * sizeof(char *));