X-Git-Url: https://git.saurik.com/apple/libinfo.git/blobdiff_plain/ccd4a120fd72e1cd2071458320f7a1914ef55421..f64cfb2378dc3a60cd30c50180a366ec54b98781:/nis.subproj/yp_order.c diff --git a/nis.subproj/yp_order.c b/nis.subproj/yp_order.c index 294fa81..72946d7 100644 --- a/nis.subproj/yp_order.c +++ b/nis.subproj/yp_order.c @@ -3,22 +3,21 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights + * Reserved. This file contains Original Code and/or Modifications of + * Original Code as defined in and that are subject to the Apple Public + * Source License Version 1.1 (the "License"). You may not use this file + * except in compliance with the License. Please obtain a copy of the + * License at http://www.apple.com/publicsource and read it before using + * this file. * * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. + * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -83,7 +82,8 @@ yp_order(indomain, inmap, outorder) struct ypresp_order ypro; struct ypreq_nokey yprnk; struct timeval tv; - int r = 0; + int tries = 0, r = 0; + static int proto = YP_BIND_UDP; if (indomain == NULL || *indomain == '\0' || strlen(indomain) > YPMAXDOMAIN || inmap == NULL || @@ -103,7 +103,7 @@ again: (void)memset(&ypro, 0, sizeof ypro); r = clnt_call(ysd->dom_client, YPPROC_ORDER, - xdr_ypreq_nokey, &yprnk, xdr_ypresp_order, &ypro, tv); + (xdrproc_t)xdr_ypreq_nokey, &yprnk, (xdrproc_t)xdr_ypresp_order, &ypro, tv); /* * XXX * NIS+ YP emulation package does not impliment YPPROC_ORDER @@ -112,13 +112,21 @@ again: r = YPERR_YPERR; goto bail; } - if (r != RPC_SUCCESS) { - clnt_perror(ysd->dom_client, "yp_order: clnt_call"); - ysd->dom_vers = -1; + + if (r != RPC_SUCCESS) + { + /* call failed - switch protocols and try again */ + if (tries++) clnt_perror(ysd->dom_client, "yp_order: clnt_call"); + + if (proto == YP_BIND_UDP) proto = YP_BIND_TCP; + else proto = YP_BIND_UDP; + ysd->dom_vers = proto; + goto again; } + *outorder = ypro.ordernum; - xdr_free(xdr_ypresp_order, (char *) &ypro); + xdr_free((xdrproc_t)xdr_ypresp_order, (char *) &ypro); r = ypprot_err(ypro.stat); bail: _yp_unbind(ysd);