Example #1
0
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);
}
Example #2
0
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*/
}
Example #3
0
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);
}