(root)/
glibc-2.38/
sunrpc/
get_myaddr.c
       1  /*
       2   * get_myaddress.c
       3   *
       4   * Get client's IP address via ioctl.  This avoids using the yellowpages.
       5   * Copyright (c) 2010, Oracle America, Inc.
       6   *
       7   * Redistribution and use in source and binary forms, with or without
       8   * modification, are permitted provided that the following conditions are
       9   * met:
      10   *
      11   *     * Redistributions of source code must retain the above copyright
      12   *       notice, this list of conditions and the following disclaimer.
      13   *     * Redistributions in binary form must reproduce the above
      14   *       copyright notice, this list of conditions and the following
      15   *       disclaimer in the documentation and/or other materials
      16   *       provided with the distribution.
      17   *     * Neither the name of the "Oracle America, Inc." nor the names of its
      18   *       contributors may be used to endorse or promote products derived
      19   *       from this software without specific prior written permission.
      20   *
      21   *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      22   *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      23   *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
      24   *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
      25   *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
      26   *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      27   *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
      28   *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      29   *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
      30   *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
      31   *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      32   *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      33   */
      34  
      35  #include <rpc/types.h>
      36  #include <rpc/clnt.h>
      37  #include <rpc/pmap_prot.h>
      38  #include <sys/socket.h>
      39  #include <stdio.h>
      40  #include <unistd.h>
      41  #include <libintl.h>
      42  #include <net/if.h>
      43  #include <ifaddrs.h>
      44  #include <sys/ioctl.h>
      45  #include <netinet/in.h>
      46  #include <arpa/inet.h>
      47  #include <shlib-compat.h>
      48  
      49  /*
      50   * don't use gethostbyname, which would invoke yellow pages
      51   *
      52   * Avoid loopback interfaces.  We return information from a loopback
      53   * interface only if there are no other possible interfaces.
      54   */
      55  void
      56  get_myaddress (struct sockaddr_in *addr)
      57  {
      58    struct ifaddrs *ifa;
      59  
      60    if (getifaddrs (&ifa) != 0)
      61      {
      62        perror ("get_myaddress: getifaddrs");
      63        exit (1);
      64      }
      65  
      66    int loopback = 0;
      67    struct ifaddrs *run;
      68  
      69   again:
      70    run = ifa;
      71    while (run != NULL)
      72      {
      73        if ((run->ifa_flags & IFF_UP)
      74  	  && run->ifa_addr != NULL
      75  	  && run->ifa_addr->sa_family == AF_INET
      76  	  && (!(run->ifa_flags & IFF_LOOPBACK)
      77  	      || (loopback == 1 && (run->ifa_flags & IFF_LOOPBACK))))
      78  	{
      79  	  *addr = *((struct sockaddr_in *) run->ifa_addr);
      80  	  addr->sin_port = htons (PMAPPORT);
      81  	  goto out;
      82  	}
      83  
      84        run = run->ifa_next;
      85      }
      86  
      87    if (loopback == 0)
      88      {
      89        loopback = 1;
      90        goto again;
      91      }
      92   out:
      93    freeifaddrs (ifa);
      94  
      95    /* The function is horribly specified.  It does not return any error
      96       if no interface is up.  Probably this won't happen (at least
      97       loopback is there) but still...  */
      98  }
      99  #ifdef EXPORT_RPC_SYMBOLS
     100  libc_hidden_def (get_myaddress)
     101  #else
     102  libc_hidden_nolink_sunrpc (get_myaddress, GLIBC_2_0)
     103  #endif