diff --git a/usr.sbin/yp_mkdb/yp_mkdb.8 b/usr.sbin/yp_mkdb/yp_mkdb.8 index f7843549b8ff..c9e8dc8ad236 100644 --- a/usr.sbin/yp_mkdb/yp_mkdb.8 +++ b/usr.sbin/yp_mkdb/yp_mkdb.8 @@ -1,171 +1,171 @@ .\" Copyright (c) 1995, 1996 .\" Bill Paul . 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.5 1997/02/22 16:14:49 peter Exp $ +.\" $Id: yp_mkdb.8,v 1.6 1997/04/15 07:06:15 jmg Exp $ .\" .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 b .Op Fl s .Op Fl i Ar inputfile .Op Fl o Ar outputfile +.Op Fl d Ar domainname .Op Fl m Ar mastername .Ar inputfile .Ar dbname .Sh DESCRIPTION -.Nm yp_mkdb +.Nm Yp_mkdb creates .Xr db 3 style databases for use with FreeBSD's NIS server. -.Nm yp_mkdb +.Nm Yp_mkdb reads data from -.Nm inputfile , +.Ar inputfile , and writes it to -.Nm dbname +.Ar 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 +two fields of +.Tn 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] +.Pa /var/yp/[domainname] where -.Nm domainname +.Ar domainname is the name of the NIS domain being served. -.Nm yp_mkdb +.Nm Yp_mkdb is usually invoked by -.Nm /var/yp/Makefile. -.Nm yp_mkdb +.Pa /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 +.Nm creates are readable and writable by owner only (and usually the owner is root). .Sh OPTIONS The -.Nm yp_mkdb +.Nm command supports the following flags and options: -.Bl -tag -width flag +.Bl -tag -width indent .It Fl c -Causes -.Nm yp_mkdb +Cause +.Nm 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 +.Nm will send the signal only after the new database has been successfully created. .It Fl b This flag causes -.Nm yp_mkdb +.Nm to add a special entry to the database with a key of .Em YP_INTERDOMAIN and an empty data field. If this key is present in a map, it alters the behavior of the 'match' procedure in .Xr ypserv 8 slightly. If a match query fails (because the server couldn't find a record that matched the supplied key), and the .Em YP_INTERDOMAIN key exists within the queried map, .Xr ypserv 8 will try to match the entry again using a DNS lookup. Note that this special behavior only applies to the .Em hosts maps. Using the .Fl b flag for other maps has no effect. -.Pp .It Fl s This flag is used to add a special entry to the database with a key of .Em YP_SECURE and an empty data field. If this key is present in a map, .Xr ypserv 8 will deny access to the map to any client that is not using a reserved port for its query. This is used mainly for the .Em master.passwd maps, which should be restricted to privileged access only. -.Pp .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 +.It Fl i Ar inputfile When generating an NIS map, encode -.Nm inputfile +.Ar inputfile as a special entry in the database with a key of .Em YP_INPUT_FILE . -.Pp -.It Op Fl o Ar outputfile -.Pp +.It Fl o Ar outputfile When generating an NIS map, encode -.Nm outputfile +.Ar outputfile as a special entry in the database with a key of .Em YP_OUTPUT_FILE . -.Pp -.It Op Fl m Ar mastername -.Pp -When generating an NIS map encode -.Nm mastername +.It Fl d Ar domainname +When generating an NIS map, encode +.Ar domainname +as a special entry in the database with a key of +.Em YP_DOMAIN_NAME . +.It Fl m Ar mastername +When generating an NIS map, encode +.Ar mastername as a special entry in the database with a key of .Em 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 +.Nm assumes that the local host is the NIS master; the -.Ar m +.Fl m option is used to override this default. .Sh FILES -.Bl -tag -width Pa -compact +.Bl -tag -width /var/yp/Makefile -compact .It Pa /var/yp/Makefile -The Makefile that calls -.Nm yp_mkdb -to build the NIS databases. +the Makefile that calls +.Nm +to build the NIS databases .Sh SEE ALSO .Xr db 3 , .Xr ypserv 8 .Sh AUTHOR -Bill Paul +.An Bill Paul Aq wpaul@ctr.columbia.edu diff --git a/usr.sbin/yp_mkdb/yp_mkdb.c b/usr.sbin/yp_mkdb/yp_mkdb.c index 0ce8b5874881..aea610f38e4b 100644 --- a/usr.sbin/yp_mkdb/yp_mkdb.c +++ b/usr.sbin/yp_mkdb/yp_mkdb.c @@ -1,342 +1,338 @@ /* * Copyright (c) 1995, 1996 * Bill Paul . 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.6 1997/02/22 16:14:50 peter Exp $ */ -#include -#include +#ifndef lint +static const char rcsid[] = + "$Id$"; +#endif /* not lint */ + +#include #include -#include -#include -#include #include +#include #include -#include -#include +#include #include -#include +#include #include #include +#include +#include +#include #include "yp_extern.h" #include "ypxfr_extern.h" -#ifndef lint -static const char rcsid[] = "$Id: yp_mkdb.c,v 1.6 1997/02/22 16:14:50 peter Exp $"; -#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] [-b] [-s] [-i inputfile] \ -[-o outputfile]\n", progname); - fprintf(stderr, " [-d domainname ] [-m mastername] \ -inputfile dbname\n"); + fprintf(stderr, "%s\n%s\n%s\n%s\n", + "usage: yp_mkdb -c", + " yp_mkdb -u dbname", + " yp_mkdb [-c] [-b] [-s] [-i inputfile] [-o outputfile]", + " [-d domainname ] [-m mastername] inputfile dbname"); 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 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; int interdom = 0; int secure = 0; DB *dbp; DBT key, data; char buf[10240]; char *keybuf, *datbuf; FILE *ifp; char hname[MAXHOSTNAMELEN + 2]; while ((ch = getopt(argc, argv, "uhcbsd:i:o:m:")) != -1) { switch(ch) { case 'u': un++; break; case 'c': clear++; break; case 'b': interdom++; break; case 's': secure++; 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); if (interdom) { key.data = "YP_INTERDOMAIN"; key.size = sizeof("YP_INTERDOMAIN") - 1; data.data = ""; data.size = 0; yp_put_record(dbp, &key, &data, 0); } if (secure) { key.data = "YP_SECURE"; key.size = sizeof("YP_SECURE") - 1; data.data = ""; data.size = 0; yp_put_record(dbp, &key, &data, 0); } 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, 0); key.data = "YP_LAST_MODIFIED"; key.size = sizeof("YP_LAST_MODIFIED") - 1; snprintf(buf, sizeof(buf), "%lu", time(NULL)); data.data = (char *)&buf; data.size = strlen(buf); yp_put_record(dbp, &key, &data, 0); 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, 0); } 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, 0); } 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, 0); } 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(keybuf)) { warnx("no key -- check source file for blank lines"); 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, 0)) != 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); }