11.2Slukem%{ 21.12Smatt/* $NetBSD: nsparser.y,v 1.12 2012/03/20 17:44:18 matt Exp $ */ 31.2Slukem 41.2Slukem/*- 51.2Slukem * Copyright (c) 1997, 1998, 1999 The NetBSD Foundation, Inc. 61.2Slukem * All rights reserved. 71.2Slukem * 81.2Slukem * This code is derived from software contributed to The NetBSD Foundation 91.2Slukem * by Luke Mewburn. 101.2Slukem * 111.2Slukem * Redistribution and use in source and binary forms, with or without 121.2Slukem * modification, are permitted provided that the following conditions 131.2Slukem * are met: 141.2Slukem * 1. Redistributions of source code must retain the above copyright 151.2Slukem * notice, this list of conditions and the following disclaimer. 161.2Slukem * 2. Redistributions in binary form must reproduce the above copyright 171.2Slukem * notice, this list of conditions and the following disclaimer in the 181.2Slukem * documentation and/or other materials provided with the distribution. 191.2Slukem * 201.2Slukem * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 211.2Slukem * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 221.2Slukem * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 231.2Slukem * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 241.2Slukem * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 251.2Slukem * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 261.2Slukem * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 271.2Slukem * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 281.2Slukem * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 291.2Slukem * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 301.2Slukem * POSSIBILITY OF SUCH DAMAGE. 311.2Slukem */ 321.2Slukem 331.3Slukem#include <sys/cdefs.h> 341.3Slukem#if defined(LIBC_SCCS) && !defined(lint) 351.12Smatt__RCSID("$NetBSD: nsparser.y,v 1.12 2012/03/20 17:44:18 matt Exp $"); 361.3Slukem#endif /* LIBC_SCCS and not lint */ 371.3Slukem 381.4Skleink#include "namespace.h" 391.5Slukem 401.5Slukem#include <assert.h> 411.2Slukem#define _NS_PRIVATE 421.2Slukem#include <nsswitch.h> 431.2Slukem#include <stdio.h> 441.2Slukem#include <string.h> 451.9Slukem#include <syslog.h> 461.2Slukem 471.2Slukem 481.12Smattstatic void _nsaddsrctomap(const char *); 491.2Slukem 501.2Slukemstatic ns_dbt curdbt; 511.2Slukemstatic ns_src cursrc; 521.6Slukem 531.6Slukemextern char * _nsyytext; 541.7Schristosextern int _nsyylineno; 551.2Slukem%} 561.2Slukem 571.2Slukem%union { 581.2Slukem char *str; 591.2Slukem int mapval; 601.2Slukem} 611.2Slukem 621.2Slukem%token NL 631.2Slukem%token SUCCESS UNAVAIL NOTFOUND TRYAGAIN 641.2Slukem%token RETURN CONTINUE 651.2Slukem%token <str> STRING 661.2Slukem 671.2Slukem%type <mapval> Status Action 681.2Slukem 691.2Slukem%% 701.2Slukem 711.2SlukemFile 721.2Slukem : /* empty */ 731.2Slukem | Lines 741.2Slukem ; 751.2Slukem 761.2SlukemLines 771.2Slukem : Entry 781.2Slukem | Lines Entry 791.2Slukem ; 801.2Slukem 811.2SlukemEntry 821.2Slukem : NL 831.2Slukem | Database ':' NL 841.2Slukem | Database ':' Srclist NL 851.2Slukem { 861.6Slukem int lineno; 871.6Slukem 881.6Slukem lineno = _nsyylineno - (*_nsyytext == '\n' ? 1 : 0); 891.6Slukem if (_nsdbtput(&curdbt) == -1) 901.9Slukem syslog(LOG_WARNING, 911.9Slukem "libc nsdispatch: %s line %d: %s", 921.9Slukem _PATH_NS_CONF, lineno, 931.9Slukem "error adding entry"); 941.8Slukem } 951.8Slukem | error NL 961.8Slukem { 971.8Slukem yyerrok; 981.2Slukem } 991.2Slukem ; 1001.2Slukem 1011.2SlukemDatabase 1021.2Slukem : STRING 1031.2Slukem { 1041.2Slukem curdbt.name = yylval.str; 1051.2Slukem curdbt.srclist = NULL; 1061.2Slukem curdbt.srclistsize = 0; 1071.2Slukem } 1081.2Slukem ; 1091.2Slukem 1101.2SlukemSrclist 1111.2Slukem : Item 1121.2Slukem | Srclist Item 1131.2Slukem ; 1141.2Slukem 1151.2SlukemItem 1161.2Slukem : STRING 1171.2Slukem { 1181.2Slukem cursrc.flags = NS_SUCCESS; 1191.2Slukem _nsaddsrctomap($1); 1201.2Slukem } 1211.2Slukem | STRING '[' { cursrc.flags = NS_SUCCESS; } Criteria ']' 1221.2Slukem { 1231.2Slukem _nsaddsrctomap($1); 1241.2Slukem } 1251.2Slukem ; 1261.2Slukem 1271.2SlukemCriteria 1281.2Slukem : Criterion 1291.2Slukem | Criteria Criterion 1301.2Slukem ; 1311.2Slukem 1321.2SlukemCriterion 1331.2Slukem : Status '=' Action 1341.2Slukem { 1351.2Slukem if ($3) /* if action == RETURN set RETURN bit */ 1361.2Slukem cursrc.flags |= $1; 1371.2Slukem else /* else unset it */ 1381.2Slukem cursrc.flags &= ~$1; 1391.2Slukem } 1401.2Slukem ; 1411.2Slukem 1421.2SlukemStatus 1431.2Slukem : SUCCESS { $$ = NS_SUCCESS; } 1441.2Slukem | UNAVAIL { $$ = NS_UNAVAIL; } 1451.2Slukem | NOTFOUND { $$ = NS_NOTFOUND; } 1461.2Slukem | TRYAGAIN { $$ = NS_TRYAGAIN; } 1471.2Slukem ; 1481.2Slukem 1491.2SlukemAction 1501.2Slukem : RETURN { $$ = 1L; } 1511.2Slukem | CONTINUE { $$ = 0L; } 1521.2Slukem ; 1531.2Slukem 1541.2Slukem%% 1551.2Slukem 1561.2Slukemstatic void 1571.12Smatt_nsaddsrctomap(const char *elem) 1581.2Slukem{ 1591.11Slukem unsigned int i; 1601.11Slukem int lineno; 1611.5Slukem 1621.5Slukem _DIAGASSERT(elem != NULL); 1631.2Slukem 1641.2Slukem lineno = _nsyylineno - (*_nsyytext == '\n' ? 1 : 0); 1651.2Slukem if (curdbt.srclistsize > 0) { 1661.2Slukem if ((strcasecmp(elem, NSSRC_COMPAT) == 0) || 1671.2Slukem (strcasecmp(curdbt.srclist[0].name, NSSRC_COMPAT) == 0)) { 1681.9Slukem syslog(LOG_WARNING, 1691.9Slukem "libc nsdispatch: %s line %d: %s", 1701.9Slukem _PATH_NS_CONF, lineno, 1711.9Slukem "'compat' used with other sources"); 1721.2Slukem return; 1731.2Slukem } 1741.2Slukem } 1751.2Slukem for (i = 0; i < curdbt.srclistsize; i++) { 1761.2Slukem if (strcasecmp(curdbt.srclist[i].name, elem) == 0) { 1771.9Slukem syslog(LOG_WARNING, 1781.9Slukem "libc nsdispatch: %s line %d: %s '%s'", 1791.9Slukem _PATH_NS_CONF, lineno, 1801.9Slukem "duplicate source", elem); 1811.2Slukem return; 1821.2Slukem } 1831.2Slukem } 1841.2Slukem cursrc.name = elem; 1851.6Slukem if (_nsdbtaddsrc(&curdbt, &cursrc) == -1) { 1861.9Slukem syslog(LOG_WARNING, 1871.9Slukem "libc nsdispatch: %s line %d: %s '%s'", 1881.9Slukem _PATH_NS_CONF, lineno, 1891.9Slukem "error adding", elem); 1901.6Slukem } 1911.2Slukem} 192