/*********************************************************************** * * 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); }