Sorry I needed the libc for some other things ( I also created a new c++-Class which i called inside my Module )
No the _t did not have any special significance in C++ I only followed the convetion!
Here also is my rlm_cpp.cpp Module
#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 */
},
};
}
>
> • 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 FileYou have to link to libc explicitly?
>
>
> Makefile:
>
> TARGET = rlm_cpp
> SRCS = rlm_cpp.cpp
> HEADERS =
> RLM_CFLAGS = -I/usr/include
> RLM_LIBS = -lc
> RLM_INSTALL = install-example
Still not 100% sure whether this is required, my suspicion is that the module will still link and execute, but that it's probably good practice to declare the C linkages explicity.
> 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)
> {
> ...
> }
> }
In any case I think you can just do :
Looks cleaner.
extern "C" static int cpp_authorize(void *instance, REQUEST *request)
{
}
You mean in C++, they're not reserved keywords in C. I already changed "op" in master, i'll have a look at template.
>
> 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
radiusd.conf is a configuration file...
> At the end I needed to change the the struct. First I changed the struct in radiusd.conf
Does the _t have a special significance in C++ or did you just want to follow convention?
> 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!
Sure. This is nice and all, but if you want your modules in the standard distribution of FreeRADIUS it's probably better to just write them in C. The only exception would be if they dependended on an external library for which there was no C equivalent, or which did not expose a C API (the MySQL ndb client library is like this, which is why i've also been investigating).
> 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!
Interesting all the same. Thanks for posting the info.
-Arran