#include <errno.h>
#include <grp.h>
+#include "sockaddr.h"
#include "xlog.h"
#include "nsm.h"
#include "nfsrpc.h"
+#ifndef HAVE_DECL_AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0
+#endif
+
#define NSM_TIMEOUT 2
#define NSM_MAX_TIMEOUT 120 /* don't make this too big */
struct nsm_host {
struct nsm_host * next;
char * name;
+ char * mon_name;
+ char * my_name;
struct addrinfo *ai;
time_t last_used;
time_t send_next;
static struct nsm_host * hosts = NULL;
-static struct addrinfo *smn_lookup(const char *name)
+__attribute_malloc__
+static struct addrinfo *
+smn_lookup(const char *name)
{
- struct addrinfo *ai, hint = {
-#if HAVE_DECL_AI_ADDRCONFIG
+ struct addrinfo *ai = NULL;
+ struct addrinfo hint = {
.ai_flags = AI_ADDRCONFIG,
-#endif /* HAVE_DECL_AI_ADDRCONFIG */
- .ai_family = AF_INET,
- .ai_protocol = IPPROTO_UDP,
+ .ai_family = (nsm_family == AF_INET ? AF_INET: AF_UNSPEC),
+ .ai_protocol = (int)IPPROTO_UDP,
};
int error;
error = getaddrinfo(name, NULL, &hint, &ai);
- if (error) {
+ if (error != 0) {
xlog(D_GENERAL, "getaddrinfo(3): %s", gai_strerror(error));
return NULL;
}
__attribute_malloc__
static struct nsm_host *
-smn_alloc_host(const char *hostname, const time_t timestamp)
+smn_alloc_host(const char *hostname, const char *mon_name,
+ const char *my_name, const time_t timestamp)
{
struct nsm_host *host;
goto out_nomem;
host->name = strdup(hostname);
- if (host->name == NULL) {
+ host->mon_name = strdup(mon_name);
+ host->my_name = strdup(my_name);
+ if (host->name == NULL ||
+ host->mon_name == NULL ||
+ host->my_name == NULL) {
+ free(host->my_name);
+ free(host->mon_name);
+ free(host->name);
free(host);
goto out_nomem;
}
static void smn_forget_host(struct nsm_host *host)
{
- xlog(D_CALL, "Removing %s from notify list", host->name);
+ xlog(D_CALL, "Removing %s (%s, %s) from notify list",
+ host->name, host->mon_name, host->my_name);
- nsm_delete_notified_host(host->name);
+ nsm_delete_notified_host(host->name, host->mon_name, host->my_name);
+ free(host->my_name);
+ free(host->mon_name);
free(host->name);
if (host->ai)
freeaddrinfo(host->ai);
static unsigned int
smn_get_host(const char *hostname,
__attribute__ ((unused)) const struct sockaddr *sap,
- __attribute__ ((unused)) const struct mon *m,
- const time_t timestamp)
+ const struct mon *m, const time_t timestamp)
{
struct nsm_host *host;
- host = smn_alloc_host(hostname, timestamp);
+ host = smn_alloc_host(hostname,
+ m->mon_id.mon_name, m->mon_id.my_id.my_name, timestamp);
if (host == NULL)
return 0;