void loop_remove_env(char **av, t_env *env) { int i; int j; char **env_var; i = 0; j = 0; while (av[i]) { while (env->environ[j]) { env_var = ft_strsplit(env->environ[j], '='); if (!ft_strcmp(env_var[0], av[i])) { remove_env(env->environ, j); j--; } j++; free_double_array(env_var); } j = 0; i++; } }
static int vsetenv(struct verbs_environment *env, const char *name, const char *value, int overwrite) { struct verbs_env_item *cur; struct verbs_env_item *prev; int err = 0; int found = 0; pthread_mutex_lock(&env->mtx); for (prev = NULL, cur = env->head; cur; prev = cur, cur = cur->next) { if (!strcmp(cur->name, name)) { found = 1; if (!strcmp(cur->value, value)) break; if (overwrite) { free(cur->value); cur->value = strdup(value); if (!cur->value) { remove_env(env, cur, prev); err = -1; } } else { errno = EEXIST; err = -1; } break; } } if (!found) { cur = calloc(1, sizeof(*cur)); if (!cur) goto out; cur->name = strdup(name); if (!cur->name) goto out; cur->value = strdup(value); if (!cur->value) goto out; cur->next = env->head; env->head = cur; } pthread_mutex_unlock(&env->mtx); return err; out: if (cur) { free(cur->name); free(cur); } pthread_mutex_unlock(&env->mtx); return -1; }
Env * remove_env(Env * xs, String_ * s) { if (xs -> Nil) { free_string(s); return xs; } else { if (compare_string(xs -> key, s)) { // found Env * rest = xs -> Cons; free_string(xs -> key); free_string(xs -> val); free(xs); free_string(s); return rest; } else { xs -> Cons = remove_env(xs -> Cons, s); return xs; } } }
static int check_flags(char **av, int *flag) { int i; i = 1; if (av[i] && ft_strcmp(av[i], "-n")) return (i); while (av[i]) { if (av[i] && !ft_strcmp(av[i], "-n")) { remove_env(av, i); *flag = 1; } if (av[i] && ft_strcmp(av[i], "-n") && (!ft_strcmp(av[i], "--") || av[i][0] != ' ')) return (i); i++; } return (i); }