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