summaryrefslogtreecommitdiffstats
path: root/utils/statd
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2008-09-26 13:24:24 -0400
committerSteve Dickson <steved@redhat.com>2008-09-26 13:24:24 -0400
commit93e355bf3a07b7565d88c1139ff24d1eb4f0a275 (patch)
tree6d2d1cd1a8102d7127572504bf34934640737dfe /utils/statd
parent7862a784c2990b1f5330959d30069a637a041715 (diff)
downloadnfs-utils-93e355bf3a07b7565d88c1139ff24d1eb4f0a275.tar.gz
nfs-utils-93e355bf3a07b7565d88c1139ff24d1eb4f0a275.tar.xz
nfs-utils-93e355bf3a07b7565d88c1139ff24d1eb4f0a275.zip
sm-notify command: replace nsm_address typedef
Clean up: replace "typedef struct sockaddr_storage nsm_address" with standard socket address types. This makes sm-notify.c consistent with other parts of nfs-utils, and with typical network application coding conventions. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/statd')
-rw-r--r--utils/statd/sm-notify.c129
1 files changed, 63 insertions, 66 deletions
diff --git a/utils/statd/sm-notify.c b/utils/statd/sm-notify.c
index e5ca904..8108765 100644
--- a/utils/statd/sm-notify.c
+++ b/utils/statd/sm-notify.c
@@ -53,13 +53,11 @@ char *_SM_BAK_PATH = DEFAULT_SM_BAK_PATH;
#define NSM_MAX_TIMEOUT 120 /* don't make this too big */
#define MAXMSGSIZE 256
-typedef struct sockaddr_storage nsm_address;
-
struct nsm_host {
struct nsm_host * next;
char * name;
char * path;
- nsm_address addr;
+ struct sockaddr_storage addr;
struct addrinfo *ai;
time_t last_used;
time_t send_next;
@@ -86,9 +84,6 @@ static void backup_hosts(const char *, const char *);
static void get_hosts(const char *);
static void insert_host(struct nsm_host *);
struct nsm_host * find_host(uint32_t);
-static int addr_get_port(nsm_address *);
-static void addr_set_port(nsm_address *, int);
-static struct addrinfo *host_lookup(int, const char *);
void nsm_log(int fac, const char *fmt, ...);
static int record_pid(void);
static void drop_privs(void);
@@ -96,6 +91,46 @@ static void set_kernel_nsm_state(int state);
static struct nsm_host * hosts = NULL;
+/*
+ * Address handling utilities
+ */
+
+static unsigned short smn_get_port(const struct sockaddr *sap)
+{
+ switch (sap->sa_family) {
+ case AF_INET:
+ return ntohs(((struct sockaddr_in *)sap)->sin_port);
+ case AF_INET6:
+ return ntohs(((struct sockaddr_in6 *)sap)->sin6_port);
+ }
+ return 0;
+}
+
+static void smn_set_port(struct sockaddr *sap, const unsigned short port)
+{
+ switch (sap->sa_family) {
+ case AF_INET:
+ ((struct sockaddr_in *)sap)->sin_port = htons(port);
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *)sap)->sin6_port = htons(port);
+ break;
+ }
+}
+
+static struct addrinfo *smn_lookup(const sa_family_t family, const char *name)
+{
+ struct addrinfo *ai, hint = {
+ .ai_family = family,
+ .ai_protocol = IPPROTO_UDP,
+ };
+
+ if (getaddrinfo(name, NULL, &hint, &ai) != 0)
+ return NULL;
+
+ return ai;
+}
+
int
main(int argc, char **argv)
{
@@ -217,7 +252,8 @@ usage: fprintf(stderr,
void
notify(void)
{
- nsm_address local_addr;
+ struct sockaddr_storage address;
+ struct sockaddr *local_addr = (struct sockaddr *)&address;
time_t failtime = 0;
int sock = -1;
int retry_cnt = 0;
@@ -231,12 +267,12 @@ notify(void)
}
fcntl(sock, F_SETFL, O_NONBLOCK);
- memset(&local_addr, 0, sizeof(local_addr));
- local_addr.ss_family = AF_INET; /* Default to IPv4 */
+ memset(&address, 0, sizeof(address));
+ local_addr->sa_family = AF_INET; /* Default to IPv4 */
/* Bind source IP if provided on command line */
if (opt_srcaddr) {
- struct addrinfo *ai = host_lookup(AF_INET, opt_srcaddr);
+ struct addrinfo *ai = smn_lookup(AF_INET, opt_srcaddr);
if (!ai) {
nsm_log(LOG_ERR,
"Not a valid hostname or address: \"%s\"",
@@ -245,7 +281,7 @@ notify(void)
}
/* We know it's IPv4 at this point */
- memcpy(&local_addr, ai->ai_addr, ai->ai_addrlen);
+ memcpy(local_addr, ai->ai_addr, ai->ai_addrlen);
freeaddrinfo(ai);
}
@@ -253,15 +289,15 @@ notify(void)
/* Use source port if provided on the command line,
* otherwise use bindresvport */
if (opt_srcport) {
- addr_set_port(&local_addr, opt_srcport);
- if (bind(sock, (struct sockaddr *) &local_addr, sizeof(local_addr)) < 0) {
+ smn_set_port(local_addr, opt_srcport);
+ if (bind(sock, local_addr, sizeof(struct sockaddr_in)) < 0) {
nsm_log(LOG_ERR, "Failed to bind RPC socket: %s",
strerror(errno));
exit(1);
}
} else {
struct servent *se;
- struct sockaddr_in *sin = (struct sockaddr_in *)&local_addr;
+ struct sockaddr_in *sin = (struct sockaddr_in *)local_addr;
(void) bindresvport(sock, sin);
/* try to avoid known ports */
se = getservbyport(sin->sin_port, "udp");
@@ -339,8 +375,10 @@ notify(void)
int
notify_host(int sock, struct nsm_host *host)
{
+ struct sockaddr_storage address;
+ struct sockaddr *dest = (struct sockaddr *)&address;
+ socklen_t destlen = sizeof(address);
static unsigned int xid = 0;
- nsm_address dest;
uint32_t msgbuf[MAXMSGSIZE], *p;
unsigned int len;
@@ -350,7 +388,7 @@ notify_host(int sock, struct nsm_host *host)
host->xid = xid++;
if (host->ai == NULL) {
- host->ai = host_lookup(AF_UNSPEC, host->name);
+ host->ai = smn_lookup(AF_UNSPEC, host->name);
if (host->ai == NULL) {
nsm_log(LOG_WARNING,
"%s doesn't seem to be a valid address,"
@@ -384,16 +422,16 @@ notify_host(int sock, struct nsm_host *host)
/* put first entry at end */
*next = first;
memcpy(&host->addr, first->ai_addr, first->ai_addrlen);
- addr_set_port(&host->addr, 0);
+ smn_set_port((struct sockaddr *)&host->addr, 0);
host->retries = 0;
}
- dest = host->addr;
- if (addr_get_port(&dest) == 0) {
+ memcpy(dest, &host->addr, destlen);
+ if (smn_get_port(dest) == 0) {
/* Build a PMAP packet */
nsm_log(LOG_DEBUG, "Sending portmap query to %s", host->name);
- addr_set_port(&dest, 111);
+ smn_set_port(dest, 111);
*p++ = htonl(100000);
*p++ = htonl(2);
*p++ = htonl(3);
@@ -427,7 +465,7 @@ notify_host(int sock, struct nsm_host *host)
}
len = (p - msgbuf) << 2;
- if (sendto(sock, msgbuf, len, 0, (struct sockaddr *) &dest, sizeof(dest)) < 0)
+ if (sendto(sock, msgbuf, len, 0, dest, destlen) < 0)
nsm_log(LOG_WARNING, "Sending Reboot Notification to "
"'%s' failed: errno %d (%s)", host->name, errno, strerror(errno));
@@ -441,6 +479,7 @@ void
recv_reply(int sock)
{
struct nsm_host *hp;
+ struct sockaddr *sap;
uint32_t msgbuf[MAXMSGSIZE], *p, *end;
uint32_t xid;
int res;
@@ -466,8 +505,9 @@ recv_reply(int sock)
this reply */
if ((hp = find_host(xid)) == NULL)
return;
+ sap = (struct sockaddr *)&hp->addr;
- if (addr_get_port(&hp->addr) == 0) {
+ if (smn_get_port(sap) == 0) {
/* This was a portmap request */
unsigned int port;
@@ -483,7 +523,7 @@ recv_reply(int sock)
hp->timeout = NSM_MAX_TIMEOUT;
hp->send_next += NSM_MAX_TIMEOUT;
} else {
- addr_set_port(&hp->addr, port);
+ smn_set_port(sap, port);
if (hp->timeout >= NSM_MAX_TIMEOUT / 4)
hp->timeout = NSM_MAX_TIMEOUT / 4;
}
@@ -696,49 +736,6 @@ nsm_get_state(int update)
}
/*
- * Address handling utilities
- */
-
-int
-addr_get_port(nsm_address *addr)
-{
- switch (((struct sockaddr *) addr)->sa_family) {
- case AF_INET:
- return ntohs(((struct sockaddr_in *) addr)->sin_port);
- case AF_INET6:
- return ntohs(((struct sockaddr_in6 *) addr)->sin6_port);
- }
- return 0;
-}
-
-static void
-addr_set_port(nsm_address *addr, int port)
-{
- switch (((struct sockaddr *) addr)->sa_family) {
- case AF_INET:
- ((struct sockaddr_in *) addr)->sin_port = htons(port);
- break;
- case AF_INET6:
- ((struct sockaddr_in6 *) addr)->sin6_port = htons(port);
- }
-}
-
-static struct addrinfo *
-host_lookup(int af, const char *name)
-{
- struct addrinfo hints, *ai;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = af;
- hints.ai_protocol = IPPROTO_UDP;
-
- if (getaddrinfo(name, NULL, &hints, &ai) != 0)
- return NULL;
-
- return ai;
-}
-
-/*
* Log a message
*/
void