I was a little quick when I originally wrote this: the code only
supported setting new options. Add support for unsetting options and changing the value of existing options. Sponsored by: DARPA, NAI Labs git-svn-id: svn+ssh://svn.openpam.org/svn/openpam/trunk@85 185d5e19-27fe-0310-9dcf-9bff6b9f3609
This commit is contained in:
parent
bad941d5b0
commit
7a936aa997
|
@ -72,10 +72,20 @@ openpam_set_option(pam_handle_t *pamh,
|
||||||
(cur->optv[i][len] == '\0' || cur->optv[i][len] == '='))
|
(cur->optv[i][len] == '\0' || cur->optv[i][len] == '='))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (value == NULL) {
|
||||||
|
/* remove */
|
||||||
|
if (i == cur->optc)
|
||||||
|
return (PAM_SUCCESS);
|
||||||
|
for (free(cur->optv[i]); i < cur->optc; ++i)
|
||||||
|
cur->optv[i] = cur->optv[i + 1];
|
||||||
|
cur->optv[i] = NULL;
|
||||||
|
return (PAM_SUCCESS);
|
||||||
|
}
|
||||||
if ((opt = malloc(len + strlen(value) + 2)) == NULL)
|
if ((opt = malloc(len + strlen(value) + 2)) == NULL)
|
||||||
return (PAM_BUF_ERR);
|
return (PAM_BUF_ERR);
|
||||||
sprintf(opt, "%.*s=%s", (int)len, option, value);
|
sprintf(opt, "%.*s=%s", (int)len, option, value);
|
||||||
if (i == cur->optc) {
|
if (i == cur->optc) {
|
||||||
|
/* add */
|
||||||
optv = realloc(cur->optv, sizeof(char *) * (cur->optc + 2));
|
optv = realloc(cur->optv, sizeof(char *) * (cur->optc + 2));
|
||||||
if (optv == NULL) {
|
if (optv == NULL) {
|
||||||
free(opt);
|
free(opt);
|
||||||
|
@ -85,6 +95,10 @@ openpam_set_option(pam_handle_t *pamh,
|
||||||
optv[i + 1] = NULL;
|
optv[i + 1] = NULL;
|
||||||
cur->optv = optv;
|
cur->optv = optv;
|
||||||
++cur->optc;
|
++cur->optc;
|
||||||
|
} else {
|
||||||
|
/* replace */
|
||||||
|
free(cur->optv[i]);
|
||||||
|
cur->optv[i] = opt;
|
||||||
}
|
}
|
||||||
return (PAM_SUCCESS);
|
return (PAM_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue