1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 1997 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29/*
30 * This file contains symbols and structures defining the rpc protocol
31 * between the NIS clients and the NIS servers.  The servers
32 * are the NIS database servers, and the NIS binders.
33 */
34
35/*
36 * The following procedures are supported by the protocol:
37 *
38 * YPPROC_NULL() returns () takes nothing, returns nothing.  This indicates
39 * that the NIS server is alive.
40 *
41 * YPPROC_DOMAIN (char *) returns (bool_t) TRUE.  Indicates that the
42 * responding NIS server does serve the named domain; FALSE indicates no
43 * support.
44 *
45 * YPPROC_DOMAIN_NONACK (char *) returns (TRUE) if the NIS server does serve
46 * the named domain, otherwise does not return.  Used in the broadcast case.
47 *
48 * YPPROC_MATCH (struct ypreq_key) returns (struct ypresp_val).  Returns the
49 * right-hand value for a passed left-hand key, within a named map and
50 * domain.
51 *
52 * YPPROC_FIRST (struct ypreq_nokey) returns (struct ypresp_key_val).
53 * Returns the first key-value pair from a named domain and map.
54 *
55 * YPPROC_NEXT (struct ypreq_key) returns (struct ypresp_key_val).  Returns
56 * the key-value pair following a passed key-value pair within a named
57 * domain and map.
58 *
59 * YPPROC_XFR (struct ypreq_xfr) returns nothing.  Indicates to a server that
60 * a map should be updated.
61 *
62 * YPPROC_CLEAR	takes nothing, returns nothing.  Instructs a NIS server to
63 * close the current map, so that old versions of the disk file don't get
64 * held open.
65 *
66 * YPPROC_ALL (struct ypreq_nokey), returns
67 * 	union switch (bool more) {
68 *		TRUE:	(struct ypresp_key_val);
69 *		FALSE:	(struct) {};
70 *	}
71 *
72 * YPPROC_MASTER (struct ypreq_nokey), returns (ypresp_master)
73 *
74 * YPPROC_ORDER (struct ypreq_nokey), returns (ypresp_order)
75 *
76 * YPPROC_MAPLIST (char *), returns (struct ypmaplist *)
77 */
78#ifndef BOOL_DEFINED
79typedef unsigned int bool;
80#define BOOL_DEFINED
81#endif
82
83extern bool xdr_datum();
84extern bool xdr_ypdomain_wrap_string();
85extern bool xdr_ypmap_wrap_string();
86extern bool xdr_ypreq_key();
87extern bool xdr_ypreq_nokey();
88extern bool xdr_ypreq_xfr();
89extern bool xdr_ypresp_val();
90extern bool xdr_ypresp_key_val();
91extern bool xdr_ypbind_resp();
92extern bool xdr_ypbind_setdom();
93extern bool xdr_yp_inaddr();
94extern bool xdr_ypmap_parms();
95extern bool xdr_ypowner_wrap_string();
96extern bool xdr_yppushresp_xfr();
97extern bool xdr_ypresp_order();
98extern bool xdr_ypresp_master();
99extern bool xdr_ypall();
100extern bool xdr_ypresp_maplist();
101
102/* Program and version symbols, magic numbers */
103
104#define YPPROG		((u_long)100004)
105#define YPVERS		((u_long)2)
106#define YPVERS_ORIG	((u_long)1)
107#define YPMAXRECORD	((u_long)1024)
108#define YPMAXDOMAIN	((u_long)256)
109#define YPMAXMAP	((u_long)64)
110#define YPMAXPEER	((u_long)256)
111
112/* byte size of a large NIS packet */
113#define YPMSGSZ		1600
114
115#ifndef DATUM
116typedef struct {
117	char	*dptr;
118	int	dsize;
119} datum;
120#define DATUM
121#endif
122
123struct ypmap_parms {
124	char *domain;			/* Null string means not available */
125	char *map;			/* Null string means not available */
126	unsigned long int ordernum;	/* 0 means not available */
127	char *owner;			/* Null string means not available */
128};
129
130/*
131 * Request parameter structures
132 */
133
134struct ypreq_key {
135	char *domain;
136	char *map;
137	datum keydat;
138};
139
140struct ypreq_nokey {
141	char *domain;
142	char *map;
143};
144
145struct ypreq_xfr {
146	struct ypmap_parms map_parms;
147	unsigned long transid;
148	unsigned long proto;
149	unsigned short port;
150};
151#define ypxfr_domain map_parms.domain
152#define ypxfr_map map_parms.map
153#define ypxfr_ordernum map_parms.ordernum
154#define ypxfr_owner map_parms.owner
155
156/*
157 * Response parameter structures
158 */
159
160struct ypresp_val {
161	long unsigned status;
162	datum valdat;
163};
164
165struct ypresp_key_val {
166	long unsigned status;
167	datum keydat;
168	datum valdat;
169};
170
171struct ypresp_master {
172	long unsigned status;
173	char *master;
174};
175
176struct ypresp_order {
177	long unsigned status;
178	unsigned long int ordernum;
179};
180
181struct ypmaplist {
182	char ypml_name[YPMAXMAP + 1];
183	struct ypmaplist *ypml_next;
184};
185
186struct ypresp_maplist {
187	long unsigned status;
188	struct ypmaplist *list;
189};
190
191/*
192 * Procedure symbols.  YPPROC_NULL, YPPROC_DOMAIN, and YPPROC_DOMAIN_NONACK
193 * must keep the same values (0, 1, and 2) that they had in the first version
194 * of the protocol.
195 */
196
197#define YPPROC_NULL	((u_long)0)
198#define YPPROC_DOMAIN	((u_long)1)
199#define YPPROC_DOMAIN_NONACK ((u_long)2)
200#define YPPROC_MATCH	((u_long)3)
201#define YPPROC_FIRST	((u_long)4)
202#define YPPROC_NEXT	((u_long)5)
203#define YPPROC_XFR	((u_long)6)
204#define YPPROC_CLEAR	((u_long)7)
205#define YPPROC_ALL	((u_long)8)
206#define YPPROC_MASTER	((u_long)9)
207#define YPPROC_ORDER	((u_long)10)
208#define YPPROC_MAPLIST	((u_long)11)
209
210/* Return status values */
211
212#define YP_TRUE	 	((long)1)	/* General purpose success code */
213#define YP_NOMORE 	((long)2)	/* No more entries in map */
214#define YP_FALSE 	((long)0)	/* General purpose failure code */
215#define YP_NOMAP 	((long)-1)	/* No such map in domain */
216#define YP_NODOM 	((long)-2)	/* Domain not supported */
217#define YP_NOKEY 	((long)-3)	/* No such key in map */
218#define YP_BADOP 	((long)-4)	/* Invalid operation */
219#define YP_BADDB 	((long)-5)	/* Server data base is bad */
220#define YP_YPERR 	((long)-6)	/* NIS server error */
221#define YP_BADARGS 	((long)-7)	/* Request arguments bad */
222#define YP_VERS		((long)-8)	/* NIS server version mismatch - server
223					 *   can't supply requested service. */
224
225/*
226 * Domain binding data structure, used by ypclnt package and ypserv modules.
227 * Users of the ypclnt package (or of this protocol) don't HAVE to know about
228 * it, but it must be available to users because _yp_dobind is a public
229 * interface.
230 */
231
232struct dom_binding {
233	struct dom_binding *dom_pnext;
234	char dom_domain[YPMAXDOMAIN + 1];
235	struct sockaddr_in dom_server_addr;
236	unsigned short int dom_server_port;
237	int dom_socket;
238	CLIENT *dom_client;
239	unsigned short int dom_local_port;
240	long int dom_vers;
241};
242
243
244/*
245 *		Protocol between clients and NIS binder servers
246 */
247
248/*
249 * The following procedures are supported by the protocol:
250 *
251 * YPBINDPROC_NULL() returns ()
252 * 	takes nothing, returns nothing
253 *
254 * YPBINDPROC_DOMAIN takes (char *) returns (struct ypbind_resp)
255 *
256 * YPBINDPROC_SETDOM takes (struct ypbind_setdom) returns nothing
257 */
258
259/* Program and version symbols, magic numbers */
260
261#define YPBINDPROG		((u_long)100007)
262#define YPBINDVERS		((u_long)2)
263#define YPBINDVERS_ORIG		((u_long)1)
264
265/* Procedure symbols */
266
267#define YPBINDPROC_NULL		((u_long)0)
268#define YPBINDPROC_DOMAIN	((u_long)1)
269#define YPBINDPROC_SETDOM	((u_long)2)
270/*
271 * Response structure and overall result status codes.  Success and failure
272 * represent two separate response message types.
273 */
274
275enum ypbind_resptype {YPBIND_SUCC_VAL = 1, YPBIND_FAIL_VAL = 2};
276
277struct ypbind_binding {
278	struct in_addr ypbind_binding_addr;	/* In network order */
279	unsigned short int ypbind_binding_port;	/* In network order */
280};
281struct ypbind_resp {
282	enum ypbind_resptype ypbind_status;
283	union {
284		unsigned long ypbind_error;
285		struct ypbind_binding ypbind_bindinfo;
286	} ypbind_respbody;
287};
288
289
290/* Detailed failure reason codes for response field ypbind_error*/
291
292#define YPBIND_ERR_ERR 1		/* Internal error */
293#define YPBIND_ERR_NOSERV 2		/* No bound server for passed domain */
294#define YPBIND_ERR_RESC 3		/* System resource allocation failure */
295
296/*
297 * Request data structure for ypbind "Set domain" procedure.
298 */
299struct ypbind_setdom {
300	char ypsetdom_domain[YPMAXDOMAIN + 1];
301	struct ypbind_binding ypsetdom_binding;
302	unsigned short ypsetdom_vers;
303};
304#define ypsetdom_addr ypsetdom_binding.ypbind_binding_addr
305#define ypsetdom_port ypsetdom_binding.ypbind_binding_port
306
307/*
308 *		Protocol between clients (ypxfr, only) and yppush
309 *		yppush speaks a protocol in the transient range, which
310 *		is supplied to ypxfr as a command-line parameter when it
311 *		is activated by ypserv.
312 */
313#define YPPUSHVERS		((u_long) 1)
314#define YPPUSHVERS_ORIG		((u_long)1)
315
316/* Procedure symbols */
317
318#define YPPUSHPROC_NULL		((u_long)0)
319#define YPPUSHPROC_XFRRESP	((u_long)1)
320
321struct yppushresp_xfr {
322	unsigned long transid;
323	unsigned long status;
324};
325
326/* Status values for yppushresp_xfr.status */
327
328#define YPPUSH_SUCC	((long)1)	/* Success */
329#define YPPUSH_AGE	((long)2)	/* Master's version not newer */
330#define YPPUSH_NOMAP 	((long)-1)	/* Can't find server for map */
331#define YPPUSH_NODOM 	((long)-2)	/* Domain not supported */
332#define YPPUSH_RSRC 	((long)-3)	/* Local resouce alloc failure */
333#define YPPUSH_RPC 	((long)-4)	/* RPC failure talking to server */
334#define YPPUSH_MADDR	((long)-5)	/* Can't get master address */
335#define YPPUSH_YPERR 	((long)-6)	/* NIS server/map db error */
336#define YPPUSH_BADARGS 	((long)-7)	/* Request arguments bad */
337#define YPPUSH_DBM	((long)-8)	/* Local dbm operation failed */
338#define YPPUSH_FILE	((long)-9)	/* Local file I/O operation failed */
339#define YPPUSH_SKEW	((long)-10)	/* Map version skew during transfer */
340#define YPPUSH_CLEAR	((long)-11)	/* Can't send "Clear" req to local
341					 *   ypserv */
342#define YPPUSH_FORCE	((long)-12)	/* No local order number in map -
343					 *   use -f flag. */
344#define YPPUSH_XFRERR	((long)-13)	/* ypxfr error */
345#define YPPUSH_REFUSED	((long)-14)	/* Transfer request refused by ypserv */
346
347
348