1ed5d5720SPeter Avalos %{ 2ed5d5720SPeter Avalos /* $NetBSD: nsparser.y,v 1.3 1999/01/25 00:16:18 lukem Exp $ */ 3ed5d5720SPeter Avalos 4ed5d5720SPeter Avalos /*- 5ed5d5720SPeter Avalos * Copyright (c) 1997, 1998, 1999 The NetBSD Foundation, Inc. 6ed5d5720SPeter Avalos * All rights reserved. 7ed5d5720SPeter Avalos * 8ed5d5720SPeter Avalos * This code is derived from software contributed to The NetBSD Foundation 9ed5d5720SPeter Avalos * by Luke Mewburn. 10ed5d5720SPeter Avalos * 11ed5d5720SPeter Avalos * Redistribution and use in source and binary forms, with or without 12ed5d5720SPeter Avalos * modification, are permitted provided that the following conditions 13ed5d5720SPeter Avalos * are met: 14ed5d5720SPeter Avalos * 1. Redistributions of source code must retain the above copyright 15ed5d5720SPeter Avalos * notice, this list of conditions and the following disclaimer. 16ed5d5720SPeter Avalos * 2. Redistributions in binary form must reproduce the above copyright 17ed5d5720SPeter Avalos * notice, this list of conditions and the following disclaimer in the 18ed5d5720SPeter Avalos * documentation and/or other materials provided with the distribution. 19ed5d5720SPeter Avalos * 3. All advertising materials mentioning features or use of this software 20ed5d5720SPeter Avalos * must display the following acknowledgement: 21ed5d5720SPeter Avalos * This product includes software developed by the NetBSD 22ed5d5720SPeter Avalos * Foundation, Inc. and its contributors. 23ed5d5720SPeter Avalos * 4. Neither the name of The NetBSD Foundation nor the names of its 24ed5d5720SPeter Avalos * contributors may be used to endorse or promote products derived 25ed5d5720SPeter Avalos * from this software without specific prior written permission. 26ed5d5720SPeter Avalos * 27ed5d5720SPeter Avalos * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28ed5d5720SPeter Avalos * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29ed5d5720SPeter Avalos * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30ed5d5720SPeter Avalos * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31ed5d5720SPeter Avalos * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32ed5d5720SPeter Avalos * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33ed5d5720SPeter Avalos * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34ed5d5720SPeter Avalos * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35ed5d5720SPeter Avalos * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36ed5d5720SPeter Avalos * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37ed5d5720SPeter Avalos * POSSIBILITY OF SUCH DAMAGE. 38ed5d5720SPeter Avalos * 39ed5d5720SPeter Avalos * $FreeBSD: src/lib/libc/net/nsparser.y,v 1.6 2007/05/17 03:33:23 jon Exp $ 40ed5d5720SPeter Avalos */ 41ed5d5720SPeter Avalos 42ed5d5720SPeter Avalos #include "namespace.h" 43ed5d5720SPeter Avalos #define _NS_PRIVATE 44ed5d5720SPeter Avalos #include <nsswitch.h> 45ed5d5720SPeter Avalos #include <stdio.h> 46*e3b4bb34SSascha Wildner #include <stdlib.h> 47ed5d5720SPeter Avalos #include <string.h> 48ed5d5720SPeter Avalos #include <syslog.h> 49ed5d5720SPeter Avalos #include "un-namespace.h" 50ed5d5720SPeter Avalos 51ed5d5720SPeter Avalos static void _nsaddsrctomap(const char *); 52ed5d5720SPeter Avalos 53ed5d5720SPeter Avalos static ns_dbt curdbt; 54ed5d5720SPeter Avalos static ns_src cursrc; 55ed5d5720SPeter Avalos %} 56ed5d5720SPeter Avalos 57ed5d5720SPeter Avalos %union { 58ed5d5720SPeter Avalos char *str; 59ed5d5720SPeter Avalos int mapval; 60ed5d5720SPeter Avalos } 61ed5d5720SPeter Avalos 62ed5d5720SPeter Avalos %token NL 63ed5d5720SPeter Avalos %token SUCCESS UNAVAIL NOTFOUND TRYAGAIN 64ed5d5720SPeter Avalos %token RETURN CONTINUE 65ed5d5720SPeter Avalos %token ERRORTOKEN 66ed5d5720SPeter Avalos %token <str> STRING 67ed5d5720SPeter Avalos 68ed5d5720SPeter Avalos %type <mapval> Status Action 69ed5d5720SPeter Avalos 70ed5d5720SPeter Avalos %% 71ed5d5720SPeter Avalos 72ed5d5720SPeter Avalos File 73ed5d5720SPeter Avalos : /* empty */ 74ed5d5720SPeter Avalos | Lines 75ed5d5720SPeter Avalos ; 76ed5d5720SPeter Avalos 77ed5d5720SPeter Avalos Lines 78ed5d5720SPeter Avalos : Entry 79ed5d5720SPeter Avalos | Lines Entry 80ed5d5720SPeter Avalos ; 81ed5d5720SPeter Avalos 82ed5d5720SPeter Avalos Entry 83ed5d5720SPeter Avalos : NL 84ed5d5720SPeter Avalos | Database ':' NL 85ed5d5720SPeter Avalos { 86ed5d5720SPeter Avalos free((char*)curdbt.name); 87ed5d5720SPeter Avalos } 88ed5d5720SPeter Avalos | Database ':' Srclist NL 89ed5d5720SPeter Avalos { 90ed5d5720SPeter Avalos _nsdbtput(&curdbt); 91ed5d5720SPeter Avalos } 92ed5d5720SPeter Avalos | error NL 93ed5d5720SPeter Avalos { 94ed5d5720SPeter Avalos yyerrok; 95ed5d5720SPeter Avalos } 96ed5d5720SPeter Avalos ; 97ed5d5720SPeter Avalos 98ed5d5720SPeter Avalos Database 99ed5d5720SPeter Avalos : STRING 100ed5d5720SPeter Avalos { 101ed5d5720SPeter Avalos curdbt.name = yylval.str; 102ed5d5720SPeter Avalos curdbt.srclist = NULL; 103ed5d5720SPeter Avalos curdbt.srclistsize = 0; 104ed5d5720SPeter Avalos } 105ed5d5720SPeter Avalos ; 106ed5d5720SPeter Avalos 107ed5d5720SPeter Avalos Srclist 108ed5d5720SPeter Avalos : Item 109ed5d5720SPeter Avalos | Srclist Item 110ed5d5720SPeter Avalos ; 111ed5d5720SPeter Avalos 112ed5d5720SPeter Avalos Item 113ed5d5720SPeter Avalos : STRING 114ed5d5720SPeter Avalos { 115ed5d5720SPeter Avalos cursrc.flags = NS_TERMINATE; 116ed5d5720SPeter Avalos _nsaddsrctomap($1); 117ed5d5720SPeter Avalos } 118ed5d5720SPeter Avalos | STRING '[' { cursrc.flags = NS_SUCCESS; } Criteria ']' 119ed5d5720SPeter Avalos { 120ed5d5720SPeter Avalos _nsaddsrctomap($1); 121ed5d5720SPeter Avalos } 122ed5d5720SPeter Avalos ; 123ed5d5720SPeter Avalos 124ed5d5720SPeter Avalos Criteria 125ed5d5720SPeter Avalos : Criterion 126ed5d5720SPeter Avalos | Criteria Criterion 127ed5d5720SPeter Avalos ; 128ed5d5720SPeter Avalos 129ed5d5720SPeter Avalos Criterion 130ed5d5720SPeter Avalos : Status '=' Action 131ed5d5720SPeter Avalos { 132ed5d5720SPeter Avalos if ($3) /* if action == RETURN set RETURN bit */ 133ed5d5720SPeter Avalos cursrc.flags |= $1; 134ed5d5720SPeter Avalos else /* else unset it */ 135ed5d5720SPeter Avalos cursrc.flags &= ~$1; 136ed5d5720SPeter Avalos } 137ed5d5720SPeter Avalos ; 138ed5d5720SPeter Avalos 139ed5d5720SPeter Avalos Status 140ed5d5720SPeter Avalos : SUCCESS { $$ = NS_SUCCESS; } 141ed5d5720SPeter Avalos | UNAVAIL { $$ = NS_UNAVAIL; } 142ed5d5720SPeter Avalos | NOTFOUND { $$ = NS_NOTFOUND; } 143ed5d5720SPeter Avalos | TRYAGAIN { $$ = NS_TRYAGAIN; } 144ed5d5720SPeter Avalos ; 145ed5d5720SPeter Avalos 146ed5d5720SPeter Avalos Action 147ed5d5720SPeter Avalos : RETURN { $$ = NS_ACTION_RETURN; } 148ed5d5720SPeter Avalos | CONTINUE { $$ = NS_ACTION_CONTINUE; } 149ed5d5720SPeter Avalos ; 150ed5d5720SPeter Avalos 151ed5d5720SPeter Avalos %% 152ed5d5720SPeter Avalos 153ed5d5720SPeter Avalos static void 154ed5d5720SPeter Avalos _nsaddsrctomap(const char *elem) 155ed5d5720SPeter Avalos { 156ed5d5720SPeter Avalos int i, lineno; 157ed5d5720SPeter Avalos extern int _nsyylineno; 158ed5d5720SPeter Avalos extern char * _nsyytext; 159ed5d5720SPeter Avalos 160ed5d5720SPeter Avalos lineno = _nsyylineno - (*_nsyytext == '\n' ? 1 : 0); 161ed5d5720SPeter Avalos if (curdbt.srclistsize > 0) { 162ed5d5720SPeter Avalos if (((strcasecmp(elem, NSSRC_COMPAT) == 0) && 163ed5d5720SPeter Avalos (strcasecmp(curdbt.srclist[0].name, NSSRC_CACHE) != 0)) || 164ed5d5720SPeter Avalos (strcasecmp(curdbt.srclist[0].name, NSSRC_COMPAT) == 0)) { 165ed5d5720SPeter Avalos syslog(LOG_ERR, 166ed5d5720SPeter Avalos "NSSWITCH(nsparser): %s line %d: 'compat' used with sources, other than 'cache'", 167ed5d5720SPeter Avalos _PATH_NS_CONF, lineno); 168ed5d5720SPeter Avalos free((void*)elem); 169ed5d5720SPeter Avalos return; 170ed5d5720SPeter Avalos } 171ed5d5720SPeter Avalos } 172ed5d5720SPeter Avalos for (i = 0; i < curdbt.srclistsize; i++) { 173ed5d5720SPeter Avalos if (strcasecmp(curdbt.srclist[i].name, elem) == 0) { 174ed5d5720SPeter Avalos syslog(LOG_ERR, 175ed5d5720SPeter Avalos "NSSWITCH(nsparser): %s line %d: duplicate source '%s'", 176ed5d5720SPeter Avalos _PATH_NS_CONF, lineno, elem); 177ed5d5720SPeter Avalos free((void*)elem); 178ed5d5720SPeter Avalos return; 179ed5d5720SPeter Avalos } 180ed5d5720SPeter Avalos } 181ed5d5720SPeter Avalos cursrc.name = elem; 182ed5d5720SPeter Avalos _nsdbtaddsrc(&curdbt, &cursrc); 183ed5d5720SPeter Avalos } 184