From b22fe64f8ad371d067c1d604563e453b9cbdd67d Mon Sep 17 00:00:00 2001 From: hosokawa Date: Tue, 17 Aug 1999 03:38:51 +0000 Subject: Added "include" feature to pccard.conf to put the default pccard.conf entries in /etc/defaults/. --- usr.sbin/pccard/pccardd/cardd.h | 4 ++- usr.sbin/pccard/pccardd/file.c | 64 +++++++++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 9 deletions(-) (limited to 'usr.sbin') diff --git a/usr.sbin/pccard/pccardd/cardd.h b/usr.sbin/pccard/pccardd/cardd.h index 8000151..6f00dcb 100644 --- a/usr.sbin/pccard/pccardd/cardd.h +++ b/usr.sbin/pccard/pccardd/cardd.h @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: cardd.h,v 1.13 1999/07/23 01:33:34 hosokawa Exp $ + * $Id: cardd.h,v 1.14 1999/08/01 18:04:24 imp Exp $ * * Common include file for PCMCIA daemon */ @@ -161,3 +161,5 @@ void readfile(char *); #define MEMBLKS ((MEMEND-MEMSTART)/MEMUNIT) #define MEM2BIT(x) (((x)-MEMSTART)/MEMUNIT) #define BIT2MEM(x) (((x)*MEMUNIT)+MEMSTART) + +#define MAXINCLUDES 10 diff --git a/usr.sbin/pccard/pccardd/file.c b/usr.sbin/pccard/pccardd/file.c index 8c82a16..385d280 100644 --- a/usr.sbin/pccard/pccardd/file.c +++ b/usr.sbin/pccard/pccardd/file.c @@ -26,7 +26,7 @@ #ifndef lint static const char rcsid[] = - "$Id: file.c,v 1.19 1999/07/23 01:33:34 hosokawa Exp $"; + "$Id: file.c,v 1.20 1999/08/01 18:04:24 imp Exp $"; #endif /* not lint */ #include @@ -36,6 +36,8 @@ static const char rcsid[] = #include "cardd.h" static FILE *in; +static int includes = 0; +static FILE *files[MAXINCLUDES] = {NULL, }; static int pushc, pusht; static int lineno; static char *filename; @@ -54,6 +56,7 @@ static char *keys[] = { "remove", /* 11 */ "iosize", /* 12 */ "debuglevel", /* 13 */ + "include", /* 14 */ 0 }; @@ -70,6 +73,7 @@ static char *keys[] = { #define KWD_REMOVE 11 #define KWD_IOSIZE 12 #define KWD_DEBUGLEVEL 13 +#define KWD_INCLUDE 14 struct flags { char *name; @@ -88,6 +92,7 @@ static struct allocblk *ioblk_tok(int); static struct allocblk *memblk_tok(int); static struct driver *new_driver(char *); static int iosize_tok(void); +static void file_include(char *); static void addcmd(struct cmd **); static void parse_card(void); @@ -99,6 +104,7 @@ static void parse_card(void); void readfile(char *name) { + int i; struct card *cp; in = fopen(name, "r"); @@ -106,6 +112,13 @@ readfile(char *name) logerr(name); die("readfile"); } + for (i = 0; i < MAXINCLUDES; i++) { + if (files[i]) { + fclose(files[i]); + files[i] = NULL; + } + } + files[includes = 0] = in; parsefile(); for (cp = cards; cp; cp = cp->next) { if (cp->config == 0) @@ -119,7 +132,9 @@ parsefile(void) { int i; int irq_init = 0; + int io_init = 0; struct allocblk *bp; + char *incl; pushc = 0; lineno = 1; @@ -136,15 +151,18 @@ parsefile(void) case KWD_IO: /* reserved I/O blocks */ while ((bp = ioblk_tok(0)) != 0) { - if (bp->size == 0 || bp->addr == 0) { - free(bp); - continue; + if (!io_init) { + if (bp->size == 0 || bp->addr == 0) { + free(bp); + continue; + } + bit_nset(io_avail, bp->addr, + bp->addr + bp->size - 1); + bp->next = pool_ioblks; + pool_ioblks = bp; } - bit_nset(io_avail, bp->addr, - bp->addr + bp->size - 1); - bp->next = pool_ioblks; - pool_ioblks = bp; } + io_init = 1; pusht = 1; break; case KWD_IRQ: @@ -152,6 +170,7 @@ parsefile(void) while ((i = irq_tok(0)) > 0) if (!irq_init) pool_irq[i] = 1; + irq_init = 1; pusht = 1; break; case KWD_MEMORY: @@ -177,6 +196,10 @@ parsefile(void) if (i > 0) debug_level = i; break; + case KWD_INCLUDE: + incl = newstr(next_tok()); + file_include(incl); + break; default: error("syntax error"); pusht = 0; @@ -671,6 +694,12 @@ _next_tok(void) } break; case EOF: + if (includes) { + fclose(in); + includes--; + in = files[includes]; + return _next_tok(); /* recursive */ + } if (p != buf) { *p++ = 0; return (buf); @@ -704,3 +733,22 @@ getline(void) *p = 0; return (newstr(buf)); } + +/* + * Include configuration file + */ +static void +file_include(char *filename) +{ + FILE *fp; + + includes++; + if (includes >= MAXINCLUDES) { + error("include nesting overflow"); + } + if (!(fp = fopen(filename, "r"))) { + error("can't open include file"); + includes--; + } + in = files[includes] = fp; +} -- cgit v1.1