Import the new yp_mkdb. This one does what the old one does, but is
hopefully less grotty. Differences include: - An extra flag, -c, for sending a YPPROC_CLEAR to ypserv(8) (which will become useful once I merge in the DB handle caching mods I've been working on). - Checks for and signals duplicate keys. - Handles line continuations. As of now, there is no more GNU YP code in the tree.
This commit is contained in:
parent
01ca6f26be
commit
6290107b02
13
usr.sbin/yp_mkdb/Makefile
Normal file
13
usr.sbin/yp_mkdb/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
# $Id$
|
||||
|
||||
PROG= yp_mkdb
|
||||
SRCS= yp_mkdb.c yp_dblookup.c yp_dbwrite.c
|
||||
|
||||
MAN8= yp_mkdb.8
|
||||
|
||||
.PATH: ${.CURDIR}/../../libexec/ypxfr ${.CURDIR}/../ypserv
|
||||
|
||||
CFLAGS+= -Dyp_error=warnx
|
||||
CFLAGS+= -I${.CURDIR}/../../usr.sbin/ypserv
|
||||
|
||||
.include <bsd.prog.mk>
|
139
usr.sbin/yp_mkdb/yp_mkdb.8
Normal file
139
usr.sbin/yp_mkdb/yp_mkdb.8
Normal file
@ -0,0 +1,139 @@
|
||||
.\" Copyright (c) 1995, 1996
|
||||
.\" Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by Bill Paul
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (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: yp_mkdb.8,v 1.1 1996/03/13 16:28:19 wpaul Exp wpaul $
|
||||
.\"
|
||||
.Dd March 12, 1996
|
||||
.Dt YP_MKDB 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm yp_mkdb
|
||||
.Nd "generate the NIS databases"
|
||||
.Sh SYNOPSIS
|
||||
.Nm yp_mkdb
|
||||
.Fl c
|
||||
.Nm yp_mkdb
|
||||
.Fl u Ar dbname
|
||||
.Nm yp_mkdb
|
||||
.Op Fl c
|
||||
.Op Fl i Ar inputfile
|
||||
.Op Fl o Ar outputfile
|
||||
.Op Fl m Ar mastername
|
||||
.Ar inputfile
|
||||
.Ar dbname
|
||||
.Sh DESCRIPTION
|
||||
.Nm yp_mkdb
|
||||
creates
|
||||
.Xr db 3
|
||||
style databases for use with FreeBSD's NIS server.
|
||||
.Nm yp_mkdb
|
||||
reads data from
|
||||
.Nm inputfile ,
|
||||
and writes it to
|
||||
.Nm dbname
|
||||
in
|
||||
.Xr db 3
|
||||
format (using the hash table method).
|
||||
The input should be in 'key data' format, which is to say
|
||||
two fields of ASCII data separated by white space. The first field
|
||||
is assumed to be the key, and everything else is assumed to be
|
||||
the data.
|
||||
These databases are typically stored in
|
||||
.Nm /var/yp/[domainname]
|
||||
where
|
||||
.Nm domainname
|
||||
is the name of the NIS domain being served.
|
||||
.Nm yp_mkdb
|
||||
is usually invoked by
|
||||
.Nm /var/yp/Makefile.
|
||||
.Nm yp_mkdb
|
||||
can also be used to dump an NIS database file so that its
|
||||
contents can be examined. For security reasons, all databases that
|
||||
.Nm yp_mkdb
|
||||
creates are readable and writable by owner only (and usually the
|
||||
owner is root).
|
||||
.Sh OPTIONS
|
||||
The
|
||||
.Nm yp_mkdb
|
||||
command supports the following flags and options:
|
||||
.Bl -tag -width flag
|
||||
.It Fl c
|
||||
Causes
|
||||
.Nm yp_mkdb
|
||||
to send a YPPROC_CLEAR request to
|
||||
.Xr ypserv 8
|
||||
on the local host. This signal tells the server to close any open
|
||||
database descriptors and flush out its database cache. If used alone,
|
||||
this flag signals the server and does nothing else. If used as part
|
||||
of a database creation command,
|
||||
.Nm yp_mkdb
|
||||
will send the signal only after the new database has been successfully
|
||||
created.
|
||||
.It Fl u Ar dbname
|
||||
.Pp
|
||||
Dump (or 'unwind') an NIS database. This option can be used to
|
||||
inspect the contents of an existing NIS database.
|
||||
.It Op Fl i Ar inputfile
|
||||
.Pp
|
||||
When generating an NIS map, encode
|
||||
.Nm inputfile
|
||||
as a special entry in the database with called
|
||||
.Nm YP_INPUT_FILE.
|
||||
.Pp
|
||||
.It Op Fl o Ar outputfile
|
||||
.Pp
|
||||
When generating an NIS map, encode
|
||||
.Nm outputfile
|
||||
as a special entry in the database with called
|
||||
.Nm YP_OUTPUT_FILE .
|
||||
.Pp
|
||||
.It Op Fl m Ar mastername
|
||||
.Pp
|
||||
When generating an NIS map encode
|
||||
.Nm mastername
|
||||
as a special entry in the database with called
|
||||
.Nm YP_MASTER_NAME .
|
||||
This entry in the database is frequently used by various NIS utilities
|
||||
to determine the name of an NIS master server for a domain. By default,
|
||||
.Nm yp_mkdb
|
||||
assumes that the local host is the NIS master; the
|
||||
.Ar m
|
||||
option is used to override this default.
|
||||
.Sh FILES
|
||||
.Bl -tag -width Pa -compact
|
||||
.It Pa /var/yp/Makefile
|
||||
The Makefile that calls
|
||||
.Nm yp_mkdb
|
||||
to build the NIS databases.
|
||||
.Sh SEE ALSO
|
||||
.Xr ypserv 8 ,
|
||||
.Xr db 3
|
||||
.Sh AUTHOR
|
||||
Bill Paul <wpaul@ctr.columbia.edu>
|
313
usr.sbin/yp_mkdb/yp_mkdb.c
Normal file
313
usr.sbin/yp_mkdb/yp_mkdb.c
Normal file
@ -0,0 +1,313 @@
|
||||
/*
|
||||
* Copyright (c) 1995, 1996
|
||||
* Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Bill Paul.
|
||||
* 4. Neither the name of the author nor the names of any co-contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (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: yp_mkdb.c,v 1.4 1996/03/26 05:32:14 wpaul Exp wpaul $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <db.h>
|
||||
#include <err.h>
|
||||
#include <rpc/rpc.h>
|
||||
#include <rpcsvc/yp.h>
|
||||
#include "yp_extern.h"
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: yp_mkdb.c,v 1.4 1996/03/26 05:32:14 wpaul Exp wpaul $";
|
||||
#endif
|
||||
|
||||
char *yp_dir = ""; /* No particular default needed. */
|
||||
char *progname = "yp_mkdb";
|
||||
int _rpcpmstart = 0;
|
||||
int debug = 1;
|
||||
|
||||
static void usage()
|
||||
{
|
||||
fprintf(stderr, "usage: %s -c\n", progname);
|
||||
fprintf(stderr, "usage: %s -u dbname\n", progname);
|
||||
fprintf(stderr, "usage: %s [-c] [-i inputfile] [-o outputfile]\n",
|
||||
progname);
|
||||
fprintf(stderr, " [-d domainname ] [-m mastername] \
|
||||
inputfile dbname\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#define PERM_SECURE (S_IRUSR|S_IWUSR)
|
||||
|
||||
static DB *open_db(path, flags)
|
||||
char *path;
|
||||
int flags;
|
||||
{
|
||||
extern HASHINFO openinfo;
|
||||
|
||||
return(dbopen(path, flags, PERM_SECURE, DB_HASH, &openinfo));
|
||||
}
|
||||
|
||||
static void unwind(map)
|
||||
char *map;
|
||||
{
|
||||
DB *dbp;
|
||||
DBT key, data;
|
||||
|
||||
dbp = open_db(map, O_RDONLY);
|
||||
|
||||
if (dbp == NULL)
|
||||
err(1, "open_db(%s) failed", map);
|
||||
|
||||
key.data = NULL;
|
||||
while(yp_next_record(dbp, &key, &data, 1, 1) == YP_TRUE)
|
||||
printf("%.*s %.*s\n", key.size,key.data,data.size,data.data);
|
||||
|
||||
(void)(dbp->close)(dbp);
|
||||
return;
|
||||
}
|
||||
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
int ch;
|
||||
int un = 0;
|
||||
int clear = 0;
|
||||
char *infile = NULL;
|
||||
char *map = NULL;
|
||||
char *domain = NULL;
|
||||
char *infilename = NULL;
|
||||
char *outfilename = NULL;
|
||||
char *mastername = NULL;
|
||||
DB *dbp;
|
||||
DBT key, data;
|
||||
char buf[10240];
|
||||
char *keybuf, *datbuf;
|
||||
FILE *ifp;
|
||||
char hname[MAXHOSTNAMELEN + 2];
|
||||
|
||||
while ((ch = getopt(argc, argv, "uhcd:i:o:m:")) != EOF) {
|
||||
switch(ch) {
|
||||
case 'u':
|
||||
un++;
|
||||
break;
|
||||
case 'c':
|
||||
clear++;
|
||||
break;
|
||||
case 'd':
|
||||
domain = optarg;
|
||||
break;
|
||||
case 'i':
|
||||
infilename = optarg;
|
||||
break;
|
||||
case 'o':
|
||||
outfilename = optarg;
|
||||
break;
|
||||
case 'm':
|
||||
mastername = optarg;
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (un) {
|
||||
map = argv[0];
|
||||
if (map == NULL)
|
||||
usage();
|
||||
unwind(map);
|
||||
exit(0);
|
||||
|
||||
}
|
||||
|
||||
infile = argv[0];
|
||||
map = argv[1];
|
||||
|
||||
if (infile == NULL || map == NULL) {
|
||||
if (clear)
|
||||
goto doclear;
|
||||
usage();
|
||||
}
|
||||
|
||||
if (mastername == NULL) {
|
||||
if (gethostname((char *)&hname, sizeof(hname)) == -1)
|
||||
err(1, "gethostname() failed");
|
||||
mastername = (char *)&hname;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that while we can read from stdin, we can't
|
||||
* write to stdout; the db library doesn't let you
|
||||
* write to a file stream like that.
|
||||
*/
|
||||
|
||||
if (!strcmp(infile, "-")) {
|
||||
ifp = stdin;
|
||||
} else {
|
||||
if ((ifp = fopen(infile, "r")) == NULL)
|
||||
err(1, "failed to open %s", infile);
|
||||
}
|
||||
|
||||
if ((dbp = open_db(map, O_RDWR|O_EXLOCK|O_EXCL|O_CREAT)) == NULL)
|
||||
err(1, "open_db(%s) failed", map);
|
||||
|
||||
key.data = "YP_MASTER_NAME";
|
||||
key.size = sizeof("YP_MASTER_NAME") - 1;
|
||||
data.data = mastername;
|
||||
data.size = strlen(mastername);
|
||||
yp_put_record(dbp, &key, &data);
|
||||
|
||||
key.data = "YP_LAST_MODIFIED";
|
||||
key.size = sizeof("YP_LAST_MODIFIED") - 1;
|
||||
snprintf(buf, sizeof(buf), "%lu", time(NULL));
|
||||
data.data = &buf;
|
||||
data.size = strlen(buf);
|
||||
yp_put_record(dbp, &key, &data);
|
||||
|
||||
if (infilename) {
|
||||
key.data = "YP_INPUT_FILE";
|
||||
key.size = sizeof("YP_INPUT_FILE") - 1;
|
||||
data.data = infilename;
|
||||
data.size = strlen(infilename);
|
||||
yp_put_record(dbp, &key, &data);
|
||||
}
|
||||
|
||||
if (outfilename) {
|
||||
key.data = "YP_OUTPUT_FILE";
|
||||
key.size = sizeof("YP_OUTPUT_FILE") - 1;
|
||||
data.data = outfilename;
|
||||
data.size = strlen(outfilename);
|
||||
yp_put_record(dbp, &key, &data);
|
||||
}
|
||||
|
||||
if (domain) {
|
||||
key.data = "YP_DOMAIN_NAME";
|
||||
key.size = sizeof("YP_DOMAIN_NAME") - 1;
|
||||
data.data = domain;
|
||||
data.size = strlen(domain);
|
||||
yp_put_record(dbp, &key, &data);
|
||||
}
|
||||
|
||||
while(fgets((char *)&buf, sizeof(buf), ifp)) {
|
||||
char *sep = NULL;
|
||||
int rval;
|
||||
|
||||
/* NUL terminate */
|
||||
if ((sep = strchr(buf, '\n')))
|
||||
*sep = '\0';
|
||||
|
||||
/* handle backslash line continuations */
|
||||
while(buf[strlen(buf) - 1] == '\\') {
|
||||
fgets((char *)&buf[strlen(buf) - 1],
|
||||
sizeof(buf) - strlen(buf), ifp);
|
||||
if ((sep = strchr(buf, '\n')))
|
||||
*sep = '\0';
|
||||
}
|
||||
|
||||
/* find the separation between the key and data */
|
||||
if ((sep = strpbrk(buf, " \t")) == NULL) {
|
||||
warnx("bad input -- no white space: %s", buf);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* separate the strings */
|
||||
keybuf = (char *)&buf;
|
||||
datbuf = sep + 1;
|
||||
*sep = '\0';
|
||||
|
||||
/* set datbuf to start at first non-whitespace character */
|
||||
while (*datbuf == ' ' || *datbuf == '\t')
|
||||
datbuf++;
|
||||
|
||||
/* Check for silliness. */
|
||||
if (*keybuf == '+' || *keybuf == '-' ||
|
||||
*datbuf == '+' || *datbuf == '-') {
|
||||
warnx("bad character at start of line: %s", buf);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strlen(keybuf) > YPMAXRECORD) {
|
||||
warnx("key too long: %s", keybuf);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strlen(datbuf) > YPMAXRECORD) {
|
||||
warnx("data too long: %s", datbuf);
|
||||
continue;
|
||||
}
|
||||
|
||||
key.data = keybuf;
|
||||
key.size = strlen(keybuf);
|
||||
data.data = datbuf;
|
||||
data.size = strlen(datbuf);
|
||||
|
||||
if ((rval = yp_put_record(dbp, &key, &data)) != YP_TRUE) {
|
||||
switch(rval) {
|
||||
case YP_FALSE:
|
||||
warnx("duplicate key '%s' - skipping", keybuf);
|
||||
break;
|
||||
case YP_BADDB:
|
||||
default:
|
||||
err(1,"failed to write new record - exiting");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
(void)(dbp->close)(dbp);
|
||||
|
||||
doclear:
|
||||
|
||||
if (clear) {
|
||||
char in = 0;
|
||||
char *out = NULL;
|
||||
int stat;
|
||||
if ((stat = callrpc("localhost",YPPROG,YPVERS,YPPROC_CLEAR,
|
||||
xdr_void, (void *)&in,
|
||||
xdr_void, (void *)out)) != RPC_SUCCESS) {
|
||||
warnx("failed to send 'clear' to local ypserv: %s",
|
||||
clnt_sperrno((enum clnt_stat) stat));
|
||||
}
|
||||
}
|
||||
|
||||
exit(0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user