>From 13afa2608e1e7d8e757295dda35fa1def1be663f Mon Sep 17 00:00:00 2001
From: Simo Sorce <simo@redhat.com>
Date: Mon, 8 Dec 2014 12:05:06 -0500
Subject: [PATCH 1/6] Generalize GSS Display Status logger code

This way it can be used both in stderr debugging as well as for sending
errors to syslog.

Signed-off-by: Simo Sorce <simo@redhat.com>
---
 proxy/Makefile.am    |  1 +
 proxy/src/gp_debug.c | 24 ++++--------------------
 proxy/src/gp_log.c   | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 proxy/src/gp_log.h   |  7 +++++++
 4 files changed, 63 insertions(+), 20 deletions(-)

diff --git a/proxy/Makefile.am b/proxy/Makefile.am
index 86b59334d7ceff1258f8ab1e3297240d88e76ec8..4ba129d92a211607164ca27e866ef277bbcd31d7 100644
--- a/proxy/Makefile.am
+++ b/proxy/Makefile.am
@@ -183,6 +183,7 @@ proxymech_la_LDFLAGS = \
 cli_srv_comm_SOURCES = \
     src/gp_conv.c \
     src/gp_debug.c \
+    src/gp_log.c \
     $(GP_RPCGEN_OBJ) \
     $(GP_RPCCLI_OBJ) \
     tests/cli_srv_comm.c
diff --git a/proxy/src/gp_debug.c b/proxy/src/gp_debug.c
index dbf7c4995ce0411c32e7f770b51afa1751504968..1312488b0a3209a49121b98516b84b1d1ca307b4 100644
--- a/proxy/src/gp_debug.c
+++ b/proxy/src/gp_debug.c
@@ -24,8 +24,8 @@
 */
 
 #include "config.h"
-#include <gssapi/gssapi.h>
 #include "gp_debug.h"
+#include "gp_log.h"
 
 /* global debug switch */
 int gp_debug;
@@ -38,25 +38,9 @@ void gp_debug_enable(void)
 
 void gp_log_failure(gss_OID mech, uint32_t maj, uint32_t min)
 {
-    uint32_t msgctx;
-    uint32_t discard;
-    gss_buffer_desc tmp;
+    char buf[MAX_LOG_LINE];
 
-    fprintf(stderr, "Failed with:");
+    gp_fmt_status(mech, maj, min, buf, MAX_LOG_LINE);
 
-    if (mech != GSS_C_NO_OID) {
-        gss_oid_to_str(&discard, mech, &tmp);
-        fprintf(stderr, " (OID: %s)", (char *)tmp.value);
-        gss_release_buffer(&discard, &tmp);
-    }
-
-    msgctx = 0;
-    gss_display_status(&discard, maj, GSS_C_GSS_CODE, mech, &msgctx, &tmp);
-    fprintf(stderr, " %s,", (char *)tmp.value);
-    gss_release_buffer(&discard, &tmp);
-
-    msgctx = 0;
-    gss_display_status(&discard, min, GSS_C_MECH_CODE, mech, &msgctx, &tmp);
-    fprintf(stderr, " %s\n", (char *)tmp.value);
-    gss_release_buffer(&discard, &tmp);
+    fprintf(stderr, "Failed with: %s\n", buf);
 }
diff --git a/proxy/src/gp_log.c b/proxy/src/gp_log.c
index 31006f6f4cc423491db6212cc2d6e92d29dad733..2fb3d7c447ce7b1e69eead53178cf3cd2bdf2771 100644
--- a/proxy/src/gp_log.c
+++ b/proxy/src/gp_log.c
@@ -23,7 +23,10 @@
    DEALINGS IN THE SOFTWARE.
 */
 
+#include "config.h"
 #include "gp_log.h"
+#include <stdio.h>
+#include <stdarg.h>
 
 void gp_logging_init(void)
 {
@@ -31,3 +34,51 @@ void gp_logging_init(void)
             LOG_CONS|LOG_NDELAY|LOG_NOWAIT|LOG_PERROR|LOG_PID,
             LOG_AUTHPRIV);
 }
+static size_t gp_append(char *buf, size_t max, const char *fmt, ...)
+{
+    va_list ap;
+    size_t res;
+
+    if (max <= 0) return 0;
+
+    va_start(ap, fmt);
+    res = vsnprintf(buf, max, fmt, ap);
+    va_end(ap);
+
+    return res;
+}
+
+void gp_fmt_status(gss_OID mech, uint32_t maj, uint32_t min,
+                   char *buf, size_t buf_size)
+{
+    uint32_t msgctx;
+    uint32_t discard;
+    gss_buffer_desc tmp;
+    size_t used = 0;
+
+    if (mech != GSS_C_NO_OID) {
+        gss_oid_to_str(&discard, mech, &tmp);
+        used += gp_append(buf + used, buf_size - used,
+                          "(OID: %s) ", (char *)tmp.value);
+        gss_release_buffer(&discard, &tmp);
+    }
+
+    msgctx = 0;
+    gss_display_status(&discard, maj, GSS_C_GSS_CODE, mech, &msgctx, &tmp);
+    used += gp_append(buf + used, buf_size - used, "%s, ", (char *)tmp.value);
+    gss_release_buffer(&discard, &tmp);
+
+    msgctx = 0;
+    gss_display_status(&discard, min, GSS_C_MECH_CODE, mech, &msgctx, &tmp);
+    used += gp_append(buf + used, buf_size - used, "%s", (char *)tmp.value);
+    gss_release_buffer(&discard, &tmp);
+}
+
+void gp_log_status(gss_OID mech, uint32_t maj, uint32_t min)
+{
+    char buf[MAX_LOG_LINE];
+
+    gp_fmt_status(mech, maj, min, buf, MAX_LOG_LINE);
+
+    GPERROR("%s\n", buf);
+}
diff --git a/proxy/src/gp_log.h b/proxy/src/gp_log.h
index f3549d1d4447122121155572d05e13ebc31cabed..36ed8d8e79e9491344d428c618cf48b6a237a842 100644
--- a/proxy/src/gp_log.h
+++ b/proxy/src/gp_log.h
@@ -27,10 +27,17 @@
 #define _GP_LOG_H_
 
 #include <syslog.h>
+#include <gssapi/gssapi.h>
 
+#define MAX_LOG_LINE 1024
 #define GPERROR(...) syslog(LOG_ERR, __VA_ARGS__);
 #define GPAUDIT(...) syslog(LOG_INFO, __VA_ARGS__);
 
 void gp_logging_init(void);
 
+void gp_fmt_status(gss_OID mech, uint32_t maj, uint32_t min,
+                   char *buf, size_t buf_size);
+
+void gp_log_status(gss_OID mech, uint32_t maj, uint32_t min);
+
 #endif /* _GP_LOG_H_ */
-- 
2.1.0

