4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 * Copyright 2000 The FreeRADIUS server project
21 #include <freeradius-devel/autoconf.h>
27 #include <freeradius-devel/radiusd.h>
28 #include <freeradius-devel/modules.h>
30 static const char rcsid[] = "$Id$";
33 * The instance data for rlm_always is the list of fake values we are
36 typedef struct rlm_always_t {
44 * A mapping of configuration file names to internal variables.
46 * Note that the string is dynamically allocated, so it MUST
47 * be freed. When the configuration file parse re-reads the string,
48 * it free's the old one, and strdup's the new one, placing the pointer
49 * to the strdup'd string into 'config.string'. This gets around
52 static const CONF_PARSER module_config[] = {
53 { "rcode", PW_TYPE_STRING_PTR, offsetof(rlm_always_t,rcode_str),
55 { "simulcount", PW_TYPE_INTEGER, offsetof(rlm_always_t,simulcount),
57 { "mpp", PW_TYPE_BOOLEAN, offsetof(rlm_always_t,mpp),
60 { NULL, -1, 0, NULL, NULL } /* end the list */
63 static int str2rcode(const char *s)
65 if(!strcasecmp(s, "reject"))
66 return RLM_MODULE_REJECT;
67 else if(!strcasecmp(s, "fail"))
68 return RLM_MODULE_FAIL;
69 else if(!strcasecmp(s, "ok"))
71 else if(!strcasecmp(s, "handled"))
72 return RLM_MODULE_HANDLED;
73 else if(!strcasecmp(s, "invalid"))
74 return RLM_MODULE_INVALID;
75 else if(!strcasecmp(s, "userlock"))
76 return RLM_MODULE_USERLOCK;
77 else if(!strcasecmp(s, "notfound"))
78 return RLM_MODULE_NOTFOUND;
79 else if(!strcasecmp(s, "noop"))
80 return RLM_MODULE_NOOP;
81 else if(!strcasecmp(s, "updated"))
82 return RLM_MODULE_UPDATED;
85 "rlm_always: Unknown module rcode '%s'.\n", s);
90 static int always_instantiate(CONF_SECTION *conf, void **instance)
95 * Set up a storage area for instance data
97 data = rad_malloc(sizeof(*data));
101 memset(data, 0, sizeof(*data));
104 * If the configuration parameters can't be parsed, then
107 if (cf_section_parse(conf, data, module_config) < 0) {
113 * Convert the rcode string to an int, and get rid of it
115 data->rcode = str2rcode(data->rcode_str);
116 free(data->rcode_str);
117 data->rcode_str = NULL;
118 if (data->rcode == -1) {
129 * Just return the rcode ... this function is autz, auth, acct, and
132 static int always_return(void *instance, REQUEST *request)
134 /* quiet the compiler */
137 return ((struct rlm_always_t *)instance)->rcode;
141 * checksimul fakes some other variables besides the rcode...
143 static int always_checksimul(void *instance, REQUEST *request)
145 struct rlm_always_t *inst = instance;
147 request->simul_count = inst->simulcount;
150 request->simul_mpp = 2;
155 static int always_detach(void *instance)
161 module_t rlm_always = {
164 RLM_TYPE_THREAD_SAFE, /* type */
165 always_instantiate, /* instantiation */
166 always_detach, /* detach */
168 always_return, /* authentication */
169 always_return, /* authorization */
170 always_return, /* preaccounting */
171 always_return, /* accounting */
172 always_checksimul, /* checksimul */
173 always_return, /* pre-proxy */
174 always_return, /* post-proxy */
175 always_return /* post-auth */