ncparse.c revision c52235e52ee12e4d15f808ac06608584257f6479
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/*****************************************************************
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** @(#) ncparse.c -- A very simple named.conf parser
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** Copyright (c) Apr 2005 - Nov 2007, Holger Zuleger HZnet. All rights reserved.
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** This software is open source.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen** Redistribution and use in source and binary forms, with or without
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** modification, are permitted provided that the following conditions
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen** are met:
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen**
e4fb5bfcdff32d337d054cce36e00e1cdfaae9f8Timo Sirainen** Redistributions of source code must retain the above copyright notice,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** this list of conditions and the following disclaimer.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** Redistributions in binary form must reproduce the above copyright notice,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** this list of conditions and the following disclaimer in the documentation
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** and/or other materials provided with the distribution.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** Neither the name of Holger Zuleger HZnet nor the names of its contributors may
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** be used to endorse or promote products derived from this software without
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen** specific prior written permission.
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen**
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** POSSIBILITY OF SUCH DAMAGE.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen*****************************************************************/
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# include <stdio.h>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# include <string.h>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# include <ctype.h>
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen# include <assert.h>
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen# include "debug.h"
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen# include "misc.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# include "log.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define extern
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen# include "ncparse.h"
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen#undef extern
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_STRING 257
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_DIR 258
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_INCLUDE 259
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_ZONE 260
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_TYPE 261
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_MASTER 262
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_SLAVE 263
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_STUB 264
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_HINT 265
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_FORWARD 266
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_DELEGATION 267
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_VIEW 268
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_FILE 270
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# define TOK_UNKNOWN 511
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* list of "named.conf" keywords we are interested in */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct KeyWords {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *name;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen int tok;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen} kw[] = {
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen { "STRING", TOK_STRING },
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen { "include", TOK_INCLUDE },
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen { "directory", TOK_DIR },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "file", TOK_FILE },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "zone", TOK_ZONE },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#if 0 /* we don't need the type keyword; master, slave etc. is sufficient */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "type", TOK_TYPE },
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen#endif
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "master", TOK_MASTER },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "slave", TOK_SLAVE },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "stub", TOK_STUB },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "hint", TOK_HINT },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "forward", TOK_FORWARD },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "delegation-only", TOK_DELEGATION },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "view", TOK_VIEW },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { NULL, TOK_UNKNOWN },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
d482b35af87f5fd872bad007da0475813a401a49Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#ifdef DBG
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic const char *tok2str (int tok)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i = 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( kw[i].name && kw[i].tok != tok )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i++;
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen return kw[i].name;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen#endif
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int searchkw (const char *keyword)
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen{
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val ("ncparse: searchkw (%s)\n", keyword);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen i = 0;
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen while ( kw[i].name && strcmp (kw[i].name, keyword) != 0 )
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen i++;
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return kw[i].tok;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int gettok (FILE *fp, char *val, size_t valsize)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen int lastc;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int c;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char buf[255+1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *p;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *bufend;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *val = '\0';
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen do {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && isspace (c) )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( c == '#' ) /* single line comment ? */
659fe5d24825b160cae512538088020d97a60239Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && c != '\n' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen continue;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( c == EOF )
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen return EOF;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( c == '{' || c == '}' || c == ';' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen continue;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( c == '/' ) /* begin of C comment ? */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( (c = getc (fp)) == '*' ) /* yes! */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen lastc = EOF; /* read until end of c comment */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && !(lastc == '*' && c == '/') )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen lastc = c;
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen }
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen else if ( c == '/' ) /* is it a C single line comment ? */
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen {
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen while ( (c = getc (fp)) != EOF && c != '\n' )
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen ;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else /* no ! */
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen ungetc (c, fp);
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen continue;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( c == '\"' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen p = val;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bufend = val + valsize - 1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && p < bufend && c != '\"' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *p++ = c;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *p = '\0';
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* if string buffer is too small, eat up rest of string */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( c != EOF && c != '\"' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen c = getc (fp);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return TOK_STRING;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen p = buf;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bufend = buf + sizeof (buf) - 1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen do
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *p++ = tolower (c);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && p < bufend && (isalpha (c) || c == '-') );
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *p = '\0';
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ungetc (c, fp);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( (c = searchkw (buf)) != TOK_UNKNOWN )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return c;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } while ( c != EOF );
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return EOF;
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen}
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen/*****************************************************************
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen**
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen** parse_namedconf (const char *filename, chroot_dir, dir, dirsize, int (*func) ())
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** Very dumb named.conf parser.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** - In a zone declaration the _first_ keyword MUST be "type"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** - For every master zone "func (directory, zone, filename)" will be called
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen**
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen*****************************************************************/
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint parse_namedconf (const char *filename, const char *chroot_dir, char *dir, size_t dirsize, int (*func) ())
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen FILE *fp;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int tok;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char path[511+1];
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen#if 1 /* this is potentialy too small for key data, but we don't need the keys... */
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen char strval[255+1];
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen#else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char strval[4095+1];
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen#endif
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen char view[255+1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char zone[255+1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char zonefile[255+1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val ("parse_namedconf: parsing file \"%s\" \n", filename);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen assert (filename != NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen assert (dir != NULL && dirsize != 0);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen assert (func != NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen view[0] = '\0';
88553367d677170a4b703b9d52aac9eabf91c656Timo Sirainen if ( (fp = fopen (filename, "r")) == NULL )
757726d9acbd04cf0d0d4be8ce14e11525476a0bTimo Sirainen return 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (tok = gettok (fp, strval, sizeof strval)) != EOF )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen if ( tok > 0 && tok < 256 )
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen {
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen error ("parse_namedconf: token found with value %-10d: %c\n", tok, tok);
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen lg_mesg (LG_ERROR, "parse_namedconf: token found with value %-10d: %c", tok, tok);
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen }
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen else if ( tok == TOK_DIR )
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) == TOK_STRING )
685393de106e55b61f754d420e378d05bd462ebbTimo Sirainen {
87712707722ef7d73acb065546e61afa4455cd9eTimo Sirainen dbg_val2 ("parse_namedconf: directory found \"%s\" (dir is %s)\n",
b35f7104715edee0cfac6d46ab0b342033867eb7Timo Sirainen strval, dir);
b35f7104715edee0cfac6d46ab0b342033867eb7Timo Sirainen if ( *strval != '/' && *dir )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (path, sizeof (path), "%s/%s", dir, strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (path, sizeof (path), "%s", strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* prepend chroot directory (do it only once) */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( chroot_dir && *chroot_dir )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (dir, dirsize, "%s%s%s", chroot_dir, *path == '/' ? "": "/", path);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen chroot_dir = NULL;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (dir, dirsize, "%s", path);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val ("parse_namedconf: new dir \"%s\" \n", dir);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else if ( tok == TOK_INCLUDE )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) == TOK_STRING )
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen if ( *strval != '/' && *dir )
b5ea11802f2bafbec06282a7b3b6704dc5fae584Timo Sirainen snprintf (path, sizeof (path), "%s/%s", dir, strval);
b5ea11802f2bafbec06282a7b3b6704dc5fae584Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (path, sizeof (path), "%s", strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( !parse_namedconf (path, chroot_dir, dir, dirsize, func) )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return 0;
b5ea11802f2bafbec06282a7b3b6704dc5fae584Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen error ("parse_namedconf: need a filename after \"include\"!\n");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen lg_mesg (LG_ERROR, "parse_namedconf: need a filename after \"include\"!");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else if ( tok == TOK_VIEW )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_STRING )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen continue;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (view, sizeof view, "%s", strval); /* store the name of the view */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else if ( tok == TOK_ZONE )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_STRING )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen continue;
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen snprintf (zone, sizeof zone, "%s", strval); /* store the name of the zone */
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_MASTER )
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen continue;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_FILE )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen continue;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_STRING )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen continue;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (zonefile, sizeof zonefile, "%s", strval); /* this is the filename */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen dbg_val4 ("dir %s view %s zone %s file %s\n", dir, view, zone, zonefile);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen (*func) (dir, view, zone, zonefile);
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen }
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val3 ("%-10s(%d): %s\n", tok2str(tok), tok, strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen fclose (fp);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return 1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#ifdef TEST_NCPARSE
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint printzone (const char *dir, const char *view, const char *zone, const char *file)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen printf ("printzone ");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen printf ("view \"%s\" " , view);
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen printf ("zone \"%s\" " , zone);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen printf ("file ");
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen if ( dir && *dir )
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen printf ("%s/", dir, file);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen printf ("%s", file);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen putchar ('\n');
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen return 1;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen}
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainenchar *progname;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainenmain (int argc, char *argv[])
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen{
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen char directory[255+1];
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen progname = argv[0];
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen directory[0] = '\0';
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen if ( --argc == 0 )
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen parse_namedconf ("/var/named/named.conf", NULL, directory, sizeof (directory), printzone);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen else
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen parse_namedconf (argv[1], NULL, directory, sizeof (directory), printzone);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen}
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen#endif
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen