int pam_setenv(pam_handle_t *pamh, const char *name, const char *value, int overwrite) { char *env; int r; ENTER(); if (pamh == NULL) RETURNC(PAM_SYSTEM_ERR); /* sanity checks */ if (name == NULL || value == NULL || strchr(name, '=') != NULL) RETURNC(PAM_SYSTEM_ERR); /* is it already there? */ if (!overwrite && openpam_findenv(pamh, name, strlen(name)) >= 0) RETURNC(PAM_SUCCESS); /* set it... */ if (asprintf(&env, "%s=%s", name, value) < 0) RETURNC(PAM_BUF_ERR); r = pam_putenv(pamh, env); FREE(env); RETURNC(r); }
int pam_putenv(pam_handle_t *pamh, const char *namevalue) { char **env, *p; int i; ENTER(); if (pamh == NULL) RETURNC(PAM_SYSTEM_ERR); /* sanity checks */ if (namevalue == NULL || (p = strchr(namevalue, '=')) == NULL) RETURNC(PAM_SYSTEM_ERR); /* see if the variable is already in the environment */ if ((i = openpam_findenv(pamh, namevalue, (size_t)(p - namevalue))) >= 0) { if ((p = strdup(namevalue)) == NULL) RETURNC(PAM_BUF_ERR); FREE(pamh->env[i]); pamh->env[i] = p; RETURNC(PAM_SUCCESS); } /* grow the environment list if necessary */ if (pamh->env_count == pamh->env_size) { env = realloc(pamh->env, sizeof(*env) * ((size_t)pamh->env_size * 2 + 1)); if (env == NULL) RETURNC(PAM_BUF_ERR); pamh->env = env; pamh->env_size = pamh->env_size * 2 + 1; } /* add the variable at the end */ if ((pamh->env[pamh->env_count] = strdup(namevalue)) == NULL) RETURNC(PAM_BUF_ERR); ++pamh->env_count; RETURNC(PAM_SUCCESS); /*NOTREACHED*/ }
const char * pam_getenv(pam_handle_t *pamh, const char *name) { char *str; int i; ENTERS(name); if (pamh == NULL) RETURNS(NULL); if (name == NULL || strchr(name, '=') != NULL) RETURNS(NULL); if ((i = openpam_findenv(pamh, name, strlen(name))) < 0) RETURNS(NULL); for (str = pamh->env[i]; *str != '\0'; ++str) { if (*str == '=') { ++str; break; } } RETURNS(str); }