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