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