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 2014 Garrett D'Amore <garrett@damore.org>
  24  *
  25  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  26  * Use is subject to license terms.
  27  */
  28 
  29 /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
  30 /*        All Rights Reserved   */
  31 
  32 /*
  33  * Portions of this source code were derived from Berkeley 4.3 BSD
  34  * under license from the Regents of the University of California.
  35  */
  36 
  37 #ifndef _RPCSVC_YP_PROT_H
  38 #define _RPCSVC_YP_PROT_H
  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 extern bool xdr_datum(XDR *, datum *);
 364 extern bool xdr_ypdomain_wrap_string(XDR *, char **);
 365 extern bool xdr_ypmap_wrap_string(XDR *, char **);
 366 extern bool xdr_ypreq_key(XDR *, struct ypreq_key *);
 367 extern bool xdr_ypreq_nokey(XDR *, struct ypreq_nokey *);
 368 extern bool xdr_ypreq_xfr(XDR *, struct ypreq_xfr *);
 369 extern bool xdr_ypreq_newxfr(XDR *, struct ypreq_newxfr *);
 370 extern bool xdr_ypresp_val(XDR *, struct ypresp_val *);
 371 extern bool xdr_ypresp_key_val(XDR *, struct ypresp_key_val *);
 372 extern bool xdr_ypmap_parms(XDR *, struct ypmap_parms *);
 373 extern bool xdr_ypowner_wrap_string(XDR *, char **);
 374 extern bool xdr_yppushresp_xfr(XDR *, struct yppushresp_xfr *);
 375 extern bool xdr_ypresp_order(XDR *, struct ypresp_order *);
 376 extern bool xdr_ypresp_master(XDR *, struct ypresp_master *);
 377 extern bool xdr_ypall(XDR *, struct ypall_callback *);
 378 extern bool xdr_ypresp_maplist(XDR *, struct ypresp_maplist *);
 379 
 380 #ifdef __cplusplus
 381 }
 382 #endif
 383 
 384 #endif  /* _RPCSVC_YP_PROT_H */