• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
plugin_init(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
print_attributes(VALUE_PAIR * vp)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
cleanup(void * opaque,int arg)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