summaryrefslogtreecommitdiff
path: root/tests/src
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2012-03-01 09:26:11 +1100
committerRobert Ancell <robert.ancell@canonical.com>2012-03-01 09:26:11 +1100
commit3831728ca1d81e2b058a1ae9da86b1f592acc9c4 (patch)
tree7f1e8c77c58eeb5c58632b4b0d8cac017dd90d95 /tests/src
parentcf181582bced69d8ce0ebf4b8e983486da7e8bb8 (diff)
downloadlightdm-3831728ca1d81e2b058a1ae9da86b1f592acc9c4.tar.gz
Improve simulation of PAM environment
Diffstat (limited to 'tests/src')
-rw-r--r--tests/src/libsystem.c63
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