Home | History | Annotate | Download | only in radius
      1 /***********************************************************************
      2 *
      3 * radattr.c
      4 *
      5 * A plugin which is stacked on top of radius.so.  This plugin writes
      6 * all RADIUS attributes from the server's authentication confirmation
      7 * into /var/run/radattr.pppN.  These attributes are available for
      8 * consumption by /etc/ppp/ip-{up,down} scripts.
      9 *
     10 * Copyright (C) 2002 Roaring Penguin Software Inc.
     11 *
     12 * This plugin may be distributed according to the terms of the GNU
     13 * General Public License, version 2 or (at your option) any later version.
     14 *
     15 ***********************************************************************/
     16 
     17 static char const RCSID[] =
     18 "$Id: radattr.c,v 1.2 2004/10/28 00:24:40 paulus Exp $";
     19 
     20 #include "pppd.h"
     21 #include "radiusclient.h"
     22 #include <stdio.h>
     23 
     24 extern void (*radius_attributes_hook)(VALUE_PAIR *);
     25 static void print_attributes(VALUE_PAIR *);
     26 static void cleanup(void *opaque, int arg);
     27 
     28 char pppd_version[] = VERSION;
     29 
     30 /**********************************************************************
     31 * %FUNCTION: plugin_init
     32 * %ARGUMENTS:
     33 *  None
     34 * %RETURNS:
     35 *  Nothing
     36 * %DESCRIPTION:
     37 *  Initializes radattr plugin.
     38 ***********************************************************************/
     39 void
     40 plugin_init(void)
     41 {
     42     radius_attributes_hook = print_attributes;
     43 
     44 #if 0
     45     /* calling cleanup() on link down is problematic because print_attributes()
     46        is called only after PAP or CHAP authentication, but not when the link
     47        should go up again for any other reason */
     48     add_notifier(&link_down_notifier, cleanup, NULL);
     49 #endif
     50 
     51     /* Just in case... */
     52     add_notifier(&exitnotify, cleanup, NULL);
     53     info("RADATTR plugin initialized.");
     54 }
     55 
     56 /**********************************************************************
     57 * %FUNCTION: print_attributes
     58 * %ARGUMENTS:
     59 *  vp -- linked-list of RADIUS attribute-value pairs
     60 * %RETURNS:
     61 *  Nothing
     62 * %DESCRIPTION:
     63 *  Prints the attribute pairs to /var/run/radattr.pppN.  Each line of the
     64 *  file contains "name value" pairs.
     65 ***********************************************************************/
     66 static void
     67 print_attributes(VALUE_PAIR *vp)
     68 {
     69     FILE *fp;
     70     char fname[512];
     71     char name[2048];
     72     char value[2048];
     73     int cnt = 0;
     74 
     75     slprintf(fname, sizeof(fname), "/var/run/radattr.%s", ifname);
     76     fp = fopen(fname, "w");
     77     if (!fp) {
     78 	warn("radattr plugin: Could not open %s for writing: %m", fname);
     79 	return;
     80     }
     81 
     82     for (; vp; vp=vp->next) {
     83 	if (rc_avpair_tostr(vp, name, sizeof(name), value, sizeof(value)) < 0) {
     84 	    continue;
     85 	}
     86 	fprintf(fp, "%s %s\n", name, value);
     87 	cnt++;
     88     }
     89     fclose(fp);
     90     dbglog("RADATTR plugin wrote %d line(s) to file %s.", cnt, fname);
     91 }
     92 
     93 /**********************************************************************
     94 * %FUNCTION: cleanup
     95 * %ARGUMENTS:
     96 *  opaque -- not used
     97 *  arg -- not used
     98 * %RETURNS:
     99 *  Nothing
    100 * %DESCRIPTION:
    101 *  Deletes /var/run/radattr.pppN
    102 ***********************************************************************/
    103 static void
    104 cleanup(void *opaque, int arg)
    105 {
    106     char fname[512];
    107 
    108     slprintf(fname, sizeof(fname), "/var/run/radattr.%s", ifname);
    109     (void) remove(fname);
    110     dbglog("RADATTR plugin removed file %s.", fname);
    111 }
    112