Print this page
195 Need replacement for nfs/lockd+klm
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Jeremy Jones <jeremy@delphix.com>
Reviewed by: Jeff Biseda <jbiseda@delphix.com>

*** 23,32 **** --- 23,33 ---- * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */
*** 57,66 **** --- 58,69 ---- #include <arpa/inet.h> #include <netdb.h> #include <netdir.h> #include <synch.h> #include <thread.h> + #include <ifaddrs.h> + #include <errno.h> #include <assert.h> #include "sm_statd.h" static int local_state; /* fake local sm state */ /* client name-to-address translation table */
*** 87,99 **** extern int self_check(char *hostname); extern struct lifconf *getmyaddrs(void); /* ARGSUSED */ void ! sm_status(namep, resp) ! sm_name *namep; ! sm_stat_res *resp; { if (debug) (void) printf("proc sm_stat: mon_name = %s\n", namep->mon_name); --- 90,100 ---- extern int self_check(char *hostname); extern struct lifconf *getmyaddrs(void); /* ARGSUSED */ void ! sm_stat_svc(sm_name *namep, sm_stat_res *resp) { if (debug) (void) printf("proc sm_stat: mon_name = %s\n", namep->mon_name);
*** 102,114 **** resp->state = LOCAL_STATE; } /* ARGSUSED */ void ! sm_mon(monp, resp) ! mon *monp; ! sm_stat_res *resp; { mon_id *monidp; monidp = &monp->mon_id; rw_rdlock(&thr_rwlock); --- 103,113 ---- resp->state = LOCAL_STATE; } /* ARGSUSED */ void ! sm_mon_svc(mon *monp, sm_stat_res *resp) { mon_id *monidp; monidp = &monp->mon_id; rw_rdlock(&thr_rwlock);
*** 130,142 **** rw_unlock(&thr_rwlock); } /* ARGSUSED */ void ! sm_unmon(monidp, resp) ! mon_id *monidp; ! sm_stat *resp; { rw_rdlock(&thr_rwlock); if (debug) { (void) printf( "proc sm_unmon: mon_name = %s, [%s, %d, %d, %d]\n", --- 129,139 ---- rw_unlock(&thr_rwlock); } /* ARGSUSED */ void ! sm_unmon_svc(mon_id *monidp, sm_stat *resp) { rw_rdlock(&thr_rwlock); if (debug) { (void) printf( "proc sm_unmon: mon_name = %s, [%s, %d, %d, %d]\n",
*** 152,164 **** rw_unlock(&thr_rwlock); } /* ARGSUSED */ void ! sm_unmon_all(myidp, resp) ! my_id *myidp; ! sm_stat *resp; { rw_rdlock(&thr_rwlock); if (debug) (void) printf("proc sm_unmon_all: [%s, %d, %d, %d]\n", myidp->my_name, --- 149,159 ---- rw_unlock(&thr_rwlock); } /* ARGSUSED */ void ! sm_unmon_all_svc(my_id *myidp, sm_stat *resp) { rw_rdlock(&thr_rwlock); if (debug) (void) printf("proc sm_unmon_all: [%s, %d, %d, %d]\n", myidp->my_name,
*** 172,183 **** /* * Notifies lockd specified by name that state has changed for this server. */ void ! sm_notify(ntfp) ! stat_chge *ntfp; { rw_rdlock(&thr_rwlock); if (debug) (void) printf("sm_notify: %s state =%d\n", ntfp->mon_name, ntfp->state); --- 167,177 ---- /* * Notifies lockd specified by name that state has changed for this server. */ void ! sm_notify_svc(stat_chge *ntfp) { rw_rdlock(&thr_rwlock); if (debug) (void) printf("sm_notify: %s state =%d\n", ntfp->mon_name, ntfp->state);
*** 185,196 **** rw_unlock(&thr_rwlock); } /* ARGSUSED */ void ! sm_simu_crash(myidp) ! void *myidp; { int i; struct mon_entry *monitor_q; int found = 0; --- 179,189 ---- rw_unlock(&thr_rwlock); } /* ARGSUSED */ void ! sm_simu_crash_svc(void *myidp) { int i; struct mon_entry *monitor_q; int found = 0;
*** 725,735 **** thr_send_notice(void *arg) { moninfo_t *minfop; minfop = (moninfo_t *)arg; - if (statd_call_lockd(&minfop->id, minfop->state) == -1) { if (debug && minfop->id.mon_id.mon_name) (void) printf("problem with notifying %s failure, " "give up\n", minfop->id.mon_id.mon_name); } else { --- 718,727 ----
*** 757,776 **** mon *monp; int state; { enum clnt_stat clnt_stat; struct timeval tottimeout; ! struct status stat; my_id *my_idp; char *mon_name; int i; int rc = 0; CLIENT *clnt; mon_name = monp->mon_id.mon_name; my_idp = &monp->mon_id.my_id; ! (void) memset(&stat, 0, sizeof (struct status)); stat.mon_name = mon_name; stat.state = state; for (i = 0; i < 16; i++) { stat.priv[i] = monp->priv[i]; } --- 749,768 ---- mon *monp; int state; { enum clnt_stat clnt_stat; struct timeval tottimeout; ! struct sm_status stat; my_id *my_idp; char *mon_name; int i; int rc = 0; CLIENT *clnt; mon_name = monp->mon_id.mon_name; my_idp = &monp->mon_id.my_id; ! (void) memset(&stat, 0, sizeof (stat)); stat.mon_name = mon_name; stat.state = state; for (i = 0; i < 16; i++) { stat.priv[i] = monp->priv[i]; }
*** 779,794 **** stat.mon_name, stat.state); tottimeout.tv_sec = SM_RPC_TIMEOUT; tottimeout.tv_usec = 0; ! if ((clnt = create_client(my_idp->my_name, my_idp->my_prog, ! my_idp->my_vers, &tottimeout)) == (CLIENT *) NULL) { return (-1); } ! clnt_stat = clnt_call(clnt, my_idp->my_proc, xdr_status, (char *)&stat, xdr_void, NULL, tottimeout); if (debug) { (void) printf("clnt_stat=%s(%d)\n", clnt_sperrno(clnt_stat), clnt_stat); } --- 771,788 ---- stat.mon_name, stat.state); tottimeout.tv_sec = SM_RPC_TIMEOUT; tottimeout.tv_usec = 0; ! clnt = create_client(my_idp->my_name, my_idp->my_prog, my_idp->my_vers, ! "ticotsord", &tottimeout); ! if (clnt == NULL) { return (-1); } ! clnt_stat = clnt_call(clnt, my_idp->my_proc, ! xdr_sm_status, (char *)&stat, xdr_void, NULL, tottimeout); if (debug) { (void) printf("clnt_stat=%s(%d)\n", clnt_sperrno(clnt_stat), clnt_stat); }
*** 806,830 **** /* * Client handle created. */ CLIENT * ! create_client(host, prognum, versnum, utimeout) ! char *host; ! int prognum; ! int versnum; ! struct timeval *utimeout; { int fd; struct timeval timeout; CLIENT *client; struct t_info tinfo; ! if ((client = clnt_create_timed(host, prognum, versnum, ! "netpath", utimeout)) == NULL) { return (NULL); } (void) CLNT_CONTROL(client, CLGET_FD, (caddr_t)&fd); if (t_getinfo(fd, &tinfo) != -1) { if (tinfo.servtype == T_CLTS) { /* * Set time outs for connectionless case --- 800,838 ---- /* * Client handle created. */ CLIENT * ! create_client(char *host, int prognum, int versnum, char *netid, ! struct timeval *utimeout) { int fd; struct timeval timeout; CLIENT *client; struct t_info tinfo; ! if (netid == NULL) { ! client = clnt_create_timed(host, prognum, versnum, ! "netpath", utimeout); ! } else { ! struct netconfig *nconf; ! ! nconf = getnetconfigent(netid); ! if (nconf == NULL) { return (NULL); } + + client = clnt_tp_create_timed(host, prognum, versnum, nconf, + utimeout); + + freenetconfigent(nconf); + } + + if (client == NULL) { + return (NULL); + } + (void) CLNT_CONTROL(client, CLGET_FD, (caddr_t)&fd); if (t_getinfo(fd, &tinfo) != -1) { if (tinfo.servtype == T_CLTS) { /* * Set time outs for connectionless case
*** 1298,1303 **** --- 1306,1380 ---- memcmp(dst1, dst2, len) == 0) { return (0); } } return (1); + } + + /* + * Add IP address strings to the host_name list. + */ + void + merge_ips(void) + { + struct ifaddrs *ifap, *cifap; + int error; + + error = getifaddrs(&ifap); + if (error) { + syslog(LOG_WARNING, "getifaddrs error: '%s'", + strerror(errno)); + return; + } + + for (cifap = ifap; cifap != NULL; cifap = cifap->ifa_next) { + struct sockaddr *sa = cifap->ifa_addr; + char addr_str[INET6_ADDRSTRLEN]; + void *addr = NULL; + + switch (sa->sa_family) { + case AF_INET: { + struct sockaddr_in *sin = (struct sockaddr_in *)sa; + + /* Skip loopback addresses. */ + if (sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) { + continue; + } + + addr = &sin->sin_addr; + break; + } + + case AF_INET6: { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + + /* Skip loopback addresses. */ + if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr)) { + continue; + } + + addr = &sin6->sin6_addr; + break; + } + + default: + syslog(LOG_WARNING, "Unknown address family %d for " + "interface %s", sa->sa_family, cifap->ifa_name); + continue; + } + + if (inet_ntop(sa->sa_family, addr, addr_str, sizeof (addr_str)) + == NULL) { + syslog(LOG_WARNING, "Failed to convert address into " + "string representation for interface '%s' " + "address family %d", cifap->ifa_name, + sa->sa_family); + continue; + } + + if (!in_host_array(addr_str)) { + add_to_host_array(addr_str); + } + } + + freeifaddrs(ifap); }