From: Steve Dickson <SteveD@redhat.com>
To: nfs@lists.sourceforge.net
Subject: [PATCH] nfs-utils 5 of 10 - make sure the correct hostname is used in the SM_NOTIFY
Date: Fri, 23 Sep 2005 10:46:40 -0400 [thread overview]
Message-ID: <43341550.9010002@RedHat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 0 bytes --]
[-- Attachment #2: nfs-utils-1.0.6-statd-notify-hostname.patch --]
[-- Type: text/x-patch, Size: 3883 bytes --]
make sure the correct hostname is used in the SM_NOTIFY
message that is sent from a rebooted server which has
multiple network interfaces. (bz 139101)
Details can be found in:
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=139101
Signed-off-by: Steve Dickson <steved@redhat.com>
---------
--- nfs-utils-1.0.6/utils/statd/rmtcall.c.orig 2005-03-28 21:02:14.147173872 -0500
+++ nfs-utils-1.0.6/utils/statd/rmtcall.c 2005-03-28 21:03:32.401277440 -0500
@@ -26,6 +26,7 @@
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
+#include <net/if.h>
#include <arpa/inet.h>
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
@@ -34,6 +35,7 @@
#include <netdb.h>
#include <string.h>
#include <unistd.h>
+#include <ifaddrs.h>
#include "sm_inter.h"
#include "statd.h"
#include "notlist.h"
@@ -73,7 +75,50 @@ statd_get_socket(int port)
return sockfd;
}
-
+/*
+ * 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;
+}
/*
* Try to resolve host name for notify/callback request
*
@@ -283,6 +328,7 @@ process_entry(int sockfd, notify_list *l
{
struct sockaddr_in sin;
struct status new_status;
+ stat_chge new_stat;
xdrproc_t func;
void *objp;
u_int32_t proc, vers, prog;
@@ -309,9 +355,19 @@ process_entry(int sockfd, notify_list *l
/* 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
+ */
+ if (!(run_mode & STATIC_HOSTNAME))
+ reset_my_name(lp);
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);
--- nfs-utils-1.0.6/utils/statd/statd.c.orig 2005-03-28 21:02:15.575956664 -0500
+++ nfs-utils-1.0.6/utils/statd/statd.c 2005-03-28 21:02:39.200365208 -0500
@@ -288,6 +288,7 @@ int main (int argc, char **argv)
}
break;
case 'n': /* Specify local hostname */
+ run_mode |= STATIC_HOSTNAME;
MY_NAME = xstrdup(optarg);
break;
case 'P':
--- nfs-utils-1.0.6/utils/statd/statd.h.orig 2005-03-28 21:02:15.256005304 -0500
+++ nfs-utils-1.0.6/utils/statd/statd.h 2005-03-28 21:02:39.237359584 -0500
@@ -79,6 +79,7 @@ extern int run_mode;
/* LH - notify_only mode would be for notifying hosts on an IP alias
* that just came back up, for ex, when failing over a HA service to
* another host.... */
+#define STATIC_HOSTNAME 8 /* Always use the hostname set by -n */
/*
* Program name and version pointers -- See statd.c for the reasoning
reply other threads:[~2005-09-23 14:46 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=43341550.9010002@RedHat.com \
--to=steved@redhat.com \
--cc=nfs@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox