pam_fh
open_pam_conf(struct pam_fh **pam_fh, pam_handle_t *pamh, char *config)
if ((*pam_fh = calloc(1, sizeof (struct pam_fh))) == NULL) {
(*pam_fh)->fconfig = fd;
(*pam_fh)->bufsize = (size_t)stb.st_size;
if (((*pam_fh)->data = mmap(0, (*pam_fh)->bufsize, PROT_READ,
MAP_PRIVATE, (*pam_fh)->fconfig, 0)) == MAP_FAILED) {
free (*pam_fh);
(*pam_fh)->bufferp = (*pam_fh)->data;
close_pam_conf(struct pam_fh *pam_fh)
(void) munmap(pam_fh->data, pam_fh->bufsize);
(void) close(pam_fh->fconfig);
free(pam_fh);
struct pam_fh *pam_fh;
if (open_pam_conf(&pam_fh, pamh, config) == 0) {
get_pam_conf_entry(pam_fh, pamh, &pamentp)) == PAM_SUCCESS &&
(void) close_pam_conf(pam_fh);
get_pam_conf_entry(struct pam_fh *pam_fh, pam_handle_t *pamh, pamtab_t **pam)
if ((cp = nextline(pam_fh, pamh, &err)) == NULL) {
nextline(struct pam_fh *pam_fh, pam_handle_t *pamh, int *err)
char *data = pam_fh->data;
char *bufferp = pam_fh->bufferp;
char *bufferendp = &data[pam_fh->bufsize];
if ((input_len = ll - bufferp) >= sizeof (pam_fh->line)) {
input_len = sizeof (pam_fh->line) - 1;
(void) strncpy(pam_fh->line, bufferp, input_len);
pam_fh->line[input_len] = '\0';
pam_fh->bufferp = ll++;
if ((input_len = ll - bufferp) >= sizeof (pam_fh->line)) {
input_len = sizeof (pam_fh->line) - 1;
(void) strncpy(pam_fh->line, bufferp, input_len);
pam_fh->line[input_len] = '\0';
pam_fh->bufferp = ll;
return (pam_fh->line);
static int open_pam_conf(struct pam_fh **, pam_handle_t *, char *);
static void close_pam_conf(struct pam_fh *);
static int get_pam_conf_entry(struct pam_fh *, pam_handle_t *,
static char *nextline(struct pam_fh *, pam_handle_t *, int *);