/* * setup.c - Setup netboot module * * Copyright (C) 1998-2003 Gero Kuhlmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: setup.c,v 1.4 2003/01/25 23:29:44 gkminix Exp $ */ #include #include #include "privlib.h" /* * Default file and path names */ #ifndef DEFAULT_CONFIG #define DEFAULT_CONFIG "//netboot.config" #endif #ifndef DEFAULT_DIR #define DEFAULT_DIR "." #endif #ifndef DEFAULT_DATABASE #define DEFAULT_DATABASE "//netboot.db" #endif /* * Variables private to this module */ static char *confnetbootdir = NULL; /* netboot directory name from config */ static char *confdbname = NULL; /* database file name from config */ /* * Global variables exported by this module */ char *configname = NULL; /* name of configuration file */ char *netbootdir = NULL; /* main netboot directory */ char *dbname = NULL; /* name of system database file */ /* * Definition of general section in configuration file */ static struct paramdef general_params[] = { { "netbootdir", par_string, NULL, {&confnetbootdir}}, { "database", par_string, NULL, {&confdbname}}, { NULL, par_null, NULL, {NULL}} }; static struct sectdef general_sects[] = { { "general", general_params, NULL, NULL }, { NULL, NULL, NULL, NULL } }; /* * Normalize path name */ static void normpath(pathname, defaultname) char **pathname; char *defaultname; { char *newname; size_t len; /* Set default name */ if (*pathname == NULL) copystr(pathname, defaultname); /* Make relative path absolute to netboot directory */ if (!strncmp(*pathname, "//", 2)) { len = strlen(*pathname) + strlen(netbootdir) + 1; newname = (char *)nbmalloc(len); sprintf(newname, "%s%s", netbootdir, (*pathname) + 1); free(*pathname); *pathname = newname; } } /* * Setup netboot module program */ void nbsetup(argc, argv, opts, sects) int argc; char **argv; struct cmdopt *opts; struct sectdef *sects; { struct sectdef *sectbuf = NULL; struct sectdef *cursect = NULL; char *defaultdir = NULL; int sectnum, gensectnum; /* * Process command line options */ parseopt(argc, argv, opts); /* * Normalize name of configuration file, set default if not given on * command line. */ copystr(&defaultdir, DEFAULT_DIR); if (netbootdir == NULL) netbootdir = defaultdir; normpath(&configname, DEFAULT_CONFIG); if (netbootdir == defaultdir) netbootdir = NULL; if (defaultdir != NULL) free(defaultdir); /* Setup temporary buffer for sections */ for (sectnum = 0, cursect = sects; cursect != NULL && cursect->name != NULL; cursect++) sectnum++; gensectnum = sizeof(general_sects) / sizeof(struct sectdef); sectbuf = nbmalloc(sizeof(struct sectdef) * (sectnum + gensectnum + 1)); memcpy(§buf[0], sects, sizeof(struct sectdef) * sectnum); memcpy(§buf[sectnum], general_sects, sizeof(struct sectdef) * gensectnum); /* Read config file */ readconfig(sectbuf, configname); free(sectbuf); /* Finally normalize all pathnames */ if (netbootdir == NULL) { if (confnetbootdir != NULL) copystr(&netbootdir, confnetbootdir); else copystr(&netbootdir, DEFAULT_DIR); } if (confnetbootdir != NULL) free(confnetbootdir); if (dbname == NULL) { if (confdbname != NULL) normpath(&dbname, confdbname); else normpath(&dbname, DEFAULT_DATABASE); } if (confdbname) free(confdbname); }