Hello everybody,
here are my Steps how i created an C++ Module for
FreeRadius.
- Adaptions in the radiusd.conf
Create an new Module
Section like:
modules {
cpp {
…
}
}
- Creating an new Directory in the modules Directory
I
created an new Directory named "rlm_cpp" where I putted an Makefile and
my rlm_cpp.cpp File
Makefile:
TARGET = rlm_cpp
SRCS = rlm_cpp.cpp
HEADERS =
RLM_CFLAGS =
-I/usr/include
RLM_LIBS = -lc
RLM_INSTALL = install-example
##
this uses the RLM_CFLAGS and RLM_LIBS and SRCS defs to make TARGET.
include
../rules.mak
$(LT_OBJS): $(HEADERS)
## the rule that RLM_INSTALL
tells the parent rules.mak to use.
install-example:
touch
.
My outgoing rlm_cpp.cpp File was the *.c File I took.
Then I
need to change every function of this file like this:
extern "C" {
static int cpp_authorize(void *instance, REQUEST *request)
{
...
}
}
Then I added two DEFINES at the TOP of my rlm_cpp.cpp File,
because the two words are reserved names in in C.
#define operator
op3578000
#define template tem34123
At the end I needed to change
the the struct. First I changed the struct in radiusd.conf
struct
auth_req {
...
home_server_t
*home_server
...
}
typedef struct radclient {
...
home_server_t *coa_server;
...
}
RADCLIENT;
Also change the Typedef to:
typedef struct home_server
{
...
}home_server_t;
Every struct in the Source of
FreeRadius need to be changed to home_server_t!
now you should
made finallay the main make and see the all should be fine compiled! at the end
run "make install " and implement the new C++ Module in an Section in the
radiusd.conf and it will run!
My class looks so:
#define
operator op3578000
#define template
tem34123
extern "C" {
#include
<freeradius-devel/ident.h>
#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
RCSID("$Id$")
#include
<freeradius-devel/radiusd.h>
#include <freeradius-devel/modules.h>
typedef struct
rlm_cpp_t {
int
boolean;
int
value;
char
*string;
uint32_t
ipaddr;
} rlm_cpp_t;
extern "C"
const CONF_PARSER module_config[] = {
{ "integer", PW_TYPE_INTEGER, offsetof(rlm_cpp_t,value),
NULL, "1" },
{ "boolean",
PW_TYPE_BOOLEAN, offsetof(rlm_cpp_t,boolean), NULL, "no"},
{ "string", PW_TYPE_STRING_PTR,
offsetof(rlm_cpp_t,string), NULL, NULL},
{ "ipaddr", PW_TYPE_IPADDR, offsetof(rlm_cpp_t,ipaddr),
NULL, "*"},
{ NULL, -1, 0, NULL, NULL } /* end the list
*/
};
extern "C" {
static int cpp_instantiate(CONF_SECTION *conf,
void **instance)
{
...
return RLM_MODULE_OK;
}
}
extern "C" {
static int
cpp_post_auth(void *instance, REQUEST *request)
{
VALUE_PAIR
*reply;
VALUE_PAIR *state;
...
return
RLM_MODULE_OK;
}
}
extern "C"
{
static int cpp_preacct(void *instance,
REQUEST *request)
{
/* quiet the compiler */
instance = instance;
request = request;
...
return RLM_MODULE_OK;
}
}
extern "C" {
static int cpp_authorize(void *instance, REQUEST
*request)
{
/* quiet the compiler */
instance = instance;
request = request;
...
return
RLM_MODULE_OK;
}
}
extern "C" {
module_t
rlm_cpp = {
RLM_MODULE_INIT,
"cpp",
RLM_TYPE_THREAD_SAFE, /* type
*/
cpp_instantiate, /*
instantiation */
NULL,
/* detach */
{
NULL,
/* authentication */
cpp_authorize, /* authorization */
cpp_preacct, /* preaccounting */
NULL, /*
accounting */
NULL,
/* checksimul */
NULL, /* pre-proxy */
NULL, /* post-proxy */
cpp_post_auth /* post-auth */
},
};
}
Greetz
Patrick