Add missing "return(error)".
[dragonfly.git] / contrib / libpam / libpam / pam_data.c
1 /* pam_data.c */
2
3 /*
4  * $Id: pam_data.c,v 1.5 1996/12/01 03:14:13 morgan Exp $
5  * $FreeBSD: src/contrib/libpam/libpam/pam_data.c,v 1.1.1.1.6.2 2001/06/11 15:28:12 markm Exp $
6  * $DragonFly: src/contrib/libpam/libpam/Attic/pam_data.c,v 1.2 2003/06/17 04:24:03 dillon Exp $
7  *
8  * $Log: pam_data.c,v $
9  * Revision 1.5  1996/12/01 03:14:13  morgan
10  * use _pam_macros.h
11  *
12  * Revision 1.4  1996/11/10 19:59:56  morgan
13  * internalized strdup for malloc debugging
14  *
15  * Revision 1.3  1996/09/05 06:10:31  morgan
16  * changed type of cleanup(), added PAM_DATA_REPLACE to replacement
17  * cleanup() call.
18  *
19  * Revision 1.2  1996/03/16 21:33:05  morgan
20  * removed const from cleanup argument, also deleted comment about SUN stuff
21  *
22  *
23  */
24
25 #include <stdlib.h>
26 #include <string.h>
27
28 #include "pam_private.h"
29
30 struct pam_data *_pam_locate_data(const pam_handle_t *pamh, const char *name);
31
32 int pam_set_data(
33     pam_handle_t *pamh,
34     const char *module_data_name,
35     void *data,
36     void (*cleanup)(pam_handle_t *pamh, void *data, int error_status))
37 {
38     struct pam_data *data_entry;
39     
40     IF_NO_PAMH("pam_set_data",pamh,PAM_SYSTEM_ERR);
41
42     /* first check if there is some data already. If so clean it up */
43
44     if ((data_entry = _pam_locate_data(pamh, module_data_name))) {
45         if (data_entry->cleanup) {
46             data_entry->cleanup(pamh, data_entry->data
47                                 , PAM_DATA_REPLACE | PAM_SUCCESS );
48         }
49     } else if ((data_entry = malloc(sizeof(*data_entry)))) {
50         char *tname;
51
52         if ((tname = _pam_strdup(module_data_name)) == NULL) {
53             pam_system_log(pamh, NULL, LOG_CRIT,
54                            "pam_set_data: no memory for data name");
55             _pam_drop(data_entry);
56             return PAM_BUF_ERR;
57         }
58         data_entry->next = pamh->data;
59         pamh->data = data_entry;
60         data_entry->name = tname;
61     } else {
62         pam_system_log(pamh, NULL, LOG_CRIT,
63                        "pam_set_data: cannot allocate data entry");
64         return PAM_BUF_ERR;
65     }
66
67     data_entry->data = data;           /* note this could be NULL */
68     data_entry->cleanup = cleanup;
69
70     return PAM_SUCCESS;
71 }
72
73 int pam_get_data(
74     const pam_handle_t *pamh,
75     const char *module_data_name,
76     const void **datap)
77 {
78     struct pam_data *data;
79
80     IF_NO_PAMH("pam_get_data",pamh,PAM_SYSTEM_ERR);
81
82     data = _pam_locate_data(pamh, module_data_name);
83     if (data) {
84         *datap = data->data;
85         return PAM_SUCCESS;
86     }
87
88     return PAM_NO_MODULE_DATA;
89 }
90
91 struct pam_data *_pam_locate_data(const pam_handle_t *pamh, const char *name)
92 {
93     struct pam_data *data;
94
95     IF_NO_PAMH("_pam_locate_data",pamh,NULL);
96     data = pamh->data;
97     
98     while (data) {
99         if (!strcmp(data->name, name)) {
100             return data;
101         }
102         data = data->next;
103     }
104
105     return NULL;
106 }
107
108 void _pam_free_data(pam_handle_t *pamh, int status)
109 {
110     struct pam_data *last;
111     struct pam_data *data;
112
113     IF_NO_PAMH("_pam_free_data",pamh,/* no return value for void fn */);
114     data = pamh->data;
115
116     while (data) {
117         last = data;
118         data = data->next;
119         if (last->cleanup) {
120             last->cleanup(pamh, last->data, status);
121         }
122         _pam_drop(last->name);
123         _pam_drop(last);
124     }
125 }