summaryrefslogtreecommitdiffstats
path: root/lib/libc/rpc/get_myaddress.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-12-30 14:26:28 +0000
committerpeter <peter@FreeBSD.org>1996-12-30 14:26:28 +0000
commit7752667410fbfa8cd46494c95dc4ea3a474b923b (patch)
tree3856aa5f3174f3d52692cfeb974353cddcbe727f /lib/libc/rpc/get_myaddress.c
parent70466e9584d9a14eddf04bd7d27b9e56d8800d7f (diff)
downloadFreeBSD-src-7752667410fbfa8cd46494c95dc4ea3a474b923b.zip
FreeBSD-src-7752667410fbfa8cd46494c95dc4ea3a474b923b.tar.gz
- canonical function declaration
- don't exit. It's bad form for libc to exit() or abort() instead of returning an error. - only use loopback addresses after checking the real interfaces. Obtained from: a diff of FreeBSD vs. OpenBSD/NetBSD rpc code.
Diffstat (limited to 'lib/libc/rpc/get_myaddress.c')
-rw-r--r--lib/libc/rpc/get_myaddress.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/lib/libc/rpc/get_myaddress.c b/lib/libc/rpc/get_myaddress.c
index 3740094..84374ed 100644
--- a/lib/libc/rpc/get_myaddress.c
+++ b/lib/libc/rpc/get_myaddress.c
@@ -30,7 +30,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
/*static char *sccsid = "from: @(#)get_myaddress.c 1.4 87/08/11 Copyr 1984 Sun Micro";*/
/*static char *sccsid = "from: @(#)get_myaddress.c 2.1 88/07/29 4.0 RPCSRC";*/
-static char *rcsid = "$Id: get_myaddress.c,v 1.4 1996/06/08 22:54:51 jraynard Exp $";
+static char *rcsid = "$Id: get_myaddress.c,v 1.5 1996/11/22 23:37:08 pst Exp $";
#endif
/*
@@ -53,38 +53,45 @@ static char *rcsid = "$Id: get_myaddress.c,v 1.4 1996/06/08 22:54:51 jraynard Ex
/*
* don't use gethostbyname, which would invoke yellow pages
+ *
+ * Avoid loopback interfaces. We return information from a loopback
+ * interface only if there are no other possible interfaces.
*/
-void get_myaddress(addr)
+int
+get_myaddress(addr)
struct sockaddr_in *addr;
{
int s;
char buf[BUFSIZ];
struct ifconf ifc;
struct ifreq ifreq, *ifr, *end;
+ int loopback = 0, gotit = 0;
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- perror("get_myaddress: socket");
- exit(1);
+ return(-1);
}
ifc.ifc_len = sizeof (buf);
ifc.ifc_buf = buf;
if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {
- perror("get_myaddress: ioctl (get interface configuration)");
- exit(1);
+ close(s);
+ return(-1);
}
+again:
ifr = ifc.ifc_req;
end = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
while (ifr < end) {
ifreq = *ifr;
if (ioctl(s, SIOCGIFFLAGS, (char *)&ifreq) < 0) {
- perror("get_myaddress: ioctl");
- exit(1);
+ close(s);
+ return(-1);
}
if ((ifreq.ifr_flags & IFF_UP) &&
- ifr->ifr_addr.sa_family == AF_INET) {
+ ifr->ifr_addr.sa_family == AF_INET &&
+ (loopback == 1 && (ifreq.ifr_flags & IFF_LOOPBACK))) {
*addr = *((struct sockaddr_in *)&ifr->ifr_addr);
addr->sin_port = htons(PMAPPORT);
+ gotit = 1;
break;
}
if (ifr->ifr_addr.sa_len)
@@ -93,5 +100,10 @@ void get_myaddress(addr)
sizeof(struct sockaddr));
ifr++;
}
+ if (gotit == 0 && loopback == 0) {
+ loopback = 1;
+ goto again;
+ }
(void) close(s);
+ return (0);
}
OpenPOWER on IntegriCloud