ncparse.c revision c52235e52ee12e4d15f808ac06608584257f6479
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/*****************************************************************
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** @(#) ncparse.c -- A very simple named.conf parser
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** Copyright (c) Apr 2005 - Nov 2007, Holger Zuleger HZnet. All rights reserved.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** This software is open source.
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen** Redistribution and use in source and binary forms, with or without
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** modification, are permitted provided that the following conditions
e4fb5bfcdff32d337d054cce36e00e1cdfaae9f8Timo Sirainen** Redistributions of source code must retain the above copyright notice,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen** this list of conditions and the following disclaimer.
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** 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** 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#define extern
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* list of "named.conf" keywords we are interested in */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct KeyWords {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#if 0 /* we don't need the type keyword; master, slave etc. is sufficient */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val ("ncparse: searchkw (%s)\n", keyword);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen while ( kw[i].name && strcmp (kw[i].name, keyword) != 0 )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int gettok (FILE *fp, char *val, size_t valsize)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && isspace (c) )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen lastc = EOF; /* read until end of c comment */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && !(lastc == '*' && c == '/') )
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen else if ( c == '/' ) /* is it a C single line comment ? */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else /* no ! */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( c == '\"' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && p < bufend && c != '\"' )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* if string buffer is too small, eat up rest of string */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (c = getc (fp)) != EOF && p < bufend && (isalpha (c) || c == '-') );
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } while ( c != EOF );
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen/*****************************************************************
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen** parse_namedconf (const char *filename, chroot_dir, dir, dirsize, int (*func) ())
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 Sirainenint parse_namedconf (const char *filename, const char *chroot_dir, char *dir, size_t dirsize, int (*func) ())
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen#if 1 /* this is potentialy too small for key data, but we don't need the keys... */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val ("parse_namedconf: parsing file \"%s\" \n", filename);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while ( (tok = gettok (fp, strval, sizeof strval)) != EOF )
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);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) == TOK_STRING )
87712707722ef7d73acb065546e61afa4455cd9eTimo Sirainen dbg_val2 ("parse_namedconf: directory found \"%s\" (dir is %s)\n",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (path, sizeof (path), "%s/%s", dir, strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* prepend chroot directory (do it only once) */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (dir, dirsize, "%s%s%s", chroot_dir, *path == '/' ? "": "/", path);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val ("parse_namedconf: new dir \"%s\" \n", dir);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) == TOK_STRING )
b5ea11802f2bafbec06282a7b3b6704dc5fae584Timo Sirainen snprintf (path, sizeof (path), "%s/%s", dir, strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( !parse_namedconf (path, chroot_dir, dir, dirsize, func) )
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 if ( gettok (fp, strval, sizeof (strval)) != TOK_STRING )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (view, sizeof view, "%s", strval); /* store the name of the view */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_STRING )
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen snprintf (zone, sizeof zone, "%s", strval); /* store the name of the zone */
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_MASTER )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_FILE )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ( gettok (fp, strval, sizeof (strval)) != TOK_STRING )
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen snprintf (zonefile, sizeof zonefile, "%s", strval); /* this is the filename */
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen dbg_val4 ("dir %s view %s zone %s file %s\n", dir, view, zone, zonefile);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbg_val3 ("%-10s(%d): %s\n", tok2str(tok), tok, strval);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint printzone (const char *dir, const char *view, const char *zone, const char *file)
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen if ( --argc == 0 )
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen parse_namedconf ("/var/named/named.conf", NULL, directory, sizeof (directory), printzone);