I'm trying to implement built-in function like setenv, getenv and unsetenv. All work well with getenv but i really don't how to free memory that i allocated with _setenv.
Here is my code for _setenv :
char *_setenv(const char *name, const char *value, int overwrite)
{
long int i = -1;
char *var = NULL;
int var_len = 0, name_len = 0;
char **new_env = NULL;
if (name == NULL || value == NULL)
return (NULL);
var = _getenv(name);
if (var != NULL && overwrite == 0)
return (var);
var_len = strlen(value);
name_len = strlen(name);
var = (char *)malloc(sizeof(char) * (name_len + var_len + 2));
memcpy(var, name, name_len);
strcat(var, "=");
strncat(var, value, var_len);
if (var != NULL && overwrite != 0)
environ[i] = var;
else
{
long int env_len = get_env_length(environ);
new_env = (char **)malloc(sizeof(*new_env) * (env_len + 2));
for (i = 0; i < env_len; i++)
{
int var_len = strlen(environ[i]);
new_env[i] = (char *)malloc(sizeof(*new_env[i]) * var_len + 1);
memcpy(new_env[i], environ[i], var_len);
new_env[i][var_len + 1] = '\0';
}
new_env[env_len + 1] = var;
new_env[env_len + 2] = NULL;
}
return (var);
}
I made this _free_env to free the allocated memory but it keep returning an error about invalid pointer:
int _free_env(void)
{
int res = 0, i = 0;
for (i = 0; environ[i]; i++)
free(environ[i]);
free(environ);
return (res);
}
I guess it's about environ variables that i have not allocated myself, but since i need to free memory i allocate in the case i overwrite or add a variable, it is very difficult. Can you help me please ?
PS: _getenv
is a my custom version of the built-in getenv and get_env_length
is a function that get the number of variables in environ