X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Frmtcall.c;h=7684b3b51eb142b3c7f18e760868cd0575521729;hp=474bbb4242b3a254ddb5af426abb53b130b9356c;hb=c481a5416e5b937541205da23cde15cdabf106c1;hpb=f50dd6fa181def466c455a9d019a3aacb1b33267 diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c index 474bbb4..7684b3b 100644 --- a/utils/statd/rmtcall.c +++ b/utils/statd/rmtcall.c @@ -20,12 +20,15 @@ * it won't if it's worth its money). */ -#include "config.h" +#ifdef HAVE_CONFIG_H +#include +#endif #include #include #include #include +#include #include #include #include @@ -34,6 +37,9 @@ #include #include #include +#ifdef HAVE_IFADDRS_H +#include +#endif /* HAVE_IFADDRS_H */ #include "sm_inter.h" #include "statd.h" #include "notlist.h" @@ -91,6 +97,52 @@ out_success: return sockfd; } +#ifdef HAVE_IFADDRS_H +/* + * Using the NL_ADDR(lp), reset (if needed) the hostname + * that will be put in the SM_NOTIFY to the hostname + * that is associated with the network interface + * that was monitored + */ +static void +reset_my_name(notify_list *lp) +{ + struct ifaddrs *ifa = NULL, *ifap; + struct in_addr netaddr, tmp; + struct sockaddr_in *sin, *nsin; + struct hostent *hp; + + netaddr.s_addr = inet_netof(NL_ADDR(lp)); + if (getifaddrs(&ifa) >= 0) { + for (ifap = ifa; ifap != NULL; ifap = ifap->ifa_next) { + if (!(ifap->ifa_flags & IFF_UP)) + continue; + + note(N_DEBUG, "ifa_name %s\n", ifap->ifa_name); + if (ifap->ifa_addr == NULL) + continue; + if (ifap->ifa_addr->sa_family != AF_INET) + continue; + + sin = (struct sockaddr_in *)ifap->ifa_addr; + nsin = (struct sockaddr_in *)ifap->ifa_netmask; + tmp.s_addr = sin->sin_addr.s_addr & nsin->sin_addr.s_addr; + if (memcmp(&tmp.s_addr, &netaddr.s_addr, sizeof(netaddr.s_addr))) + continue; + hp = gethostbyaddr((char *)&sin->sin_addr, + sizeof(sin->sin_addr), AF_INET); + if (hp == NULL) + continue; + if (strcmp(NL_MY_NAME(lp), hp->h_name)) { + free(NL_MY_NAME(lp)); + NL_MY_NAME(lp)= strdup(hp->h_name); + note(N_DEBUG, "NL_MY_NAME %s\n", NL_MY_NAME(lp)); + } + } + } + return; +} +#endif /* HAVE_IFADDRS_H */ /* * Try to resolve host name for notify/callback request * @@ -300,6 +352,7 @@ process_entry(int sockfd, notify_list *lp) { struct sockaddr_in sin; struct status new_status; + stat_chge new_stat; xdrproc_t func; void *objp; u_int32_t proc, vers, prog; @@ -326,9 +379,20 @@ process_entry(int sockfd, notify_list *lp) /* Use source address for notify replies */ sin.sin_addr = lp->addr; - + /* + * Unless a static hostname has been defined + * set the NL_MY_NAME(lp) hostname to the + * one associated with the network interface + */ +#ifdef HAVE_IFADDRS_H + if (!(run_mode & STATIC_HOSTNAME)) + reset_my_name(lp); +#endif /* HAVE_IFADDRS_H */ func = (xdrproc_t) xdr_stat_chge; - objp = &SM_stat_chge; + new_stat.state = MY_STATE; + new_stat.mon_name = NL_MY_NAME(lp); + + objp = &new_stat; break; case NOTIFY_CALLBACK: prog = NL_MY_PROG(lp);