1 /*- 2 * Copyright (c) 2010, Oracle America, Inc. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following 12 * disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * * Neither the name of the "Oracle America, Inc." nor the names of its 15 * contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 25 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Protocol description file for the Yellow Pages Service 34 */ 35 36 const YPMAXRECORD = 16777216; 37 const YPMAXDOMAIN = 64; 38 const YPMAXMAP = 64; 39 const YPMAXPEER = 64; 40 41 42 enum ypstat { 43 YP_TRUE = 1, 44 YP_NOMORE = 2, 45 YP_FALSE = 0, 46 YP_NOMAP = -1, 47 YP_NODOM = -2, 48 YP_NOKEY = -3, 49 YP_BADOP = -4, 50 YP_BADDB = -5, 51 YP_YPERR = -6, 52 YP_BADARGS = -7, 53 YP_VERS = -8 54 }; 55 56 57 enum ypxfrstat { 58 YPXFR_SUCC = 1, 59 YPXFR_AGE = 2, 60 YPXFR_NOMAP = -1, 61 YPXFR_NODOM = -2, 62 YPXFR_RSRC = -3, 63 YPXFR_RPC = -4, 64 YPXFR_MADDR = -5, 65 YPXFR_YPERR = -6, 66 YPXFR_BADARGS = -7, 67 YPXFR_DBM = -8, 68 YPXFR_FILE = -9, 69 YPXFR_SKEW = -10, 70 YPXFR_CLEAR = -11, 71 YPXFR_FORCE = -12, 72 YPXFR_XFRERR = -13, 73 YPXFR_REFUSED = -14 74 }; 75 76 77 typedef string domainname<YPMAXDOMAIN>; 78 typedef string mapname<YPMAXMAP>; 79 typedef string peername<YPMAXPEER>; 80 typedef opaque keydat<YPMAXRECORD>; 81 typedef opaque valdat<YPMAXRECORD>; 82 83 84 struct ypmap_parms { 85 domainname domain; 86 mapname map; 87 unsigned int ordernum; 88 peername peer; 89 }; 90 91 struct ypreq_key { 92 domainname domain; 93 mapname map; 94 keydat key; 95 }; 96 97 struct ypreq_nokey { 98 domainname domain; 99 mapname map; 100 }; 101 102 struct ypreq_xfr { 103 ypmap_parms map_parms; 104 unsigned int transid; 105 unsigned int prog; 106 unsigned int port; 107 }; 108 109 110 struct ypresp_val { 111 ypstat stat; 112 valdat val; 113 }; 114 115 struct ypresp_key_val { 116 ypstat stat; 117 #ifdef STUPID_SUN_BUG /* These are backwards */ 118 keydat key; 119 valdat val; 120 #else 121 valdat val; 122 keydat key; 123 #endif 124 }; 125 126 127 struct ypresp_master { 128 ypstat stat; 129 peername peer; 130 }; 131 132 struct ypresp_order { 133 ypstat stat; 134 unsigned int ordernum; 135 }; 136 137 union ypresp_all switch (bool more) { 138 case TRUE: 139 ypresp_key_val val; 140 case FALSE: 141 void; 142 }; 143 144 struct ypresp_xfr { 145 unsigned int transid; 146 ypxfrstat xfrstat; 147 }; 148 149 struct ypmaplist { 150 mapname map; 151 ypmaplist *next; 152 }; 153 154 struct ypresp_maplist { 155 ypstat stat; 156 ypmaplist *maps; 157 }; 158 159 enum yppush_status { 160 YPPUSH_SUCC = 1, /* Success */ 161 YPPUSH_AGE = 2, /* Master's version not newer */ 162 YPPUSH_NOMAP = -1, /* Can't find server for map */ 163 YPPUSH_NODOM = -2, /* Domain not supported */ 164 YPPUSH_RSRC = -3, /* Local resource alloc failure */ 165 YPPUSH_RPC = -4, /* RPC failure talking to server */ 166 YPPUSH_MADDR = -5, /* Can't get master address */ 167 YPPUSH_YPERR = -6, /* YP server/map db error */ 168 YPPUSH_BADARGS = -7, /* Request arguments bad */ 169 YPPUSH_DBM = -8, /* Local dbm operation failed */ 170 YPPUSH_FILE = -9, /* Local file I/O operation failed */ 171 YPPUSH_SKEW = -10, /* Map version skew during transfer */ 172 YPPUSH_CLEAR = -11, /* Can't send "Clear" req to local ypserv */ 173 YPPUSH_FORCE = -12, /* No local order number in map use -f flag. */ 174 YPPUSH_XFRERR = -13, /* ypxfr error */ 175 YPPUSH_REFUSED = -14 /* Transfer request refused by ypserv */ 176 }; 177 178 struct yppushresp_xfr { 179 unsigned transid; 180 yppush_status status; 181 }; 182 183 /* 184 * Response structure and overall result status codes. Success and failure 185 * represent two separate response message types. 186 */ 187 188 enum ypbind_resptype { 189 YPBIND_SUCC_VAL = 1, 190 YPBIND_FAIL_VAL = 2 191 }; 192 193 struct ypbind_binding { 194 opaque ypbind_binding_addr[4]; /* In network order */ 195 opaque ypbind_binding_port[2]; /* In network order */ 196 }; 197 198 union ypbind_resp switch (ypbind_resptype ypbind_status) { 199 case YPBIND_FAIL_VAL: 200 unsigned ypbind_error; 201 case YPBIND_SUCC_VAL: 202 ypbind_binding ypbind_bindinfo; 203 }; 204 205 /* Detailed failure reason codes for response field ypbind_error*/ 206 207 const YPBIND_ERR_ERR = 1; /* Internal error */ 208 const YPBIND_ERR_NOSERV = 2; /* No bound server for passed domain */ 209 const YPBIND_ERR_RESC = 3; /* System resource allocation failure */ 210 211 212 /* 213 * Request data structure for ypbind "Set domain" procedure. 214 */ 215 struct ypbind_setdom { 216 domainname ypsetdom_domain; 217 ypbind_binding ypsetdom_binding; 218 unsigned ypsetdom_vers; 219 }; 220 221 222 /* 223 * NIS v1 support for backwards compatibility 224 */ 225 enum ypreqtype { 226 YPREQ_KEY = 1, 227 YPREQ_NOKEY = 2, 228 YPREQ_MAP_PARMS = 3 229 }; 230 231 enum ypresptype { 232 YPRESP_VAL = 1, 233 YPRESP_KEY_VAL = 2, 234 YPRESP_MAP_PARMS = 3 235 }; 236 237 union yprequest switch (ypreqtype yp_reqtype) { 238 case YPREQ_KEY: 239 ypreq_key yp_req_keytype; 240 case YPREQ_NOKEY: 241 ypreq_nokey yp_req_nokeytype; 242 case YPREQ_MAP_PARMS: 243 ypmap_parms yp_req_map_parmstype; 244 }; 245 246 union ypresponse switch (ypresptype yp_resptype) { 247 case YPRESP_VAL: 248 ypresp_val yp_resp_valtype; 249 case YPRESP_KEY_VAL: 250 ypresp_key_val yp_resp_key_valtype; 251 case YPRESP_MAP_PARMS: 252 ypmap_parms yp_resp_map_parmstype; 253 }; 254 255 #if !defined(YPBIND_ONLY) && !defined(YPPUSH_ONLY) 256 /* 257 * YP access protocol 258 */ 259 program YPPROG { 260 /* 261 * NIS v1 support for backwards compatibility 262 */ 263 version YPOLDVERS { 264 void 265 YPOLDPROC_NULL(void) = 0; 266 267 bool 268 YPOLDPROC_DOMAIN(domainname) = 1; 269 270 bool 271 YPOLDPROC_DOMAIN_NONACK(domainname) = 2; 272 273 ypresponse 274 YPOLDPROC_MATCH(yprequest) = 3; 275 276 ypresponse 277 YPOLDPROC_FIRST(yprequest) = 4; 278 279 ypresponse 280 YPOLDPROC_NEXT(yprequest) = 5; 281 282 ypresponse 283 YPOLDPROC_POLL(yprequest) = 6; 284 285 ypresponse 286 YPOLDPROC_PUSH(yprequest) = 7; 287 288 ypresponse 289 YPOLDPROC_PULL(yprequest) = 8; 290 291 ypresponse 292 YPOLDPROC_GET(yprequest) = 9; 293 } = 1; 294 295 version YPVERS { 296 void 297 YPPROC_NULL(void) = 0; 298 299 bool 300 YPPROC_DOMAIN(domainname) = 1; 301 302 bool 303 YPPROC_DOMAIN_NONACK(domainname) = 2; 304 305 ypresp_val 306 YPPROC_MATCH(ypreq_key) = 3; 307 308 ypresp_key_val 309 #ifdef STUPID_SUN_BUG /* should be ypreq_nokey */ 310 YPPROC_FIRST(ypreq_key) = 4; 311 #else 312 YPPROC_FIRST(ypreq_nokey) = 4; 313 #endif 314 ypresp_key_val 315 YPPROC_NEXT(ypreq_key) = 5; 316 317 ypresp_xfr 318 YPPROC_XFR(ypreq_xfr) = 6; 319 320 void 321 YPPROC_CLEAR(void) = 7; 322 323 ypresp_all 324 YPPROC_ALL(ypreq_nokey) = 8; 325 326 ypresp_master 327 YPPROC_MASTER(ypreq_nokey) = 9; 328 329 ypresp_order 330 YPPROC_ORDER(ypreq_nokey) = 10; 331 332 ypresp_maplist 333 YPPROC_MAPLIST(domainname) = 11; 334 } = 2; 335 } = 100004; 336 #endif 337 #if !defined(YPSERV_ONLY) && !defined(YPBIND_ONLY) 338 /* 339 * YPPUSHPROC_XFRRESP is the callback routine for result of YPPROC_XFR 340 */ 341 program YPPUSH_XFRRESPPROG { 342 version YPPUSH_XFRRESPVERS { 343 void 344 YPPUSHPROC_NULL(void) = 0; 345 #ifdef STUPID_SUN_BUG /* argument and return value are backwards */ 346 yppushresp_xfr 347 YPPUSHPROC_XFRRESP(void) = 1; 348 #else 349 void 350 YPPUSHPROC_XFRRESP(yppushresp_xfr) = 1; 351 #endif 352 } = 1; 353 } = 0x40000000; /* transient: could be anything up to 0x5fffffff */ 354 #endif 355 #if !defined(YPSERV_ONLY) && !defined(YPPUSH_ONLY) 356 /* 357 * YP binding protocol 358 */ 359 program YPBINDPROG { 360 version YPBINDVERS { 361 void 362 YPBINDPROC_NULL(void) = 0; 363 364 ypbind_resp 365 YPBINDPROC_DOMAIN(domainname) = 1; 366 367 void 368 YPBINDPROC_SETDOM(ypbind_setdom) = 2; 369 } = 2; 370 } = 100007; 371 372 #endif 373