18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * $Id: avpair.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 Lars Fenneberg
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 1992 Livingston Enterprises, Inc.
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and Merit Network, Inc. All Rights Reserved
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * See the file COPYRIGHT for the respective terms and conditions.
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If the file is missing contact me at lf@elemental.net
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and I'll send you a copy.
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <includes.h>
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <radiusclient.h>
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void rc_extract_vendor_specific_attributes(int attrlen,
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						  unsigned char *ptr,
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						  VALUE_PAIR **vp);
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_add
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: add an attribute-value pair to the given list.
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: pointer to added a/v pair upon success, NULL pointer upon failure.
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Remarks: Always appends the new pair to the end of the list.
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVALUE_PAIR *rc_avpair_add (VALUE_PAIR **list, int attrid, void *pval, int len,
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			   int vendorcode)
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *vp;
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vp = rc_avpair_new (attrid, pval, len, vendorcode);
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (vp != (VALUE_PAIR *) NULL)
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		rc_avpair_insert (list, (VALUE_PAIR *) NULL, vp);
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return vp;
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_assign
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: assign the given value to an attribute-value pair.
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns:  0 on success,
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    -1 on failure.
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_avpair_assign (VALUE_PAIR *vp, void *pval, int len)
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int	result = -1;
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	switch (vp->type)
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		case PW_TYPE_STRING:
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (((len == 0) && (strlen ((char *) pval)) > AUTH_STRING_LEN)
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    || (len > AUTH_STRING_LEN)) {
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_avpair_assign: bad attribute length");
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return result;
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    }
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (len > 0) {
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				memcpy(vp->strvalue, (char *)pval, len);
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				vp->strvalue[len] = '\0';
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				vp->lvalue = len;
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			} else {
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strncpy (vp->strvalue, (char *) pval, AUTH_STRING_LEN);
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp->lvalue = strlen((char *) pval);
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			result = 0;
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		case PW_TYPE_DATE:
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		case PW_TYPE_INTEGER:
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		case PW_TYPE_IPADDR:
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp->lvalue = * (UINT4 *) pval;
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			result = 0;
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		default:
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_avpair_assign: unknown attribute %d", vp->type);
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return result;
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_new
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: make a new attribute-value pair with given parameters.
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: pointer to generated a/v pair when successful, NULL when failure.
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVALUE_PAIR *rc_avpair_new (int attrid, void *pval, int len, int vendorcode)
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *vp = (VALUE_PAIR *) NULL;
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_ATTR      *pda;
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((pda = rc_dict_getattr (attrid, vendorcode)) == (DICT_ATTR *) NULL)
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("rc_avpair_new: unknown attribute %d", attrid);
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	else
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((vp = (VALUE_PAIR *) malloc (sizeof (VALUE_PAIR)))
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							!= (VALUE_PAIR *) NULL)
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strncpy (vp->name, pda->name, sizeof (vp->name));
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp->attribute = attrid;
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp->vendorcode = vendorcode;
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp->next = (VALUE_PAIR *) NULL;
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp->type = pda->type;
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (rc_avpair_assign (vp, pval, len) == 0)
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return vp;
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			free (vp);
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp = (VALUE_PAIR *) NULL;
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			novm("rc_avpair_new");
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return vp;
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_gen
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: takes attribute/value pairs from buffer and builds a
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    value_pair list using allocated memory.
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: value_pair list or NULL on failure
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVALUE_PAIR *rc_avpair_gen (AUTH_HDR *auth)
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             length;
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             x_len;
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             attribute;
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             attrlen;
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	UINT4           lvalue;
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unsigned char         *x_ptr;
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unsigned char         *ptr;
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_ATTR      *attr;
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *vp;
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *pair;
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unsigned char   hex[3];		/* For hex string conversion. */
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            buffer[512];
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/*
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 * Extract attribute-value pairs
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	 */
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	ptr = auth->data;
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	length = ntohs ((unsigned short) auth->length) - AUTH_HDR_LEN;
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vp = (VALUE_PAIR *) NULL;
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (length > 0)
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attribute = *ptr++;
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attrlen = *ptr++;
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attrlen -= 2;
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (attrlen < 0)
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_avpair_gen: received attribute with invalid length");
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		/* Handle vendor-specific specially */
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (attribute == PW_VENDOR_SPECIFIC) {
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    rc_extract_vendor_specific_attributes(attrlen, ptr, &vp);
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    ptr += attrlen;
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    length -= (attrlen + 2);
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    continue;
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((attr = rc_dict_getattr (attribute, VENDOR_NONE)) == (DICT_ATTR *) NULL)
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			*buffer= '\0';	/* Initial length. */
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			for (x_ptr = ptr, x_len = attrlen ;
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				x_len > 0 ;
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				x_len--, x_ptr++)
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				sprintf (hex, "%2.2X", *x_ptr);
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				strcat (buffer, hex);
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			warn("rc_avpair_gen: received unknown attribute %d of length %d: 0x%s",
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				attribute, attrlen, buffer);
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if ((pair =
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				(VALUE_PAIR *) malloc (sizeof (VALUE_PAIR))) ==
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					(VALUE_PAIR *) NULL)
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				novm("rc_avpair_gen");
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				rc_avpair_free(vp);
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return NULL;
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strcpy (pair->name, attr->name);
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->attribute = attr->value;
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->vendorcode = VENDOR_NONE;
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->type = attr->type;
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->next = (VALUE_PAIR *) NULL;
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			switch (attr->type)
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_STRING:
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				memcpy (pair->strvalue, (char *) ptr, (size_t) attrlen);
2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->strvalue[attrlen] = '\0';
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->lvalue = attrlen;
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				rc_avpair_insert (&vp, (VALUE_PAIR *) NULL, pair);
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_INTEGER:
2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_IPADDR:
2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				memcpy ((char *) &lvalue, (char *) ptr,
2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					sizeof (UINT4));
2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->lvalue = ntohl (lvalue);
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				rc_avpair_insert (&vp, (VALUE_PAIR *) NULL, pair);
2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    default:
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				warn("rc_avpair_gen: %s has unknown type", attr->name);
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				free (pair);
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		ptr += attrlen;
2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		length -= attrlen + 2;
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (vp);
2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_extract_vendor_specific_attributes
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Extracts vendor-specific attributes, assuming they are in
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          the "SHOULD" format recommended by RCF 2138.
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: found value_pair
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void rc_extract_vendor_specific_attributes(int attrlen,
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						  unsigned char *ptr,
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						  VALUE_PAIR **vp)
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int vendor_id;
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int vtype;
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int vlen;
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    UINT4 lvalue;
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    DICT_ATTR *attr;
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    VALUE_PAIR *pair;
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* ptr is sitting at vendor-ID */
2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (attrlen < 8) {
2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* Nothing to see here... */
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return;
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* High-order octet of Vendor-Id must be zero (RFC2138) */
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (*ptr) {
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return;
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Extract vendor_id */
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    vendor_id = (int) (
2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	((unsigned int) ptr[1]) * 256 * 256 +
2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	((unsigned int) ptr[2]) * 256 +
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	((unsigned int) ptr[3]));
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Bump ptr up to contents */
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    ptr += 4;
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* Set attrlen to length of data */
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    attrlen -= 4;
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    for (; attrlen; attrlen -= vlen+2, ptr += vlen) {
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vtype = *ptr++;
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vlen = *ptr++;
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vlen -= 2;
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (vlen < 0 || vlen > attrlen - 2) {
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    /* Do not log an error.  We are supposed to be able to cope with
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	       arbitrary vendor-specific gunk */
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return;
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* Looks plausible... */
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((attr = rc_dict_getattr(vtype, vendor_id)) == NULL) {
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    continue;
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* TODO: Check that length matches data size!!!!! */
3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pair = (VALUE_PAIR *) malloc(sizeof(VALUE_PAIR));
3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!pair) {
3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    novm("rc_avpair_gen");
3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return;
3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strcpy(pair->name, attr->name);
3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pair->attribute = attr->value;
3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pair->vendorcode = vendor_id;
3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pair->type = attr->type;
3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	pair->next = NULL;
3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	switch (attr->type) {
3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case PW_TYPE_STRING:
3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    memcpy (pair->strvalue, (char *) ptr, (size_t) vlen);
3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    pair->strvalue[vlen] = '\0';
3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    pair->lvalue = vlen;
3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    rc_avpair_insert (vp, (VALUE_PAIR *) NULL, pair);
3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case PW_TYPE_INTEGER:
3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case PW_TYPE_IPADDR:
3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    memcpy ((char *) &lvalue, (char *) ptr,
3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    sizeof (UINT4));
3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    pair->lvalue = ntohl (lvalue);
3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    rc_avpair_insert (vp, (VALUE_PAIR *) NULL, pair);
3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	default:
3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    warn("rc_avpair_gen: %s has unknown type", attr->name);
3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    free (pair);
3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_get
3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Find the first attribute value-pair (which matches the given
3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          attribute) from the specified value-pair list.
3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: found value_pair
3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVALUE_PAIR *rc_avpair_get (VALUE_PAIR *vp, UINT4 attr)
3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (; vp != (VALUE_PAIR *) NULL && vp->attribute != attr; vp = vp->next)
3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		continue;
3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (vp);
3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_copy
3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return a copy of the existing list "p" ala strdup().
3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVALUE_PAIR *rc_avpair_copy(VALUE_PAIR *p)
3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR *vp, *fp = NULL, *lp = NULL;
3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (p) {
3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		vp = malloc(sizeof(VALUE_PAIR));
3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (!vp) {
3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    novm("rc_avpair_copy");
3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    return NULL; /* leaks a little but so what */
3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*vp = *p;
3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (!fp)
3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			fp = vp;
3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (lp)
3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			lp->next = vp;
3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lp = vp;
3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		p = p->next;
3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return fp;
3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_insert
3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Given the address of an existing list "a" and a pointer
3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    to an entry "p" in that list, add the list "b" to
3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    the "a" list after the "p" entry.  If "p" is NULL, add
3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    the list "b" to the end of "a".
3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid rc_avpair_insert (VALUE_PAIR **a, VALUE_PAIR *p, VALUE_PAIR *b)
4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *this_node = NULL;
4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *vp;
4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (*a == (VALUE_PAIR *) NULL)
4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*a = b;
4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return;
4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!b)
4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return;
4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vp = *a;
4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ( p == (VALUE_PAIR *) NULL) /* run to end of "a" list */
4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		while (vp != (VALUE_PAIR *) NULL)
4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			this_node = vp;
4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vp = vp->next;
4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	else /* look for the "p" entry in the "a" list (or run to end) */
4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		this_node = *a;
4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		while (this_node != (VALUE_PAIR *) NULL)
4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (this_node == p)
4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			this_node = this_node->next;
4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* add "b" at this_node */
4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	vp = this_node->next;
4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	this_node->next = b;
4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* run to end of "b" and connect the rest of "a" */
4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (b->next)
4428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		b = b->next;
4438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	b->next = vp;
4448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return;
4468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_free
4508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: frees all value_pairs in the list
4528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid rc_avpair_free (VALUE_PAIR *pair)
4568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *next;
4588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (pair != (VALUE_PAIR *) NULL)
4608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		next = pair->next;
4628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		free (pair);
4638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		pair = next;
4648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_fieldcpy
4698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Copy a data field from the buffer.  Advance the buffer
4718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          past the data field.
4728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void rc_fieldcpy (char *string, char **uptr)
4768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char           *ptr;
4788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	ptr = *uptr;
4808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (*ptr == '"')
4818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		ptr++;
4838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		while (*ptr != '"' && *ptr != '\0' && *ptr != '\n')
4848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
4858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			*string++ = *ptr++;
4868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
4878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*string = '\0';
4888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (*ptr == '"')
4898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
4908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			ptr++;
4918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
4928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*uptr = ptr;
4938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return;
4948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (*ptr != ' ' && *ptr != '\t' && *ptr != '\0' && *ptr != '\n' &&
4978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			*ptr != '=' && *ptr != ',')
4988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		*string++ = *ptr++;
5008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
5018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	*string = '\0';
5028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	*uptr = ptr;
5038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return;
5048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
5058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
5088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_parse
5098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
5108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: parses the buffer to extract the attribute-value pairs.
5118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
5128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: 0 = successful parse of attribute-value pair,
5138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	   -1 = syntax (or other) error detected.
5148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
5158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
5168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PARSE_MODE_NAME		0
5188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PARSE_MODE_EQUAL	1
5198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PARSE_MODE_VALUE	2
5208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define PARSE_MODE_INVALID	3
5218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_avpair_parse (char *buffer, VALUE_PAIR **first_pair)
5238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
5248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             mode;
5258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            attrstr[AUTH_ID_LEN];
5268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            valstr[AUTH_ID_LEN];
5278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_ATTR      *attr = NULL;
5288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_VALUE     *dval;
5298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *pair;
5308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR     *link;
5318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct tm      *tm;
5328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	time_t          timeval;
5338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	mode = PARSE_MODE_NAME;
5358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (*buffer != '\n' && *buffer != '\0')
5368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
5378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (*buffer == ' ' || *buffer == '\t')
5388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
5398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			buffer++;
5408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			continue;
5418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
5428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		switch (mode)
5448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
5458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    case PARSE_MODE_NAME:		/* Attribute Name */
5468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_fieldcpy (attrstr, &buffer);
5478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if ((attr =
5488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				rc_dict_findattr (attrstr)) == (DICT_ATTR *) NULL)
5498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
5508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_avpair_parse: unknown attribute");
5518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (*first_pair) {
5528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					rc_avpair_free(*first_pair);
5538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					*first_pair = (VALUE_PAIR *) NULL;
5548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
5558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return (-1);
5568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
5578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			mode = PARSE_MODE_EQUAL;
5588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
5598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    case PARSE_MODE_EQUAL:		/* Equal sign */
5618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (*buffer == '=')
5628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
5638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				mode = PARSE_MODE_VALUE;
5648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				buffer++;
5658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
5668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else
5678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
5688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_avpair_parse: missing or misplaced equal sign");
5698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (*first_pair) {
5708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					rc_avpair_free(*first_pair);
5718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					*first_pair = (VALUE_PAIR *) NULL;
5728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
5738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return (-1);
5748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
5758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
5768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    case PARSE_MODE_VALUE:		/* Value */
5788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_fieldcpy (valstr, &buffer);
5798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if ((pair =
5818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				(VALUE_PAIR *) malloc (sizeof (VALUE_PAIR)))
5828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							== (VALUE_PAIR *) NULL)
5838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
5848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				novm("rc_avpair_parse");
5858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (*first_pair) {
5868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					rc_avpair_free(*first_pair);
5878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					*first_pair = (VALUE_PAIR *) NULL;
5888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
5898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return (-1);
5908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
5918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strcpy (pair->name, attr->name);
5928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->attribute = attr->value;
5938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->type = attr->type;
5948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->vendorcode = attr->vendorcode;
5958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			switch (pair->type)
5978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
5988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
5998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_STRING:
6008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				strcpy (pair->strvalue, valstr);
6018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->lvalue = strlen(valstr);
6028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
6038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_INTEGER:
6058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (isdigit (*valstr))
6068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				{
6078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					pair->lvalue = atoi (valstr);
6088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
6098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				else
6108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				{
6118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					if ((dval = rc_dict_findval (valstr))
6128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							== (DICT_VALUE *) NULL)
6138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					{
6148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						error("rc_avpair_parse: unknown attribute value: %s", valstr);
6158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						if (*first_pair) {
6168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							rc_avpair_free(*first_pair);
6178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							*first_pair = (VALUE_PAIR *) NULL;
6188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						}
6198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						free (pair);
6208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						return (-1);
6218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					}
6228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					else
6238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					{
6248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project						pair->lvalue = dval->value;
6258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					}
6268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
6278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
6288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_IPADDR:
6308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->lvalue = rc_get_ipaddr(valstr);
6318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
6328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    case PW_TYPE_DATE:
6348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				timeval = time (0);
6358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				tm = localtime (&timeval);
6368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				tm->tm_hour = 0;
6378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				tm->tm_min = 0;
6388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				tm->tm_sec = 0;
6398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				rc_str2tm (valstr, tm);
6408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef TIMELOCAL
6418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->lvalue = (UINT4) timelocal (tm);
6428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else	/* TIMELOCAL */
6438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				pair->lvalue = (UINT4) mktime (tm);
6448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif	/* TIMELOCAL */
6458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
6468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    default:
6488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_avpair_parse: unknown attribute type %d", pair->type);
6498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (*first_pair) {
6508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					rc_avpair_free(*first_pair);
6518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					*first_pair = (VALUE_PAIR *) NULL;
6528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
6538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				free (pair);
6548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				return (-1);
6558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
6568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			pair->next = (VALUE_PAIR *) NULL;
6578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (*first_pair == (VALUE_PAIR *) NULL)
6598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
6608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				*first_pair = pair;
6618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
6628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else
6638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
6648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				link = *first_pair;
6658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				while (link->next != (VALUE_PAIR *) NULL)
6668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				{
6678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					link = link->next;
6688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				}
6698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				link->next = pair;
6708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
6718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			mode = PARSE_MODE_NAME;
6738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
6748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    default:
6768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			mode = PARSE_MODE_NAME;
6778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
6788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
6798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
6808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return (0);
6818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
6828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
6848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_tostr
6858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
6868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Translate an av_pair into two strings
6878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
6888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Returns: 0 on success, -1 on failure
6898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
6908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
6918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv)
6938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
6948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_VALUE     *dval;
6958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            buffer[32];
6968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct in_addr  inad;
6978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	unsigned char         *ptr;
6988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
6998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	*name = *value = '\0';
7008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!pair || pair->name[0] == '\0') {
7028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("rc_avpair_tostr: pair is NULL or empty");
7038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (-1);
7048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
7058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	strncpy(name, pair->name, (size_t) ln);
7078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	switch (pair->type)
7098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
7108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case PW_TYPE_STRING:
7118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		lv--;
7128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		ptr = (unsigned char *) pair->strvalue;
7138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		while (*ptr != '\0')
7148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
7158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (!(isprint (*ptr)))
7168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
7178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				sprintf (buffer, "\\%03o", *ptr);
7188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				strncat(value, buffer, (size_t) lv);
7198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				lv -= 4;
7208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (lv < 0) break;
7218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
7228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else
7238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
7248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				strncat(value, ptr, 1);
7258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				lv--;
7268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				if (lv < 0) break;
7278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
7288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			ptr++;
7298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
7308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
7318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case PW_TYPE_INTEGER:
7338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		dval = rc_dict_getval (pair->lvalue, pair->name);
7348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (dval != (DICT_VALUE *) NULL)
7358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
7368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strncpy(value, dval->name, (size_t) lv-1);
7378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
7388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else
7398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
7408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			sprintf (buffer, "%ld", pair->lvalue);
7418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strncpy(value, buffer, (size_t) lv);
7428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
7438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
7448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case PW_TYPE_IPADDR:
7468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		inad.s_addr = htonl(pair->lvalue);
7478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		strncpy (value, inet_ntoa (inad), (size_t) lv-1);
7488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
7498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    case PW_TYPE_DATE:
7518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		strftime (buffer, sizeof (buffer), "%m/%d/%y %H:%M:%S",
7528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			  gmtime ((time_t *) & pair->lvalue));
7538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		strncpy(value, buffer, lv-1);
7548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
7558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    default:
7578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error("rc_avpair_tostr: unknown attribute type %d", pair->type);
7588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (-1);
7598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		break;
7608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
7618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return 0;
7638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
7648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
7668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_avpair_readin
7678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
7688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: get a sequence of attribute value pairs from the file input
7698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    and make them into a list of value_pairs
7708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
7718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
7728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVALUE_PAIR *rc_avpair_readin(FILE *input)
7748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
7758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VALUE_PAIR *vp = NULL;
7768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char buffer[1024], *q;
7778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (fgets(buffer, sizeof(buffer), input) != NULL)
7798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
7808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		q = buffer;
7818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		while(*q && isspace(*q)) q++;
7838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((*q == '\n') || (*q == '#') || (*q == '\0'))
7858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			continue;
7868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (rc_avpair_parse(q, &vp) < 0) {
7888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_avpair_readin: malformed attribute: %s", buffer);
7898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			rc_avpair_free(vp);
7908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return NULL;
7918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
7928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
7938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
7948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return vp;
7958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
796