You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.1 KiB
112 lines
3.1 KiB
/***********************************************************************
|
|
*
|
|
* radattr.c
|
|
*
|
|
* A plugin which is stacked on top of radius.so. This plugin writes
|
|
* all RADIUS attributes from the server's authentication confirmation
|
|
* into /var/run/radattr.pppN. These attributes are available for
|
|
* consumption by /etc/ppp/ip-{up,down} scripts.
|
|
*
|
|
* Copyright (C) 2002 Roaring Penguin Software Inc.
|
|
*
|
|
* This plugin may be distributed according to the terms of the GNU
|
|
* General Public License, version 2 or (at your option) any later version.
|
|
*
|
|
***********************************************************************/
|
|
|
|
static char const RCSID[] =
|
|
"$Id: radattr.c,v 1.2 2004/10/28 00:24:40 paulus Exp $";
|
|
|
|
#include "pppd.h"
|
|
#include "radiusclient.h"
|
|
#include <stdio.h>
|
|
|
|
extern void (*radius_attributes_hook)(VALUE_PAIR *);
|
|
static void print_attributes(VALUE_PAIR *);
|
|
static void cleanup(void *opaque, int arg);
|
|
|
|
char pppd_version[] = VERSION;
|
|
|
|
/**********************************************************************
|
|
* %FUNCTION: plugin_init
|
|
* %ARGUMENTS:
|
|
* None
|
|
* %RETURNS:
|
|
* Nothing
|
|
* %DESCRIPTION:
|
|
* Initializes radattr plugin.
|
|
***********************************************************************/
|
|
void
|
|
plugin_init(void)
|
|
{
|
|
radius_attributes_hook = print_attributes;
|
|
|
|
#if 0
|
|
/* calling cleanup() on link down is problematic because print_attributes()
|
|
is called only after PAP or CHAP authentication, but not when the link
|
|
should go up again for any other reason */
|
|
add_notifier(&link_down_notifier, cleanup, NULL);
|
|
#endif
|
|
|
|
/* Just in case... */
|
|
add_notifier(&exitnotify, cleanup, NULL);
|
|
info("RADATTR plugin initialized.");
|
|
}
|
|
|
|
/**********************************************************************
|
|
* %FUNCTION: print_attributes
|
|
* %ARGUMENTS:
|
|
* vp -- linked-list of RADIUS attribute-value pairs
|
|
* %RETURNS:
|
|
* Nothing
|
|
* %DESCRIPTION:
|
|
* Prints the attribute pairs to /var/run/radattr.pppN. Each line of the
|
|
* file contains "name value" pairs.
|
|
***********************************************************************/
|
|
static void
|
|
print_attributes(VALUE_PAIR *vp)
|
|
{
|
|
FILE *fp;
|
|
char fname[512];
|
|
char name[2048];
|
|
char value[2048];
|
|
int cnt = 0;
|
|
|
|
slprintf(fname, sizeof(fname), "/var/run/radattr.%s", ifname);
|
|
fp = fopen(fname, "w");
|
|
if (!fp) {
|
|
warn("radattr plugin: Could not open %s for writing: %m", fname);
|
|
return;
|
|
}
|
|
|
|
for (; vp; vp=vp->next) {
|
|
if (rc_avpair_tostr(vp, name, sizeof(name), value, sizeof(value)) < 0) {
|
|
continue;
|
|
}
|
|
fprintf(fp, "%s %s\n", name, value);
|
|
cnt++;
|
|
}
|
|
fclose(fp);
|
|
dbglog("RADATTR plugin wrote %d line(s) to file %s.", cnt, fname);
|
|
}
|
|
|
|
/**********************************************************************
|
|
* %FUNCTION: cleanup
|
|
* %ARGUMENTS:
|
|
* opaque -- not used
|
|
* arg -- not used
|
|
* %RETURNS:
|
|
* Nothing
|
|
* %DESCRIPTION:
|
|
* Deletes /var/run/radattr.pppN
|
|
***********************************************************************/
|
|
static void
|
|
cleanup(void *opaque, int arg)
|
|
{
|
|
char fname[512];
|
|
|
|
slprintf(fname, sizeof(fname), "/var/run/radattr.%s", ifname);
|
|
(void) remove(fname);
|
|
dbglog("RADATTR plugin removed file %s.", fname);
|
|
}
|