]> git.saurik.com Git - apple/libinfo.git/blobdiff - rpc.subproj/pmap_getport.c
Libinfo-459.40.1.tar.gz
[apple/libinfo.git] / rpc.subproj / pmap_getport.c
index 30f774009069c99787004fc7554470f1e311be92..fd7e6e38cc3898e8c08cdfa4908a45d3217f3e00 100644 (file)
@@ -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@
  */
@@ -54,7 +53,7 @@
 #if defined(LIBC_SCCS) && !defined(lint)
 /*static char *sccsid = "from: @(#)pmap_getport.c 1.9 87/08/11 Copyr 1984 Sun Micro";*/
 /*static char *sccsid = "from: @(#)pmap_getport.c      2.2 88/08/01 4.0 RPCSRC";*/
-static char *rcsid = "$Id: pmap_getport.c,v 1.3 2002/02/19 20:36:24 epeyton Exp $";
+static char *rcsid = "$Id: pmap_getport.c,v 1.4 2004/12/19 22:45:44 zarzycki Exp $";
 #endif
 
 /*
@@ -71,8 +70,7 @@ static char *rcsid = "$Id: pmap_getport.c,v 1.3 2002/02/19 20:36:24 epeyton Exp
 #include <sys/socket.h>
 #include <net/if.h>
 
-static struct timeval timeout = { 5, 0 };
-static struct timeval tottimeout = { 60, 0 };
+static struct timeval default_timeout = { 5, 0 };
 
 /*
  * Find the mapped port for program,version.
@@ -80,35 +78,66 @@ static struct timeval tottimeout = { 60, 0 };
  * Returns 0 if no map exists.
  */
 u_short
-pmap_getport(address, program, version, protocol)
-       struct sockaddr_in *address;
-       u_long program;
-       u_long version;
-       u_int protocol;
+pmap_getport_timeout(struct sockaddr_in *address, uint32_t program, uint32_t version, uint32_t protocol, struct timeval *timeout, struct timeval *totaltimeout)
 {
-       u_short port = 0;
-       int socket = -1;
+       u_short port;
+       int socket;
        register CLIENT *client;
        struct pmap parms;
+       enum clnt_stat status;
+       struct timeval real_t, real_tt;
 
+       real_t = default_timeout;
+       if (timeout != NULL) real_t = *timeout;
+
+       real_tt = default_timeout;
+       if (totaltimeout != NULL) real_tt = *totaltimeout;
+
+       port = 0;
+       socket = -1;
        address->sin_port = htons(PMAPPORT);
-       client = clntudp_bufcreate(address, PMAPPROG,
-           PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
-       if (client != (CLIENT *)NULL) {
+       client = clntudp_bufcreate(address, PMAPPROG, PMAPVERS, real_t, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
+       if (client != NULL)
+       {
                parms.pm_prog = program;
                parms.pm_vers = version;
                parms.pm_prot = protocol;
-               parms.pm_port = 0;  /* not needed or used */
-               if (CLNT_CALL(client, PMAPPROC_GETPORT, xdr_pmap, &parms,
-                   xdr_u_short, &port, tottimeout) != RPC_SUCCESS){
+               /* not needed or used */
+               parms.pm_port = 0;
+
+               status = CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, &parms, (xdrproc_t)xdr_u_short, &port, real_tt);
+               if (status != RPC_SUCCESS)
+               {
                        rpc_createerr.cf_stat = RPC_PMAPFAILURE;
                        clnt_geterr(client, &rpc_createerr.cf_error);
-               } else if (port == 0) {
+               }
+               else if (port == 0)
+               {
                        rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
                }
+
                CLNT_DESTROY(client);
        }
-       (void)close(socket);
+
+       close(socket);
        address->sin_port = 0;
-       return (port);
+       return port;
 }
+
+u_short
+pmap_getport(address, program, version, protocol)
+#ifdef __LP64__
+       struct sockaddr_in *address;
+       uint32_t program;
+       uint32_t version;
+       uint32_t protocol;
+#else
+       struct sockaddr_in *address;
+       u_long program;
+       u_long version;
+       u_int protocol;
+#endif
+{
+       return pmap_getport_timeout(address, (uint32_t)program, (uint32_t)version, (uint32_t)protocol, NULL, NULL);
+}
+