(root)/
glibc-2.38/
sunrpc/
pm_getmaps.c
       1  /*
       2   * pmap_getmap.c
       3   * Client interface to pmap rpc service.
       4   * contains pmap_getmaps, which is only tcp service involved
       5   *
       6   * Copyright (c) 2010, Oracle America, Inc.
       7   *
       8   * Redistribution and use in source and binary forms, with or without
       9   * modification, are permitted provided that the following conditions are
      10   * met:
      11   *
      12   *     * Redistributions of source code must retain the above copyright
      13   *       notice, this list of conditions and the following disclaimer.
      14   *     * Redistributions in binary form must reproduce the above
      15   *       copyright notice, this list of conditions and the following
      16   *       disclaimer in the documentation and/or other materials
      17   *       provided with the distribution.
      18   *     * Neither the name of the "Oracle America, Inc." nor the names of its
      19   *       contributors may be used to endorse or promote products derived
      20   *       from this software without specific prior written permission.
      21   *
      22   *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      23   *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      24   *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
      25   *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
      26   *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
      27   *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      28   *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
      29   *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      30   *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
      31   *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
      32   *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      33   *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      34   */
      35  
      36  #include <rpc/rpc.h>
      37  #include <rpc/pmap_prot.h>
      38  #include <rpc/pmap_clnt.h>
      39  #include <sys/socket.h>
      40  #include <netdb.h>
      41  #include <stdbool.h>
      42  #include <stdio.h>
      43  #include <errno.h>
      44  #include <libintl.h>
      45  #include <unistd.h>
      46  #include <not-cancel.h>
      47  #include <shlib-compat.h>
      48  
      49  
      50  /*
      51   * Get a copy of the current port maps.
      52   * Calls the pmap service remotely to do get the maps.
      53   */
      54  struct pmaplist *
      55  pmap_getmaps (struct sockaddr_in *address)
      56  {
      57    struct pmaplist *head = (struct pmaplist *) NULL;
      58    struct timeval minutetimeout;
      59    CLIENT *client;
      60    bool closeit = false;
      61  
      62    minutetimeout.tv_sec = 60;
      63    minutetimeout.tv_usec = 0;
      64    address->sin_port = htons (PMAPPORT);
      65  
      66    /* Don't need a reserved port to get ports from the portmapper.  */
      67    int socket = __get_socket (address);
      68    if (socket != -1)
      69      closeit = true;
      70  
      71    client = clnttcp_create (address, PMAPPROG, PMAPVERS, &socket, 50, 500);
      72    if (client != (CLIENT *) NULL)
      73      {
      74        if (CLNT_CALL (client, PMAPPROC_DUMP, (xdrproc_t)xdr_void, NULL,
      75  		     (xdrproc_t)xdr_pmaplist, (caddr_t)&head,
      76  		     minutetimeout) != RPC_SUCCESS)
      77  	{
      78  	  clnt_perror (client, _("pmap_getmaps.c: rpc problem"));
      79  	}
      80        CLNT_DESTROY (client);
      81      }
      82    /* We only need to close the socket here if we opened  it.  */
      83    if (closeit)
      84      __close_nocancel (socket);
      85    address->sin_port = 0;
      86    return head;
      87  }
      88  libc_hidden_nolink_sunrpc (pmap_getmaps, GLIBC_2_0)