18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * $Id: dict.c,v 1.1 2004/11/14 07:26:26 paulus Exp $ 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 2002 Roaring Penguin Software Inc. 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 1995,1996,1997 Lars Fenneberg 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 1992 Livingston Enterprises, Inc. 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and Merit Network, Inc. All Rights Reserved 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * See the file COPYRIGHT for the respective terms and conditions. 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If the file is missing contact me at lf@elemental.net 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and I'll send you a copy. 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <includes.h> 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <radiusclient.h> 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic DICT_ATTR *dictionary_attributes = NULL; 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic DICT_VALUE *dictionary_values = NULL; 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic VENDOR_DICT *vendor_dictionaries = NULL; 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_read_dictionary 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Initialize the dictionary. Read all ATTRIBUTES into 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the dictionary_attributes list. Read all VALUES into 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the dictionary_values list. Construct VENDOR dictionaries 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * as required. 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_read_dictionary (char *filename) 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project FILE *dictfd; 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char dummystr[AUTH_ID_LEN]; 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char namestr[AUTH_ID_LEN]; 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char valstr[AUTH_ID_LEN]; 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char attrstr[AUTH_ID_LEN]; 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char typestr[AUTH_ID_LEN]; 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char vendorstr[AUTH_ID_LEN]; 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int line_no; 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project DICT_ATTR *attr; 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project DICT_VALUE *dval; 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project VENDOR_DICT *vdict; 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char buffer[256]; 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int value; 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int type; 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int n; 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int retcode; 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((dictfd = fopen (filename, "r")) == (FILE *) NULL) 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error( "rc_read_dictionary: couldn't open dictionary %s: %s", 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project filename, strerror(errno)); 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (-1); 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no = 0; 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = 0; 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (fgets (buffer, sizeof (buffer), dictfd) != (char *) NULL) 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no++; 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Skip empty space */ 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (*buffer == '#' || *buffer == '\0' || *buffer == '\n') 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strncmp (buffer, "VENDOR", 6) == 0) { 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Read the VENDOR line */ 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sscanf(buffer, "%s%s%d", dummystr, namestr, &value) != 3) { 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid vendor on line %d of dictionary %s", 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Validate entry */ 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strlen (namestr) > NAME_LENGTH) { 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid name length on line %d of dictionary %s", 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Create new vendor entry */ 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict = (VENDOR_DICT *) malloc (sizeof (VENDOR_DICT)); 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!vdict) { 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("rc_read_dictionary"); 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy(vdict->vendorname, namestr); 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict->vendorcode = value; 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict->attributes = NULL; 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict->next = vendor_dictionaries; 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vendor_dictionaries = vdict; 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (strncmp (buffer, "ATTRIBUTE", 9) == 0) 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Read the ATTRIBUTE line. It is one of: 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * ATTRIBUTE attr_name attr_val type OR 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * ATTRIBUTE attr_name attr_val type vendor */ 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vendorstr[0] = 0; 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project n = sscanf(buffer, "%s%s%s%s%s", dummystr, namestr, valstr, typestr, vendorstr); 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (n != 4 && n != 5) 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid attribute on line %d of dictionary %s", 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Validate all entries 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strlen (namestr) > NAME_LENGTH) 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid name length on line %d of dictionary %s", 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strlen (vendorstr) > NAME_LENGTH) 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid name length on line %d of dictionary %s", 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!isdigit (*valstr)) 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid value on line %d of dictionary %s", 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = atoi (valstr); 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strcmp (typestr, "string") == 0) 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project type = PW_TYPE_STRING; 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (strcmp (typestr, "integer") == 0) 1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project type = PW_TYPE_INTEGER; 1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (strcmp (typestr, "ipaddr") == 0) 1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project type = PW_TYPE_IPADDR; 1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (strcmp (typestr, "date") == 0) 1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project type = PW_TYPE_DATE; 1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else 1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid type on line %d of dictionary %s", 1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Search for vendor if supplied */ 1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (*vendorstr) { 1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict = rc_dict_findvendor(vendorstr); 1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!vdict) { 1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: unknown vendor on line %d of dictionary %s", 1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict = NULL; 1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Create a new attribute for the list */ 1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((attr = 1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (DICT_ATTR *) malloc (sizeof (DICT_ATTR))) 1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project == (DICT_ATTR *) NULL) 1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("rc_read_dictionary"); 1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy (attr->name, namestr); 1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (vdict) { 1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr->vendorcode = vdict->vendorcode; 1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr->vendorcode = VENDOR_NONE; 1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr->value = value; 1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr->type = type; 1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Insert it into the list */ 2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (vdict) { 2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr->next = vdict->attributes; 2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vdict->attributes = attr; 2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr->next = dictionary_attributes; 2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dictionary_attributes = attr; 2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (strncmp (buffer, "VALUE", 5) == 0) 2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Read the VALUE line */ 2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sscanf (buffer, "%s%s%s%s", dummystr, attrstr, 2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project namestr, valstr) != 4) 2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid value entry on line %d of dictionary %s", 2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Validate all entries 2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strlen (attrstr) > NAME_LENGTH) 2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid attribute length on line %d of dictionary %s", 2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strlen (namestr) > NAME_LENGTH) 2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid name length on line %d of dictionary %s", 2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!isdigit (*valstr)) 2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid value on line %d of dictionary %s", 2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = atoi (valstr); 2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Create a new VALUE entry for the list */ 2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((dval = 2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (DICT_VALUE *) malloc (sizeof (DICT_VALUE))) 2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project == (DICT_VALUE *) NULL) 2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("rc_read_dictionary"); 2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy (dval->attrname, attrstr); 2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy (dval->name, namestr); 2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dval->value = value; 2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Insert it into the list */ 2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dval->next = dictionary_values; 2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dictionary_values = dval; 2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (strncmp (buffer, "INCLUDE", 7) == 0) 2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Read the INCLUDE line */ 2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sscanf (buffer, "%s%s", dummystr, namestr) != 2) 2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("rc_read_dictionary: invalid include entry on line %d of dictionary %s", 2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project line_no, filename); 2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (rc_read_dictionary(namestr) == -1) 2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project retcode = -1; 2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fclose (dictfd); 2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return retcode; 2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_getattr 2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full attribute structure based on the 2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * attribute id number and vendor code. If vendor code is VENDOR_NONE, 2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * non-vendor-specific attributes are used 2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_ATTR *rc_dict_getattr (int attribute, int vendor) 2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project DICT_ATTR *attr; 2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project VENDOR_DICT *dict; 2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (vendor == VENDOR_NONE) { 3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = dictionary_attributes; 3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (attr != (DICT_ATTR *) NULL) { 3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (attr->value == attribute) { 3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (attr); 3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = attr->next; 3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = rc_dict_getvendor(vendor); 3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!dict) { 3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return NULL; 3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = dict->attributes; 3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (attr) { 3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (attr->value == attribute) { 3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return attr; 3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = attr->next; 3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return NULL; 3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_findattr 3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full attribute structure based on the 3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * attribute name. 3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_ATTR *rc_dict_findattr (char *attrname) 3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project DICT_ATTR *attr; 3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project VENDOR_DICT *dict; 3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = dictionary_attributes; 3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (attr != (DICT_ATTR *) NULL) 3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strcasecmp (attr->name, attrname) == 0) 3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (attr); 3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = attr->next; 3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Search vendor-specific dictionaries */ 3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = vendor_dictionaries; 3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (dict) { 3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = dict->attributes; 3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (attr) { 3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strcasecmp (attr->name, attrname) == 0) { 3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (attr); 3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project attr = attr->next; 3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = dict->next; 3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ((DICT_ATTR *) NULL); 3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_findval 3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full value structure based on the 3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * value name. 3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_VALUE *rc_dict_findval (char *valname) 3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project DICT_VALUE *val; 3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project val = dictionary_values; 3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (val != (DICT_VALUE *) NULL) 3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strcasecmp (val->name, valname) == 0) 3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (val); 3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project val = val->next; 3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ((DICT_VALUE *) NULL); 3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: dict_getval 3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full value structure based on the 3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * actual value and the associated attribute name. 3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_VALUE * rc_dict_getval (UINT4 value, char *attrname) 3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project DICT_VALUE *val; 3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project val = dictionary_values; 4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (val != (DICT_VALUE *) NULL) 4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strcmp (val->attrname, attrname) == 0 && 4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project val->value == value) 4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { 4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (val); 4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project val = val->next; 4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ((DICT_VALUE *) NULL); 4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_findvendor 4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the vendor's dictionary given the vendor name. 4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVENDOR_DICT * rc_dict_findvendor (char *vendorname) 4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project VENDOR_DICT *dict; 4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = vendor_dictionaries; 4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (dict) { 4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!strcmp(vendorname, dict->vendorname)) { 4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return dict; 4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = dict->next; 4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return NULL; 4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_getvendor 4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the vendor's dictionary given the vendor ID 4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVENDOR_DICT * rc_dict_getvendor (int id) 4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project VENDOR_DICT *dict; 4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = vendor_dictionaries; 4438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (dict) { 4448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (id == dict->vendorcode) { 4458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return dict; 4468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dict = dict->next; 4488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return NULL; 4508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 451