ypxfrd.x revision 16957
116119Swpaul/*
216119Swpaul * Copyright (c) 1995, 1996
316119Swpaul *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
416119Swpaul *
516119Swpaul * Redistribution and use in source and binary forms, with or without
616119Swpaul * modification, are permitted provided that the following conditions
716119Swpaul * are met:
816119Swpaul * 1. Redistributions of source code must retain the above copyright
916119Swpaul *    notice, this list of conditions and the following disclaimer.
1016119Swpaul * 2. Redistributions in binary form must reproduce the above copyright
1116119Swpaul *    notice, this list of conditions and the following disclaimer in the
1216119Swpaul *    documentation and/or other materials provided with the distribution.
1316119Swpaul * 3. All advertising materials mentioning features or use of this software
1416119Swpaul *    must display the following acknowledgement:
1516119Swpaul *	This product includes software developed by Bill Paul.
1616119Swpaul * 4. Neither the name of the author nor the names of any co-contributors
1716119Swpaul *    may be used to endorse or promote products derived from this software
1816119Swpaul *    without specific prior written permission.
1916119Swpaul *
2016119Swpaul * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
2116119Swpaul * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2216119Swpaul * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2316119Swpaul * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
2416119Swpaul * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2516119Swpaul * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2616119Swpaul * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2716119Swpaul * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2816119Swpaul * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2916119Swpaul * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3016119Swpaul * SUCH DAMAGE.
3116119Swpaul *
3216957Swpaul *	$Id: ypxfrd.x,v 1.9 1996/07/02 00:35:36 wpaul Exp $
3316119Swpaul */
3416119Swpaul
3516119Swpaul/*
3616119Swpaul * This protocol definition file describes a file transfer
3716119Swpaul * system used to very quickly move NIS maps from one host to
3816119Swpaul * another. This is similar to what Sun does with their ypxfrd
3916119Swpaul * protocol, but it must be stressed that this protocol is _NOT_
4016119Swpaul * compatible with Sun's. There are a couple of reasons for this:
4116119Swpaul *
4216119Swpaul * 1) Sun's protocol is proprietary. The protocol definition is
4316119Swpaul *    not freely available in any of the SunRPC source distributions,
4416119Swpaul *    even though the NIS v2 protocol is.
4516119Swpaul *
4616119Swpaul * 2) The idea here is to transfer entire raw files rather than
4716119Swpaul *    sending just the records. Sun uses ndbm for its NIS map files,
4816119Swpaul *    while FreeBSD uses Berkeley DB. Both are hash databases, but the
4916119Swpaul *    formats are incompatible, making it impossible for them to
5016119Swpaul *    use each others' files. Even if FreeBSD adopted ndbm for its
5116119Swpaul *    database format, FreeBSD/i386 is a little-endian OS and
5216119Swpaul *    SunOS/SPARC is big-endian; ndbm is byte-order sensitive and
5316119Swpaul *    not very smart about it, which means an attempt to read a
5416119Swpaul *    database on a little-endian box that was created on a big-endian
5516119Swpaul *    box (or vice-versa) can cause the ndbm code to eat itself.
5616119Swpaul *    Luckily, Berkeley DB is able to deal with this situation in
5716119Swpaul *    a more graceful manner.
5816119Swpaul *
5916119Swpaul * While the protocol is incompatible, the idea is the same: we just open
6016119Swpaul * up a TCP pipe to the client and transfer the raw map database
6116119Swpaul * from the master server to the slave. This is many times faster than
6216119Swpaul * the standard yppush/ypxfr transfer method since it saves us from
6316119Swpaul * having to recreate the map databases via the DB library each time.
6416119Swpaul * For example: creating a passwd database with 30,000 entries with yp_mkdb
6516119Swpaul * can take a couple of minutes, but to just copy the file takes only a few
6616119Swpaul * seconds.
6716119Swpaul */
6816119Swpaul
6916119Swpaul#ifndef RPC_HDR
7016119Swpaul%#ifndef lint
7116957Swpaul%static const char rcsid[] = "$Id: ypxfrd.x,v 1.9 1996/07/02 00:35:36 wpaul Exp $";
7216119Swpaul%#endif /* not lint */
7316119Swpaul#endif
7416119Swpaul
7516119Swpaul/* XXX cribbed from yp.x */
7616119Swpaulconst _YPMAXRECORD = 1024;
7716119Swpaulconst _YPMAXDOMAIN = 64;
7816119Swpaulconst _YPMAXMAP = 64;
7916119Swpaulconst _YPMAXPEER = 64;
8016119Swpaul
8116119Swpaul/* Suggested default -- not necesarrily the one used. */
8216119Swpaulconst YPXFRBLOCK = 32767;
8316119Swpaul
8416957Swpaul/*
8516957Swpaul * Possible return codes from the remote server.
8616957Swpaul */
8716119Swpaulenum xfrstat {
8816119Swpaul	XFR_REQUEST_OK	= 1,	/* Transfer request granted */
8916119Swpaul	XFR_DENIED	= 2,	/* Transfer request denied */
9016119Swpaul	XFR_NOFILE	= 3,	/* Requested map file doesn't exist */
9116119Swpaul	XFR_ACCESS	= 4,	/* File exists, but I couldn't access it */
9216119Swpaul	XFR_BADDB	= 5,	/* File is not a hash database */
9316119Swpaul	XFR_READ_OK	= 6,	/* Block read successfully */
9416119Swpaul	XFR_READ_ERR	= 7,	/* Read error during transfer */
9516957Swpaul	XFR_DONE	= 8,	/* Transfer completed */
9616957Swpaul	XFR_DB_ENDIAN_MISMATCH	= 9,	/* Database byte order mismatch */
9716957Swpaul	XFR_DB_TYPE_MISMATCH	= 10	/* Database type mismatch */
9816119Swpaul};
9916119Swpaul
10016957Swpaul/*
10116957Swpaul * Database type specifications. The client can use this to ask
10216957Swpaul * the server for a particular type of database or just take whatever
10316957Swpaul * the server has to offer.
10416957Swpaul */
10516957Swpaulenum xfr_db_type {
10616957Swpaul	XFR_DB_ASCII		= 1,	/* Flat ASCII text */
10716957Swpaul	XFR_DB_BSD_HASH		= 2,	/* Berkeley DB, hash method */
10816957Swpaul	XFR_DB_BSD_BTREE	= 3,	/* Berkeley DB, btree method */
10916957Swpaul	XFR_DB_BSD_RECNO	= 4,	/* Berkeley DB, recno method */
11016957Swpaul	XFR_DB_BSD_MPOOL	= 5,	/* Berkeley DB, mpool method */
11116957Swpaul	XFR_DB_BSD_NDBM		= 6,	/* Berkeley DB, hash, ndbm compat */
11216957Swpaul	XFR_DB_GNU_GDBM		= 7,	/* GNU GDBM */
11316957Swpaul	XFR_DB_DBM		= 8,	/* Old, deprecated dbm format */
11416957Swpaul	XFR_DB_NDBM		= 9,	/* ndbm format (used by Sun's NISv2) */
11516957Swpaul	XFR_DB_OPAQUE		= 10,	/* Mystery format -- just pass along */
11616957Swpaul	XFR_DB_ANY		= 11,	/* I'll take any format you've got */
11716957Swpaul	XFR_DB_UNKNOWN		= 12	/* Unknown format */
11816957Swpaul};
11916957Swpaul
12016957Swpaul/*
12116957Swpaul * Machine byte order specification. This allows the client to check
12216957Swpaul * that it's copying a map database from a machine of similar byte sex.
12316957Swpaul * This is necessary for handling database libraries that are fatally
12416957Swpaul * byte order sensitive.
12516957Swpaul *
12616957Swpaul * The XFR_ENDIAN_ANY type is for use with the Berkeley DB database
12716957Swpaul * formats; Berkeley DB is smart enough to make up for byte order
12816957Swpaul * differences, so byte sex isn't important.
12916957Swpaul */
13016957Swpaulenum xfr_byte_order {
13116957Swpaul	XFR_ENDIAN_BIG		= 1,	/* We want big endian */
13216957Swpaul	XFR_ENDIAN_LITTLE	= 2,	/* We want little endian */
13316957Swpaul	XFR_ENDIAN_ANY		= 3	/* We'll take whatever you got */
13416957Swpaul};
13516957Swpaul
13616119Swpaultypedef string xfrdomain<_YPMAXDOMAIN>;
13716119Swpaultypedef string xfrmap<_YPMAXMAP>;
13816957Swpaultypedef string xfrmap_filename<_YPMAXMAP>;	/* actual name of map file */
13916957Swpaultypedef enum xfrstat xfrstat;
14016957Swpaultypedef enum xfr_db_type xfr_db_type;
14116957Swpaultypedef enum xfr_byte_order xfr_byte_order;
14216119Swpaul
14316957Swpaul/*
14416957Swpaul * Ask the remote ypxfrd for a map using this structure.
14516957Swpaul * Note: we supply both a map name and a map file name. These are not
14616957Swpaul * the same thing. In the case of ndbm, maps are stored in two files:
14716957Swpaul * map.bykey.pag and may.bykey.dir. We may also have to deal with
14816957Swpaul * file extensions (on the off chance that the remote server is supporting
14916957Swpaul * multiple DB formats). To handle this, we tell the remote server both
15016957Swpaul * what map we want and, in the case of ndbm, whether we want the .dir
15116957Swpaul * or the .pag part. This name should not be a fully qualified path:
15216957Swpaul * it's up to the remote server to decide which directories to look in.
15316957Swpaul */
15416119Swpaulstruct ypxfr_mapname {
15516119Swpaul	xfrmap xfrmap;
15616119Swpaul	xfrdomain xfrdomain;
15716957Swpaul	xfrmap_filename xfrmap_filename;
15816957Swpaul	xfr_db_type xfr_db_type;
15916957Swpaul	xfr_byte_order xfr_byte_order;
16016119Swpaul};
16116119Swpaul
16216119Swpaul/* Read response using this structure. */
16316119Swpaulunion xfr switch (bool ok) {
16416119Swpaulcase TRUE:
16516119Swpaul	opaque xfrblock_buf<>;
16616119Swpaulcase FALSE:
16716957Swpaul	xfrstat xfrstat;
16816119Swpaul};
16916119Swpaul
17016119Swpaulprogram YPXFRD_FREEBSD_PROG {
17116119Swpaul	version YPXFRD_FREEBSD_VERS {
17216119Swpaul		union xfr
17316119Swpaul		YPXFRD_GETMAP(ypxfr_mapname) = 1;
17416119Swpaul	} = 1;
17516119Swpaul} = 600100069;	/* 100069 + 60000000 -- 100069 is the Sun ypxfrd prog number */
176