static int spt_copyenv(char *oldenv[]) { extern char **environ; char *eq; int i, error; if (environ != oldenv) return 0; if ((error = spt_clearenv())) goto error; for (i = 0; oldenv[i]; i++) { if (!(eq = strchr(oldenv[i], '='))) continue; *eq = '\0'; error = (0 != setenv(oldenv[i], eq + 1, 1))? errno : 0; *eq = '='; if (error) goto error; } return 0; error: environ = oldenv; return error; } /* spt_copyenv() */
static int spt_copyenv(int envc, char *envp[]) { char **envcopy; char *eq; int envsize; int i, error; if (environ != envp) return 0; /* Make a copy of the old environ array of pointers, in case * clearenv() or setenv() is implemented to free the internal * environ array, because we will need to access the old environ * contents to make the new copy. */ envsize = (envc + 1) * sizeof(char *); envcopy = malloc(envsize); if (envcopy == NULL) return errno; memcpy(envcopy, envp, envsize); error = spt_clearenv(); if (error) { environ = envp; free(envcopy); return error; } for (i = 0; envcopy[i]; i++) { eq = strchr(envcopy[i], '='); if (eq == NULL) continue; *eq = '\0'; if (setenv(envcopy[i], eq + 1, 1) < 0) error = errno; *eq = '='; if (error) { #ifdef HAVE_CLEARENV /* Because the old environ might not be available * anymore we will make do with the shallow copy. */ environ = envcopy; #else environ = envp; free(envcopy); #endif return error; } } /* Dispose of the shallow copy, now that we've finished transfering * the old environment. */ free(envcopy); return 0; }