diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2012-03-01 09:26:11 +1100 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2012-03-01 09:26:11 +1100 |
commit | 3831728ca1d81e2b058a1ae9da86b1f592acc9c4 (patch) | |
tree | 7f1e8c77c58eeb5c58632b4b0d8cac017dd90d95 /tests/src | |
parent | cf181582bced69d8ce0ebf4b8e983486da7e8bb8 (diff) | |
download | lightdm-3831728ca1d81e2b058a1ae9da86b1f592acc9c4.tar.gz |
Improve simulation of PAM environment
Diffstat (limited to 'tests/src')
-rw-r--r-- | tests/src/libsystem.c | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/tests/src/libsystem.c b/tests/src/libsystem.c index bb203b55..d964e82f 100644 --- a/tests/src/libsystem.c +++ b/tests/src/libsystem.c @@ -23,6 +23,7 @@ struct pam_handle char *service_name; char *user; char *tty; + char **envlist; struct pam_conv conversation; }; @@ -260,6 +261,8 @@ pam_start (const char *service_name, const char *user, const struct pam_conv *co handle->tty = NULL; handle->conversation.conv = conversation->conv; handle->conversation.appdata_ptr = conversation->appdata_ptr; + handle->envlist = malloc (sizeof (char *) * 1); + handle->envlist[0] = NULL; return PAM_SUCCESS; } @@ -367,14 +370,62 @@ pam_authenticate (pam_handle_t *pamh, int flags) return PAM_AUTH_ERR; } +static const char * +get_env_value (const char *name_value, const char *name) +{ + int j; + + for (j = 0; name[j] && name[j] != '=' && name[j] == name_value[j]; j++); + if (name_value[j] == '=') + return &name_value[j + 1]; + + return NULL; +} + +int +pam_putenv (pam_handle_t *pamh, const char *name_value) +{ + int i; + + if (pamh == NULL || name_value == NULL) + return PAM_SYSTEM_ERR; + + for (i = 0; pamh->envlist[i]; i++) + { + if (get_env_value (pamh->envlist[i], name_value)) + break; + } + + if (pamh->envlist[i]) + { + free (pamh->envlist[i]); + pamh->envlist[i] = strdup (name_value); + } + else + { + pamh->envlist = realloc (pamh->envlist, sizeof (char *) * (i + 2)); + pamh->envlist[i] = strdup (name_value); + pamh->envlist[i + 1] = NULL; + } + + return PAM_SUCCESS; +} + const char * pam_getenv (pam_handle_t *pamh, const char *name) { + int i; + if (pamh == NULL || name == NULL) return NULL; - if (strcmp (name, "PATH") == 0) - return getenv ("PATH"); + for (i = 0; pamh->envlist[i]; i++) + { + const char *value; + value = get_env_value (pamh->envlist[i], name); + if (value) + return value; + } return NULL; } @@ -382,16 +433,10 @@ pam_getenv (pam_handle_t *pamh, const char *name) char ** pam_getenvlist (pam_handle_t *pamh) { - char **envlist; - if (pamh == NULL) return NULL; - envlist = malloc (sizeof (char *) * 2); - envlist[0] = g_strdup_printf ("PATH=%s", getenv ("PATH")); - envlist[1] = NULL; - - return envlist; + return pamh->envlist; } int |