18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/***********************************************************************
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* radattr.c
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* A plugin which is stacked on top of radius.so.  This plugin writes
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* all RADIUS attributes from the server's authentication confirmation
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* into /var/run/radattr.pppN.  These attributes are available for
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* consumption by /etc/ppp/ip-{up,down} scripts.
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* Copyright (C) 2002 Roaring Penguin Software Inc.
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* This plugin may be distributed according to the terms of the GNU
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* General Public License, version 2 or (at your option) any later version.
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char const RCSID[] =
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project"$Id: radattr.c,v 1.2 2004/10/28 00:24:40 paulus Exp $";
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h"
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "radiusclient.h"
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h>
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern void (*radius_attributes_hook)(VALUE_PAIR *);
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void print_attributes(VALUE_PAIR *);
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void cleanup(void *opaque, int arg);
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar pppd_version[] = VERSION;
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %FUNCTION: plugin_init
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %ARGUMENTS:
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  None
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %RETURNS:
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  Nothing
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %DESCRIPTION:
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  Initializes radattr plugin.
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectplugin_init(void)
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    radius_attributes_hook = print_attributes;
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if 0
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* calling cleanup() on link down is problematic because print_attributes()
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project       is called only after PAP or CHAP authentication, but not when the link
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project       should go up again for any other reason */
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    add_notifier(&link_down_notifier, cleanup, NULL);
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Just in case... */
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    add_notifier(&exitnotify, cleanup, NULL);
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    info("RADATTR plugin initialized.");
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %FUNCTION: print_attributes
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %ARGUMENTS:
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  vp -- linked-list of RADIUS attribute-value pairs
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %RETURNS:
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  Nothing
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %DESCRIPTION:
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  Prints the attribute pairs to /var/run/radattr.pppN.  Each line of the
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  file contains "name value" pairs.
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectprint_attributes(VALUE_PAIR *vp)
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    FILE *fp;
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char fname[512];
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char name[2048];
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char value[2048];
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int cnt = 0;
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    slprintf(fname, sizeof(fname), "/var/run/radattr.%s", ifname);
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fp = fopen(fname, "w");
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!fp) {
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	warn("radattr plugin: Could not open %s for writing: %m", fname);
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return;
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    for (; vp; vp=vp->next) {
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (rc_avpair_tostr(vp, name, sizeof(name), value, sizeof(value)) < 0) {
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fprintf(fp, "%s %s\n", name, value);
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	cnt++;
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fclose(fp);
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    dbglog("RADATTR plugin wrote %d line(s) to file %s.", cnt, fname);
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/**********************************************************************
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %FUNCTION: cleanup
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %ARGUMENTS:
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  opaque -- not used
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  arg -- not used
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %RETURNS:
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  Nothing
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project* %DESCRIPTION:
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project*  Deletes /var/run/radattr.pppN
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project***********************************************************************/
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectcleanup(void *opaque, int arg)
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char fname[512];
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    slprintf(fname, sizeof(fname), "/var/run/radattr.%s", ifname);
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    (void) remove(fname);
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    dbglog("RADATTR plugin removed file %s.", fname);
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
112