18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * $Id: buildreq.c,v 1.1 2004/11/14 07:26:26 paulus Exp $
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 1995,1997 Lars Fenneberg
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * See the file COPYRIGHT for the respective terms and conditions.
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If the file is missing contact me at lf@elemental.net
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and I'll send you a copy.
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <includes.h>
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <radiusclient.h>
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned char rc_get_seqnbr(void);
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_get_nas_id
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: fills in NAS-Identifier or NAS-IP-Address in request
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_get_nas_id(VALUE_PAIR **sendpairs)
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	UINT4		client_id;
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *nasid;
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	nasid = rc_conf_str("nas_identifier");
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (strlen(nasid)) {
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		/*
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		 * Fill in NAS-Identifier
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		 */
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (rc_avpair_add(sendpairs, PW_NAS_IDENTIFIER, nasid, 0,
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				  VENDOR_NONE) == NULL)
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return (ERROR_RC);
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (OK_RC);
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		/*
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		 * Fill in NAS-IP-Address
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		 */
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((client_id = rc_own_ipaddress()) == 0)
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return (ERROR_RC);
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (rc_avpair_add(sendpairs, PW_NAS_IP_ADDRESS, &client_id,
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				  0, VENDOR_NONE) == NULL)
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return (ERROR_RC);
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (OK_RC);
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_buildreq
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: builds a skeleton RADIUS request using information from the
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    config file.
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid rc_buildreq(SEND_DATA *data, int code, char *server, unsigned short port,
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		 int timeout, int retries)
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data->server = server;
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data->svc_port = port;
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data->seq_nbr = rc_get_seqnbr();
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data->timeout = timeout;
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data->retries = retries;
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data->code = code;
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_guess_seqnbr
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: return a random sequence number
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic unsigned char rc_guess_seqnbr(void)
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (unsigned char)(magic() & UCHAR_MAX);
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_get_seqnbr
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: generate a sequence number
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned char rc_get_seqnbr(void)
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	FILE *sf;
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int tries = 1;
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int seq_nbr, pos;
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *seqfile = rc_conf_str("seqfile");
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((sf = fopen(seqfile, "a+")) == NULL)
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("rc_get_seqnbr: couldn't open sequence file %s: %s", seqfile, strerror(errno));
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		/* well, so guess a sequence number */
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return rc_guess_seqnbr();
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (do_lock_exclusive(fileno(sf))!= 0)
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (errno != EWOULDBLOCK) {
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_get_seqnbr: flock failure: %s: %s", seqfile, strerror(errno));
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			fclose(sf);
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return rc_guess_seqnbr();
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		tries++;
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (tries <= 10)
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_mdelay(500);
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (tries > 10) {
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("rc_get_seqnbr: couldn't get lock after %d tries: %s", tries-1, seqfile);
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fclose(sf);
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return rc_guess_seqnbr();
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pos = ftell(sf);
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rewind(sf);
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (fscanf(sf, "%d", &seq_nbr) != 1) {
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (pos != ftell(sf)) {
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* file was not empty */
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_get_seqnbr: fscanf failure: %s", seqfile);
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		seq_nbr = rc_guess_seqnbr();
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rewind(sf);
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	ftruncate(fileno(sf),0);
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fprintf(sf,"%d\n", (seq_nbr+1) & UCHAR_MAX);
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fflush(sf); /* fflush because a process may read it between the do_unlock and fclose */
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (do_unlock(fileno(sf)) != 0)
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("rc_get_seqnbr: couldn't release lock on %s: %s", seqfile, strerror(errno));
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fclose(sf);
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (unsigned char)seq_nbr;
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_auth
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Builds an authentication request for port id client_port
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    with the value_pairs send and submits it to a server
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: received value_pairs in received, messages from the server in msg
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    and 0 on success, negative on failure as return value
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_auth(UINT4 client_port, VALUE_PAIR *send, VALUE_PAIR **received,
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    char *msg, REQUEST_INFO *info)
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    SERVER *authserver = rc_conf_srv("authserver");
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!authserver) {
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (ERROR_RC);
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return rc_auth_using_server(authserver, client_port, send, received,
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				msg, info);
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_auth_using_server
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Builds an authentication request for port id client_port
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    with the value_pairs send and submits it to a server.  You
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          explicitly supply a server list.
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: received value_pairs in received, messages from the server in msg
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    and 0 on success, negative on failure as return value
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_auth_using_server(SERVER *authserver,
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 UINT4 client_port,
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 VALUE_PAIR *send,
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 VALUE_PAIR **received,
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 char *msg, REQUEST_INFO *info)
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SEND_DATA       data;
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		result;
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		i;
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		timeout = rc_conf_int("radius_timeout");
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		retries = rc_conf_int("radius_retries");
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.send_pairs = send;
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.receive_pairs = NULL;
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in NAS-IP-Address or NAS-Identifier
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (rc_get_nas_id(&(data.send_pairs)) == ERROR_RC)
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return (ERROR_RC);
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in NAS-Port
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (rc_avpair_add(&(data.send_pairs), PW_NAS_PORT, &client_port, 0, VENDOR_NONE) == NULL)
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (ERROR_RC);
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	result = ERROR_RC;
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for(i=0; (i<authserver->max) && (result != OK_RC) && (result != BADRESP_RC)
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		; i++)
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (data.receive_pairs != NULL) {
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_avpair_free(data.receive_pairs);
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			data.receive_pairs = NULL;
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		rc_buildreq(&data, PW_ACCESS_REQUEST, authserver->name[i],
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    authserver->port[i], timeout, retries);
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		result = rc_send_server (&data, msg, info);
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	*received = data.receive_pairs;
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return result;
2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_auth_proxy
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Builds an authentication request
2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    with the value_pairs send and submits it to a server.
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    Works for a proxy; does not add IP address, and does
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    does not rely on config file.
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: received value_pairs in received, messages from the server in msg
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    and 0 on success, negative on failure as return value
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_auth_proxy(VALUE_PAIR *send, VALUE_PAIR **received, char *msg)
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SEND_DATA       data;
2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		result;
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		i;
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SERVER		*authserver = rc_conf_srv("authserver");
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		timeout = rc_conf_int("radius_timeout");
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		retries = rc_conf_int("radius_retries");
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.send_pairs = send;
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.receive_pairs = NULL;
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	result = ERROR_RC;
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for(i=0; (i<authserver->max) && (result != OK_RC) && (result != BADRESP_RC)
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		; i++)
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (data.receive_pairs != NULL) {
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_avpair_free(data.receive_pairs);
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			data.receive_pairs = NULL;
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		rc_buildreq(&data, PW_ACCESS_REQUEST, authserver->name[i],
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    authserver->port[i], timeout, retries);
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		result = rc_send_server (&data, msg, NULL);
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	*received = data.receive_pairs;
2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return result;
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_acct_using_server
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Builds an accounting request for port id client_port
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    with the value_pairs send.  You explicitly supply server list.
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Remarks: NAS-Identifier/NAS-IP-Address, NAS-Port and Acct-Delay-Time get
2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    filled in by this function, the rest has to be supplied.
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_acct_using_server(SERVER *acctserver,
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 UINT4 client_port,
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 VALUE_PAIR *send)
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SEND_DATA       data;
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR	*adt_vp;
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		result;
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	time_t		start_time, dtime;
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char		msg[4096];
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		i;
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		timeout = rc_conf_int("radius_timeout");
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		retries = rc_conf_int("radius_retries");
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.send_pairs = send;
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.receive_pairs = NULL;
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in NAS-IP-Address or NAS-Identifier
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (rc_get_nas_id(&(data.send_pairs)) == ERROR_RC)
3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return (ERROR_RC);
3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in NAS-Port
3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (rc_avpair_add(&(data.send_pairs), PW_NAS_PORT, &client_port, 0, VENDOR_NONE) == NULL)
3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (ERROR_RC);
3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in Acct-Delay-Time
3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	dtime = 0;
3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((adt_vp = rc_avpair_add(&(data.send_pairs), PW_ACCT_DELAY_TIME, &dtime, 0, VENDOR_NONE)) == NULL)
3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (ERROR_RC);
3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	start_time = time(NULL);
3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	result = ERROR_RC;
3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for(i=0; (i<acctserver->max) && (result != OK_RC) && (result != BADRESP_RC)
3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		; i++)
3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (data.receive_pairs != NULL) {
3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_avpair_free(data.receive_pairs);
3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			data.receive_pairs = NULL;
3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		rc_buildreq(&data, PW_ACCOUNTING_REQUEST, acctserver->name[i],
3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    acctserver->port[i], timeout, retries);
3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		dtime = time(NULL) - start_time;
3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		rc_avpair_assign(adt_vp, &dtime, 0);
3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		result = rc_send_server (&data, msg, NULL);
3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rc_avpair_free(data.receive_pairs);
3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return result;
3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_acct
3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Builds an accounting request for port id client_port
3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    with the value_pairs send
3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Remarks: NAS-Identifier/NAS-IP-Address, NAS-Port and Acct-Delay-Time get
3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    filled in by this function, the rest has to be supplied.
3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_acct(UINT4 client_port, VALUE_PAIR *send)
3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    SERVER *acctserver = rc_conf_srv("acctserver");
3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!acctserver) return (ERROR_RC);
3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return rc_acct_using_server(acctserver, client_port, send);
3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_acct_proxy
3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Builds an accounting request with the value_pairs send
3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_acct_proxy(VALUE_PAIR *send)
3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SEND_DATA       data;
3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		result;
3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char		msg[4096];
3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		i;
3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SERVER		*acctserver = rc_conf_srv("authserver");
3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		timeout = rc_conf_int("radius_timeout");
3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		retries = rc_conf_int("radius_retries");
3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.send_pairs = send;
3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.receive_pairs = NULL;
3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	result = ERROR_RC;
3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for(i=0; (i<acctserver->max) && (result != OK_RC) && (result != BADRESP_RC)
3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		; i++)
3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (data.receive_pairs != NULL) {
3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_avpair_free(data.receive_pairs);
3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			data.receive_pairs = NULL;
3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		rc_buildreq(&data, PW_ACCOUNTING_REQUEST, acctserver->name[i],
3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    acctserver->port[i], timeout, retries);
3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		result = rc_send_server (&data, msg, NULL);
4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rc_avpair_free(data.receive_pairs);
4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return result;
4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_check
4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: ask the server hostname on the specified port for a
4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    status message
4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_check(char *host, unsigned short port, char *msg)
4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	SEND_DATA       data;
4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		result;
4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	UINT4		service_type;
4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		timeout = rc_conf_int("radius_timeout");
4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int		retries = rc_conf_int("radius_retries");
4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	data.send_pairs = data.receive_pairs = NULL;
4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in NAS-IP-Address or NAS-Identifier,
4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project         * although it isn't neccessary
4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (rc_get_nas_id(&(data.send_pairs)) == ERROR_RC)
4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return (ERROR_RC);
4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Fill in Service-Type
4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	service_type = PW_ADMINISTRATIVE;
4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rc_avpair_add(&(data.send_pairs), PW_SERVICE_TYPE, &service_type, 0, VENDOR_NONE);
4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rc_buildreq(&data, PW_STATUS_SERVER, host, port, timeout, retries);
4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	result = rc_send_server (&data, msg, NULL);
4428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	rc_avpair_free(data.receive_pairs);
4448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return result;
4468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
447