C++ Module
Patrick Ko
patrick0585 at googlemail.com
Mon Mar 11 16:25:32 CET 2013
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freeradius.org/pipermail/freeradius-devel/attachments/20130311/d5b4afd5/attachment-0001.html>
More information about the Freeradius-Devel
mailing list