Add support for globbing when matching the host name in the

bootparams(5) file, a'la Solaris.  This is extremely useful
for configuring Jumpstart servers.

From Dan Mercer <dmercer@zembu.com>.
This commit is contained in:
thorpej 2000-06-28 01:30:56 +00:00
parent 445d18ed28
commit c1b4b34401
2 changed files with 62 additions and 14 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: bootparamd.c,v 1.33 2000/06/14 11:15:58 tron Exp $ */
/* $NetBSD: bootparamd.c,v 1.34 2000/06/28 01:30:56 thorpej Exp $ */
/*
* This code is not copyright, and is placed in the public domain.
@ -11,7 +11,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: bootparamd.c,v 1.33 2000/06/14 11:15:58 tron Exp $");
__RCSID("$NetBSD: bootparamd.c,v 1.34 2000/06/28 01:30:56 thorpej Exp $");
#endif
#include <sys/types.h>
@ -19,9 +19,11 @@ __RCSID("$NetBSD: bootparamd.c,v 1.33 2000/06/14 11:15:58 tron Exp $");
#include <sys/stat.h>
#include <sys/socket.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <err.h>
#include <fnmatch.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
@ -306,7 +308,7 @@ lookup_bootparam(client, client_canonical, id, server, path)
static int ypbuflen = 0;
#endif
static char buf[BUFSIZ];
char *bp, *word = NULL;
char *canon = NULL, *bp, *word = NULL;
size_t idlen = id == NULL ? 0 : strlen(id);
int contin = 0;
int found = 0;
@ -348,9 +350,29 @@ lookup_bootparam(client, client_canonical, id, server, path)
#endif
if (debug)
warnx("match %s with %s", word, client);
#define HASGLOB(str) \
(strchr(str, '*') != NULL || \
strchr(str, '?') != NULL || \
strchr(str, '[') != NULL || \
strchr(str, ']') != NULL)
/* See if this line's client is the one we are
* looking for */
if (strcasecmp(word, client) != 0) {
if (fnmatch(word, client, FNM_CASEFOLD) == 0) {
/*
* Match. The token may be globbed, we
* can't just return that as the canonical
* name. Check to see if the token has any
* globbing characters in it (*, ?, [, ]).
* If so, just return the name we already
* have. Otherwise, return the token.
*/
if (HASGLOB(word))
canon = client;
else
canon = word;
} else {
/*
* If it didn't match, try getting the
* canonical host name of the client
@ -358,7 +380,7 @@ lookup_bootparam(client, client_canonical, id, server, path)
* the client we are looking for
*/
struct hostent *hp = gethostbyname(word);
if (hp == NULL ) {
if (hp == NULL) {
if (debug)
warnx(
"Unknown bootparams host %s", word);
@ -367,9 +389,18 @@ lookup_bootparam(client, client_canonical, id, server, path)
"Unknown bootparams host %s", word);
continue;
}
if (strcasecmp(hp->h_name, client))
continue;
if (fnmatch(word, hp->h_name,
FNM_CASEFOLD) == 0) {
/* See above. */
if (HASGLOB(word))
canon = hp->h_name;
else
canon = word;
}
}
#undef HASGLOB
contin *= -1;
break;
case 1:
@ -377,8 +408,9 @@ lookup_bootparam(client, client_canonical, id, server, path)
break;
}
assert(canon != NULL);
if (client_canonical)
strncpy(client_canonical, word, MAX_MACHINE_NAME);
strncpy(client_canonical, canon, MAX_MACHINE_NAME);
/* We have found a line for CLIENT */
if (id == NULL) {

View File

@ -1,4 +1,4 @@
.\" $NetBSD: bootparams.5,v 1.8 1999/04/06 04:54:21 cgd Exp $
.\" $NetBSD: bootparams.5,v 1.9 2000/06/28 01:30:56 thorpej Exp $
.\"
.\" Copyright (c) 1994 Gordon W. Ross
.\" All rights reserved.
@ -44,15 +44,17 @@ Each client supported by this server must have an entry in the
file containing the servers and pathnames for its
.Pa root ,
area. It may optionally contain
.Pa swap
and
.Pa dump
areas.
.Pa swap ,
.Pa dump ,
and other entry types.
.Pp
Each line in the file
(other than comment lines that begin with a #)
specifies the client name followed by the pathnames that
the client may request by their logical names.
the client may request by their logical names. Names
are matched in a case-insensitive fashion, and may also
be wildcarded using shell-style globbing characters.
.Pp
The components of the line are delimited with blank or tab,
and may be continued onto multiple lines with a backslash.
.Pp
@ -71,6 +73,20 @@ and pathname
as the response to its
.Tn RPC
request.
.Pp
.Bd -literal -offset indent
netra[1-5]www* root=server:/export/jumpstart/netra_www
.Ed
.Pp
When any client with a name matching the pattern "netra[1-5]www*"
requests the pathname for its logical "root" it will be given server
.Dq Pa "server"
and pathname
.Dq Pa "/export/jumpstart/netra_www"
as the response to its
.Tn RPC
request. As this example implies, this is useful for setting up
Jumpstart servers for Sun clients.
.Sh NOTES
The server does not default to the localhost, and must be filled in.
.Sh FILES