Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / libpam / libpam / pam_end.c
1 /* pam_end.c */
2
3 /*
4  * $Id: pam_end.c,v 1.5 1996/12/01 03:14:13 morgan Exp $
5  * $FreeBSD: src/contrib/libpam/libpam/pam_end.c,v 1.1.1.1.6.2 2001/06/11 15:28:12 markm Exp $
6  *
7  * $Log: pam_end.c,v $
8  */
9
10 #include <stdlib.h>
11
12 #include "pam_private.h"
13
14 int pam_end(pam_handle_t *pamh, int pam_status)
15 {
16     int ret;
17
18     IF_NO_PAMH("pam_end", pamh, PAM_SYSTEM_ERR);
19
20     D(("entering pam_end()"));
21
22     /* first liberate the modules (it is not inconcevible that the
23        modules may need to use the service_name etc. to clean up) */
24
25     _pam_free_data(pamh, pam_status);
26
27     /* now drop all modules */
28
29     if ((ret = _pam_free_handlers(pamh)) != PAM_SUCCESS) {
30         return ret;                 /* error occurred */
31     }
32
33     /* from this point we cannot call the modules any more. Free the remaining
34        memory used by the Linux-PAM interface */
35
36     _pam_drop_env(pamh);                      /* purge the environment */
37
38     _pam_overwrite(pamh->authtok);            /* blank out old token */
39     _pam_drop(pamh->authtok);
40
41     _pam_overwrite(pamh->oldauthtok);         /* blank out old token */
42     _pam_drop(pamh->oldauthtok);
43
44     _pam_overwrite(pamh->former.prompt);
45     _pam_drop(pamh->former.prompt);           /* drop saved prompt */
46
47     _pam_overwrite(pamh->service_name);
48     _pam_drop(pamh->service_name);
49
50     _pam_overwrite(pamh->user);
51     _pam_drop(pamh->user);
52
53     _pam_overwrite(pamh->prompt);
54     _pam_drop(pamh->prompt);                  /* prompt for pam_get_user() */
55
56     _pam_overwrite(pamh->tty);
57     _pam_drop(pamh->tty);
58
59     _pam_overwrite(pamh->rhost);
60     _pam_drop(pamh->rhost);
61
62     _pam_overwrite(pamh->ruser);
63     _pam_drop(pamh->ruser);
64
65     _pam_drop(pamh->pam_conversation);
66     pamh->fail_delay.delay_fn_ptr = NULL;
67
68     _pam_overwrite(pamh->pam_default_log.ident);
69     _pam_drop(pamh->pam_default_log.ident);
70
71     /* and finally liberate the memory for the pam_handle structure */
72
73     _pam_drop(pamh);
74
75     D(("exiting pam_end() successfully"));
76
77     return PAM_SUCCESS;
78 }