From a8449be2ab58d67d5028a280f94e661358b58e97 Mon Sep 17 00:00:00 2001
From: Jeff Layton <jlayton@redhat.com>
Date: Mon, 11 Jan 2010 19:52:47 -0500
Subject: [PATCH] nfs-utils: make private cookie to hex conversion a library
 routine

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
 support/include/nsm.h |  2 ++
 support/nsm/file.c    | 44 +++++++++++++++++++++++++++++++++----------
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/support/include/nsm.h b/support/include/nsm.h
index 7554493..28314d1 100644
--- a/support/include/nsm.h
+++ b/support/include/nsm.h
@@ -60,5 +60,7 @@ extern _Bool	nsm_insert_monitored_host(const char *hostname,
 			const struct sockaddr *sap, const struct mon *m);
 extern void	nsm_delete_monitored_host(const char *hostname);
 extern void	nsm_delete_notified_host(const char *hostname);
+extern size_t	nsm_priv_to_hex(const char *priv, char *buf,
+				const size_t buflen);
 
 #endif	/* !NFS_UTILS_SUPPORT_NSM_H */
diff --git a/support/nsm/file.c b/support/nsm/file.c
index 4dfc235..fc3241a 100644
--- a/support/nsm/file.c
+++ b/support/nsm/file.c
@@ -517,6 +517,33 @@ nsm_retire_monitored_hosts(void)
 	return count;
 }
 
+/*
+ * nsm_priv_to_hex - convert a NSM private cookie to a hex string.
+ *
+ * @priv: buffer holding the binary NSM private cookie
+ * @buf: output buffer for NULL terminated hex string
+ * @buflen: size of output buffer
+ *
+ * Returns the length of the resulting string or 0 on error
+ */
+size_t
+nsm_priv_to_hex(const char *priv, char *buf, const size_t buflen)
+{
+	int i, len;
+	size_t remaining = buflen;
+
+	for (i = 0; i < SM_PRIV_SIZE; i++) {
+		len = snprintf(buf, remaining, "%02x",
+				(unsigned int)(0xff & priv[i]));
+		if (error_check(len, remaining))
+			return 0;
+		buf += len;
+		remaining -= (size_t)len;
+	}
+
+	return buflen - remaining;
+}
+
 /*
  * Returns the length in bytes of the created record.
  */
@@ -526,8 +553,8 @@ nsm_create_monitor_record(char *buf, const size_t buflen,
 		const struct sockaddr *sap, const struct mon *m)
 {
 	const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;
-	size_t remaining = buflen;
-	int i, len;
+	size_t hexlen, remaining = buflen;
+	int len;
 
 	len = snprintf(buf, remaining, "%08x %08x %08x %08x ",
 			(unsigned int)sin->sin_addr.s_addr,
@@ -539,14 +566,11 @@ nsm_create_monitor_record(char *buf, const size_t buflen,
 	buf += len;
 	remaining -= (size_t)len;
 
-	for (i = 0; i < SM_PRIV_SIZE; i++) {
-		len = snprintf(buf, remaining, "%02x",
-				(unsigned int)(0xff & m->priv[i]));
-		if (error_check(len, remaining))
-			return 0;
-		buf += len;
-		remaining -= (size_t)len;
-	}
+	hexlen = nsm_priv_to_hex(m->priv, buf, remaining);
+	if (hexlen == 0)
+		return 0;
+	buf += hexlen;
+	remaining -= hexlen;
 
 	len = snprintf(buf, remaining, " %s %s\n",
 			m->mon_id.mon_name, m->mon_id.my_id.my_name);
-- 
2.39.5