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 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30 /*
31 * Portions of this source code were derived from Berkeley 4.3 BSD
32 * under license from the Regents of the University of California.
33 */
34
35 #ifndef _RPCSVC_YP_PROT_H
36 #define _RPCSVC_YP_PROT_H
37
38 #pragma ident "%Z%%M% %I% %E% SMI"
39
40 #include <rpc/rpc.h>
41 #include <rpcsvc/ypclnt.h>
42 #include <ndbm.h>
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /*
49 * This file contains symbols and structures defining the rpc protocol
50 * between the YP clients and the YP servers. The servers are the YP
51 * database servers, and the YP.
52 */
53
54 /*
55 * The following procedures are supported by the protocol:
56 *
57 * YPPROC_NULL() returns () takes nothing, returns nothing. This indicates
58 * that the yp server is alive.
59 *
60 * YPPROC_DOMAIN (char *) returns (bool_t) TRUE. Indicates that the
61 * responding yp server does serve the named domain; FALSE indicates no
62 * support.
63 *
64 * YPPROC_DOMAIN_NONACK (char *) returns (TRUE) if the yp server does serve
65 * the named domain, otherwise does not return. Used in the broadcast case.
66 *
67 * YPPROC_MATCH (struct ypreq_key) returns (struct ypresp_val). Returns the
68 * right-hand value for a passed left-hand key, within a named map and
69 * domain.
70 *
71 * YPPROC_FIRST (struct ypreq_nokey) returns (struct ypresp_key_val).
72 * Returns the first key-value pair from a named domain and map.
73 *
74 * YPPROC_NEXT (struct ypreq_key) returns (struct ypresp_key_val). Returns
75 * the key-value pair following a passed key-value pair within a named
76 * domain and map.
77 *
78 * YPPROC_XFR (struct ypreq_xfr) returns nothing. Indicates to a server that
79 * a map should be updated.
80 *
81 * YPPROC_NEWXFR (struct ypreq_newxfr) returns nothing. Indicates to a server
82 * that a map should be updated. Uses protocol independent request struct.
83 *
84 * YPPROC_CLEAR takes nothing, returns nothing. Instructs a yp server to
85 * close the current map, so that old versions of the disk file don't get
86 * held open.
87 *
88 * YPPROC_ALL (struct ypreq_nokey), returns
89 * union switch (bool more) {
90 * TRUE: (struct ypresp_key_val);
91 * FALSE: (struct) {};
92 * }
93 *
94 * YPPROC_MASTER (struct ypreq_nokey), returns (ypresp_master)
95 *
96 * YPPROC_ORDER (struct ypreq_nokey), returns (ypresp_order)
97 *
98 * YPPROC_MAPLIST (char *), returns (struct ypmaplist *)
99 */
100
101 /* 'bool' is a built-in type for g++ */
102 #if !(defined(__cplusplus) && defined(_BOOL)) && !defined(__GNUG__)
103 #ifndef BOOL_DEFINED
104 typedef unsigned int bool;
105 #define BOOL_DEFINED
106 #endif
107 #endif
108
109 /* Program and version symbols, magic numbers */
110
111 #define YPPROG ((rpcprog_t)100004)
112 #define YPVERS ((rpcvers_t)2)
113 #define YPVERS_ORIG ((rpcvers_t)1)
114 #define YPMAXRECORD ((uint_t)1024)
115 #define YPMAXDOMAIN ((uint_t)256)
116 #define YPMAXMAP ((uint_t)64)
117 #define YPMAXPEER ((uint_t)256)
118
119 /* byte size of a large yp packet */
120 #define YPMSGSZ 1600
121
122 struct ypmap_parms {
123 char *domain; /* Null string means not available */
124 char *map; /* Null string means not available */
125 unsigned int ordernum; /* 0 means not available */
126 char *owner; /* Null string means not available */
127 };
128
129 /*
130 * Request parameter structures
131 */
132
133 struct ypreq_key {
134 char *domain;
135 char *map;
136 datum keydat;
137 };
138
139 struct ypreq_nokey {
140 char *domain;
141 char *map;
142 };
143
144 struct ypreq_xfr {
145 struct ypmap_parms map_parms;
146 unsigned int transid;
147 unsigned int proto;
148 unsigned short port;
149 };
150
151 struct ypreq_newxfr {
152 struct ypmap_parms map_parms;
153 unsigned int transid;
154 unsigned int proto;
155 char *name;
156 };
157
158 #define ypxfr_domain map_parms.domain
159 #define ypxfr_map map_parms.map
160 #define ypxfr_ordernum map_parms.ordernum
161 #define ypxfr_owner map_parms.owner
162
163 /*
164 * Response parameter structures
165 */
166
167 struct ypresp_val {
168 unsigned int status;
169 datum valdat;
170 };
171
172 struct ypresp_key_val {
173 unsigned int status;
174 datum valdat;
175 datum keydat;
176 };
177
178 struct ypresp_master {
179 unsigned int status;
180 char *master;
181 };
182
183 struct ypresp_order {
184 unsigned int status;
185 unsigned int ordernum;
186 };
187
188 struct ypmaplist {
189 char ypml_name[YPMAXMAP + 1];
190 struct ypmaplist *ypml_next;
191 };
192
193 struct ypresp_maplist {
194 unsigned int status;
195 struct ypmaplist *list;
196 };
197
198 /*
199 * Procedure symbols. YPPROC_NULL, YPPROC_DOMAIN, and YPPROC_DOMAIN_NONACK
200 * must keep the same values (0, 1, and 2) that they had in the first version
201 * of the protocol.
202 */
203
204 #define YPPROC_NULL ((rpcproc_t)0)
205 #define YPPROC_DOMAIN ((rpcproc_t)1)
206 #define YPPROC_DOMAIN_NONACK ((rpcproc_t)2)
207 #define YPPROC_MATCH ((rpcproc_t)3)
208 #define YPPROC_FIRST ((rpcproc_t)4)
209 #define YPPROC_NEXT ((rpcproc_t)5)
210 #define YPPROC_XFR ((rpcproc_t)6)
211 #define YPPROC_NEWXFR ((rpcproc_t)12)
212 #define YPPROC_CLEAR ((rpcproc_t)7)
213 #define YPPROC_ALL ((rpcproc_t)8)
214 #define YPPROC_MASTER ((rpcproc_t)9)
215 #define YPPROC_ORDER ((rpcproc_t)10)
216 #define YPPROC_MAPLIST ((rpcproc_t)11)
217
218 /* Return status values */
219
220 #define YP_TRUE (1) /* General purpose success code */
221 #define YP_NOMORE (2) /* No more entries in map */
222 #define YP_FALSE (0) /* General purpose failure code */
223 #define YP_NOMAP (-1) /* No such map in domain */
224 #define YP_NODOM (-2) /* Domain not supported */
225 #define YP_NOKEY (-3) /* No such key in map */
226 #define YP_BADOP (-4) /* Invalid operation */
227 #define YP_BADDB (-5) /* Server data base is bad */
228 #define YP_YPERR (-6) /* YP server error */
229 #define YP_BADARGS (-7) /* Request arguments bad */
230 #define YP_VERS (-8) /* YP server vers. mismatch - server */
231 /* can't supply requested service. */
232
233 enum ypreqtype {YPREQ_KEY = 1, YPREQ_NOKEY = 2, YPREQ_MAP_PARMS = 3};
234 struct yprequest {
235 enum ypreqtype yp_reqtype;
236 union {
237 struct ypreq_key yp_req_keytype;
238 struct ypreq_nokey yp_req_nokeytype;
239 struct ypmap_parms yp_req_map_parmstype;
240 }yp_reqbody;
241 };
242
243 #define YPMATCH_REQTYPE YPREQ_KEY
244 #define ypmatch_req_domain yp_reqbody.yp_req_keytype.domain
245 #define ypmatch_req_map yp_reqbody.yp_req_keytype.map
246 #define ypmatch_req_keydat yp_reqbody.yp_req_keytype.keydat
247 #define ypmatch_req_keyptr yp_reqbody.yp_req_keytype.keydat.dptr
248 #define ypmatch_req_keysize yp_reqbody.yp_req_keytype.keydat.dsize
249
250 #define YPFIRST_REQTYPE YPREQ_NOKEY
251 #define ypfirst_req_domain yp_reqbody.yp_req_nokeytype.domain
252 #define ypfirst_req_map yp_reqbody.yp_req_nokeytype.map
253
254 #define YPNEXT_REQTYPE YPREQ_KEY
255 #define ypnext_req_domain yp_reqbody.yp_req_keytype.domain
256 #define ypnext_req_map yp_reqbody.yp_req_keytype.map
257 #define ypnext_req_keydat yp_reqbody.yp_req_keytype.keydat
258 #define ypnext_req_keyptr yp_reqbody.yp_req_keytype.keydat.dptr
259 #define ypnext_req_keysize yp_reqbody.yp_req_keytype.keydat.dsize
260
261 #define YPPUSH_REQTYPE YPREQ_NOKEY
262 #define yppush_req_domain yp_reqbody.yp_req_nokeytype.domain
263 #define yppush_req_map yp_reqbody.yp_req_nokeytype.map
264
265 #define YPPULL_REQTYPE YPREQ_NOKEY
266 #define yppull_req_domain yp_reqbody.yp_req_nokeytype.domain
267 #define yppull_req_map yp_reqbody.yp_req_nokeytype.map
268
269 #define YPPOLL_REQTYPE YPREQ_NOKEY
270 #define yppoll_req_domain yp_reqbody.yp_req_nokeytype.domain
271 #define yppoll_req_map yp_reqbody.yp_req_nokeytype.map
272
273 #define YPGET_REQTYPE YPREQ_MAP_PARMS
274 #define ypget_req_domain yp_reqbody.yp_req_map_parmstype.domain
275 #define ypget_req_map yp_reqbody.yp_req_map_parmstype.map
276 #define ypget_req_ordernum yp_reqbody.yp_req_map_parmstype.ordernum
277 #define ypget_req_owner yp_reqbody.yp_req_map_parmstype.owner
278
279 enum ypresptype {YPRESP_VAL = 1, YPRESP_KEY_VAL = 2, YPRESP_MAP_PARMS = 3};
280 struct ypresponse {
281 enum ypresptype yp_resptype;
282 union {
283 struct ypresp_val yp_resp_valtype;
284 struct ypresp_key_val yp_resp_key_valtype;
285 struct ypmap_parms yp_resp_map_parmstype;
286 } yp_respbody;
287 };
288
289 #define YPMATCH_RESPTYPE YPRESP_VAL
290 #define ypmatch_resp_status yp_respbody.yp_resp_valtype.status
291 #define ypmatch_resp_valdat yp_respbody.yp_resp_valtype.valdat
292 #define ypmatch_resp_valptr yp_respbody.yp_resp_valtype.valdat.dptr
293 #define ypmatch_resp_valsize yp_respbody.yp_resp_valtype.valdat.dsize
294
295 #define YPFIRST_RESPTYPE YPRESP_KEY_VAL
296 #define ypfirst_resp_status yp_respbody.yp_resp_key_valtype.status
297 #define ypfirst_resp_keydat yp_respbody.yp_resp_key_valtype.keydat
298 #define ypfirst_resp_keyptr yp_respbody.yp_resp_key_valtype.keydat.dptr
299 #define ypfirst_resp_keysize yp_respbody.yp_resp_key_valtype.keydat.dsize
300 #define ypfirst_resp_valdat yp_respbody.yp_resp_key_valtype.valdat
301 #define ypfirst_resp_valptr yp_respbody.yp_resp_key_valtype.valdat.dptr
302 #define ypfirst_resp_valsize yp_respbody.yp_resp_key_valtype.valdat.dsize
303
304 #define YPNEXT_RESPTYPE YPRESP_KEY_VAL
305 #define ypnext_resp_status yp_respbody.yp_resp_key_valtype.status
306 #define ypnext_resp_keydat yp_respbody.yp_resp_key_valtype.keydat
307 #define ypnext_resp_keyptr yp_respbody.yp_resp_key_valtype.keydat.dptr
308 #define ypnext_resp_keysize yp_respbody.yp_resp_key_valtype.keydat.dsize
309 #define ypnext_resp_valdat yp_respbody.yp_resp_key_valtype.valdat
310 #define ypnext_resp_valptr yp_respbody.yp_resp_key_valtype.valdat.dptr
311 #define ypnext_resp_valsize yp_respbody.yp_resp_key_valtype.valdat.dsize
312
313 #define YPPOLL_RESPTYPE YPRESP_MAP_PARMS
314 #define yppoll_resp_domain yp_respbody.yp_resp_map_parmstype.domain
315 #define yppoll_resp_map yp_respbody.yp_resp_map_parmstype.map
316 #define yppoll_resp_ordernum yp_respbody.yp_resp_map_parmstype.ordernum
317 #define yppoll_resp_owner yp_respbody.yp_resp_map_parmstype.owner
318
319
320 extern bool _xdr_yprequest();
321 extern bool _xdr_ypresponse();
322 /*
323 * Protocol between clients (ypxfr, only) and yppush
324 * yppush speaks a protocol in the transient range, which
325 * is supplied to ypxfr as a command-line parameter when it
326 * is activated by ypserv.
327 */
328 #define YPPUSHVERS ((rpcvers_t)1)
329 #define YPPUSHVERS_ORIG ((rpcvers_t)1)
330
331 /* Procedure symbols */
332
333 #define YPPUSHPROC_NULL ((rpcproc_t)0)
334 #define YPPUSHPROC_XFRRESP ((rpcproc_t)1)
335
336 struct yppushresp_xfr {
337 unsigned int transid;
338 unsigned int status;
339 };
340
341 /* Status values for yppushresp_xfr.status */
342
343 #define YPPUSH_SUCC (1) /* Success */
344 #define YPPUSH_AGE (2) /* Master's version not newer */
345 #define YPPUSH_NOMAP (-1) /* Can't find server for map */
346 #define YPPUSH_NODOM (-2) /* Domain not supported */
347 #define YPPUSH_RSRC (-3) /* Local resouce alloc failure */
348 #define YPPUSH_RPC (-4) /* RPC failure talking to server */
349 #define YPPUSH_MADDR (-5) /* Can't get master address */
350 #define YPPUSH_YPERR (-6) /* YP server/map db error */
351 #define YPPUSH_BADARGS (-7) /* Request arguments bad */
352 #define YPPUSH_DBM (-8) /* Local dbm operation failed */
353 #define YPPUSH_FILE (-9) /* Local file I/O operation failed */
354 #define YPPUSH_SKEW (-10) /* Map version skew during transfer */
355 #define YPPUSH_CLEAR (-11) /* Can't send "Clear" req to local */
356 /* ypserv */
357 #define YPPUSH_FORCE (-12) /* No local order number in map - */
358 /* use -f flag. */
359 #define YPPUSH_XFRERR (-13) /* ypxfr error */
360 #define YPPUSH_REFUSED (-14) /* Transfer request refused by ypserv */
361 #define YPPUSH_NOALIAS (-15) /* Alias not found for map or domain */
362
363 #ifdef __STDC__
364 extern bool xdr_datum(XDR *, datum *);
365 extern bool xdr_ypdomain_wrap_string(XDR *, char **);
366 extern bool xdr_ypmap_wrap_string(XDR *, char **);
367 extern bool xdr_ypreq_key(XDR *, struct ypreq_key *);
368 extern bool xdr_ypreq_nokey(XDR *, struct ypreq_nokey *);
369 extern bool xdr_ypreq_xfr(XDR *, struct ypreq_xfr *);
370 extern bool xdr_ypreq_newxfr(XDR *, struct ypreq_newxfr *);
371 extern bool xdr_ypresp_val(XDR *, struct ypresp_val *);
372 extern bool xdr_ypresp_key_val(XDR *, struct ypresp_key_val *);
373 extern bool xdr_ypmap_parms(XDR *, struct ypmap_parms *);
374 extern bool xdr_ypowner_wrap_string(XDR *, char **);
375 extern bool xdr_yppushresp_xfr(XDR *, struct yppushresp_xfr *);
376 extern bool xdr_ypresp_order(XDR *, struct ypresp_order *);
377 extern bool xdr_ypresp_master(XDR *, struct ypresp_master *);
378 extern bool xdr_ypall(XDR *, struct ypall_callback *);
379 extern bool xdr_ypresp_maplist(XDR *, struct ypresp_maplist *);
380
381 #else
382
383 extern bool xdr_datum();
384 extern bool xdr_ypdomain_wrap_string();
385 extern bool xdr_ypmap_wrap_string();
386 extern bool xdr_ypreq_key();
387 extern bool xdr_ypreq_nokey();
388 extern bool xdr_ypreq_xfr();
389 extern bool xdr_ypreq_newxfr();
390 extern bool xdr_ypresp_val();
391 extern bool xdr_ypresp_key_val();
392 extern bool xdr_yp_inaddr();
393 extern bool xdr_ypmap_parms();
394 extern bool xdr_ypowner_wrap_string();
395 extern bool xdr_yppushresp_xfr();
396 extern bool xdr_ypresp_order();
397 extern bool xdr_ypresp_master();
398 extern bool xdr_ypall();
399 extern bool xdr_ypresp_maplist();
400 #endif /* __STDC__ */
401
402 #ifdef __cplusplus
403 }
404 #endif
405
406 #endif /* _RPCSVC_YP_PROT_H */