This patch transitions from printf-like to syslog-like API for
libcldc diagnostics. In the future, this allows to drop app_log()
from chunkd (tabled didn't even grow it).

There's a small complication: one stdarg function cannot call
another, so we cannot just insert some shims... Or actually, we can.
The trick is to use printf into a local buffer, and then pass that down.
All of that is strictly temporary. If I'm not missing something, once
applications switch over, we'll just kill all of it and return to
what it was, only with syslog-like functions. I didn't even adjust
whitespace of ->app_log arguments as a pledge that it has to change
again anyway.

Long story short, this should be safe to build in Koji without
resorting to chain builds.

Signed-off-by: Pete Zaitcev <[email protected]>

diff --git a/include/cldc.h b/include/cldc.h
index f625d5e..712e7c7 100644
--- a/include/cldc.h
+++ b/include/cldc.h
@@ -79,6 +79,7 @@ struct cldc_ops {
        void            (*event)(void *private, struct cldc_session *,
                                 struct cldc_fh *, uint32_t);
        void            (*printf)(const char *fmt, ...);
+       void            (*errlog)(int prio, const char *fmt, ...);
 };
 
 /** a single CLD client session */
@@ -88,7 +89,8 @@ struct cldc_session {
        bool            verbose;
 
        const struct cldc_ops *ops;
-       void            (*act_log)(const char *fmt, ...);
+       void            (*act_log)(struct cldc_session *,
+                                  int prio, const char *fmt, ...);
        void            *private;
 
        uint8_t         addr[64];               /* server address */
diff --git a/lib/cldc.c b/lib/cldc.c
index dbb367c..072c995 100644
--- a/lib/cldc.c
+++ b/lib/cldc.c
@@ -35,6 +35,7 @@
 #include <glib.h>
 #include <cld-private.h>
 #include <cldc.h>
+#include <syslog.h>
 
 enum {
        CLDC_MSG_EXPIRE         = 5 * 60,
@@ -80,12 +81,38 @@ static size_t strnlen(const char *s, size_t maxlen)
 #define EBADE 52
 #endif
 
-void cldc_log(const char *fmt, ...)
+static void cldc_stdlog(struct cldc_session *sess, int prio, const char *fmt, 
...)
 {
+       char buf[200];
        va_list ap;
 
        va_start(ap, fmt);
-       vfprintf(stderr, fmt, ap);
+       vsnprintf(buf, 200, fmt, ap);
+       fprintf(stderr, "%s\n", buf);
+       va_end(ap);
+}
+
+static void cldc_oldlog(struct cldc_session *sess,
+                       int prio, const char *fmt, ...)
+{
+       char buf[200];
+       va_list ap;
+
+       va_start(ap, fmt);
+       vsnprintf(buf, 200, fmt, ap);
+       sess->ops->printf("%s\n", buf);
+       va_end(ap);
+}
+
+static void cldc_applog(struct cldc_session *sess,
+                       int prio, const char *fmt, ...)
+{
+       char buf[200];
+       va_list ap;
+
+       va_start(ap, fmt);
+       vsnprintf(buf, 200, fmt, ap);
+       sess->ops->errlog(prio, "%s", buf);
        va_end(ap);
 }
 
@@ -109,7 +136,7 @@ static int ack_seqid(struct cldc_session *sess, uint64_t 
seqid_le)
        memcpy(resp, &def_msg_ack, sizeof(*resp));
 
        if (!authsign(sess, pkt, pkt_len)) {
-               sess->act_log("authsign failed 2\n");
+               sess->act_log(sess, LOG_INFO, "authsign failed 2");
                return -1;
        }
 
@@ -134,14 +161,12 @@ static int cldc_rx_generic(struct cldc_session *sess,
        while (tmp) {
                req = tmp->data;
 
-#if 1 /* too verbose */
                if (sess->verbose)
-                       sess->act_log("rx_gen: comparing req->xid (%llu) with 
resp->xid_in (%llu)\n",
+                       sess->act_log(sess, LOG_DEBUG, "rx_gen: comparing 
req->xid (%llu) with resp->xid_in (%llu)",
                                (unsigned long long)
                                        le64_to_cpu(req->xid),
                                (unsigned long long)
                                        le64_to_cpu(resp->xid_in));
-#endif
 
                if (req->xid == resp->xid_in)
                        break;
@@ -152,10 +177,10 @@ static int cldc_rx_generic(struct cldc_session *sess,
 
        if (req->done) {
                if (sess->verbose)
-                       sess->act_log("rx_gen: re-acking\n");
+                       sess->act_log(sess, LOG_DEBUG, "rx_gen: re-acking");
        } else {
                if (sess->verbose)
-                       sess->act_log("rx_gen: issuing completion, acking\n");
+                       sess->act_log(sess, LOG_DEBUG, "rx_gen: issuing 
completion, acking");
 
                req->done = true;
 
@@ -182,7 +207,7 @@ static int cldc_rx_ack_frag(struct cldc_session *sess,
                return -1008;
 
        if (sess->verbose)
-               sess->act_log("ack-frag: seqid %llu, want to ack",
+               sess->act_log(sess, LOG_DEBUG, "ack-frag: seqid %llu, want to 
ack",
                              ack_msg->seqid);
 
        tmp = sess->out_msg;
@@ -202,7 +227,8 @@ static int cldc_rx_ack_frag(struct cldc_session *sess,
                                continue;
 
                        if (sess->verbose)
-                               sess->act_log("ack-frag: seqid %llu, expiring",
+                               sess->act_log(sess, LOG_DEBUG,
+                                             "ack-frag: seqid %llu, expiring",
                                              ack_msg->seqid);
 
                        req->pkt_info[i] = NULL;
@@ -247,7 +273,7 @@ static int cldc_rx_not_master(struct cldc_session *sess,
                              const void *msgbuf,
                              size_t buflen)
 {
-       sess->act_log("FIXME: not-master message received\n");
+       sess->act_log(sess, LOG_INFO, "FIXME: not-master message received");
        return -1055;   /* FIXME */
 }
 
@@ -314,7 +340,8 @@ static bool authcheck(struct cldc_session *sess, const 
struct cld_packet *pkt,
             md, &md_len);
 
        if (md_len != SHA_DIGEST_LENGTH)
-               sess->act_log("authsign BUG: md_len != SHA_DIGEST_LENGTH\n");
+               sess->act_log(sess, LOG_INFO,
+                             "authsign BUG: md_len != SHA_DIGEST_LENGTH");
 
        if (memcmp(buf + buflen - SHA_DIGEST_LENGTH, md, SHA_DIGEST_LENGTH))
                return false;
@@ -338,7 +365,8 @@ static bool authsign(struct cldc_session *sess, struct 
cld_packet *pkt,
             md, &md_len);
 
        if (md_len != SHA_DIGEST_LENGTH)
-               sess->act_log("authsign BUG: md_len != SHA_DIGEST_LENGTH\n");
+               sess->act_log(sess, LOG_INFO,
+                             "authsign BUG: md_len != SHA_DIGEST_LENGTH");
 
        memcpy(buf + (buflen - SHA_DIGEST_LENGTH), md, SHA_DIGEST_LENGTH);
 
@@ -423,7 +451,7 @@ int cldc_receive_pkt(struct cldc_session *sess,
 
        if (pkt_len < (sizeof(*pkt) + SHA_DIGEST_LENGTH)) {
                if (sess->verbose)
-                       sess->act_log("receive_pkt: msg too short\n");
+                       sess->act_log(sess, LOG_DEBUG, "receive_pkt: msg too 
short");
                return -EPROTO;
        }
 
@@ -433,24 +461,26 @@ int cldc_receive_pkt(struct cldc_session *sess,
                if (msg->op == cmo_get) {
                        struct cld_msg_get_resp *dp;
                        dp = (struct cld_msg_get_resp *) msg;
-                       sess->act_log("receive pkt: len %u, op cmo_get"
-                               ", seqid %llu, user %s, size %u\n",
+                       sess->act_log(sess, LOG_DEBUG, "receive pkt: len %u, op 
%s"
+                               ", seqid %llu, user %s, size %u",
                                (unsigned int) pkt_len,
+                               opstr(msg->op),
                                (unsigned long long) le64_to_cpu(pkt->seqid),
                                pkt->user,
                                le32_to_cpu(dp->size));
                } else if (msg->op == cmo_new_sess) {
                        struct cld_msg_resp *dp;
                        dp = (struct cld_msg_resp *) msg;
-                       sess->act_log("receive pkt: len %u, op cmo_new_sess"
-                               ", seqid %llu, user %s, xid_in %llu\n",
+                       sess->act_log(sess, LOG_DEBUG, "receive pkt: len %u, op 
%s"
+                               ", seqid %llu, user %s, xid_in %llu",
                                (unsigned int) pkt_len,
+                               opstr(msg->op),
                                (unsigned long long) le64_to_cpu(pkt->seqid),
                                pkt->user,
                                (unsigned long long) le64_to_cpu(dp->xid_in));
                } else {
-                       sess->act_log("receive pkt: len %u, "
-                               "op %s, seqid %llu, user %s\n",
+                       sess->act_log(sess, LOG_DEBUG, "receive pkt: len %u, op 
%s"
+                               ", seqid %llu, user %s",
                                (unsigned int) pkt_len,
                                opstr(msg->op),
                                (unsigned long long) le64_to_cpu(pkt->seqid),
@@ -460,14 +490,14 @@ int cldc_receive_pkt(struct cldc_session *sess,
 
        if (memcmp(pkt->magic, CLD_PKT_MAGIC, sizeof(pkt->magic))) {
                if (sess->verbose)
-                       sess->act_log("receive_pkt: bad pkt magic\n");
+                       sess->act_log(sess, LOG_DEBUG, "receive_pkt: bad pkt 
magic");
                return -EPROTO;
        }
 
        /* check HMAC signature */
        if (!authcheck(sess, pkt, pkt_len)) {
                if (sess->verbose)
-                       sess->act_log("receive_pkt: invalid auth\n");
+                       sess->act_log(sess, LOG_DEBUG, "receive_pkt: invalid 
auth");
                return -EACCES;
        }
 
@@ -475,7 +505,8 @@ int cldc_receive_pkt(struct cldc_session *sess,
        if (((sess->addr_len != net_addrlen) ||
            memcmp(sess->addr, net_addr, net_addrlen))) {
                if (sess->verbose)
-                       sess->act_log("receive_pkt: server address mismatch\n");
+                       sess->act_log(sess, LOG_DEBUG,
+                                     "receive_pkt: server address mismatch");
                return -EBADE;
        }
 
@@ -495,7 +526,7 @@ int cldc_receive_pkt(struct cldc_session *sess,
 
        if ((sess->msg_buf_len + msglen) > CLD_MAX_MSG_SZ) {
                if (sess->verbose)
-                       sess->act_log("receive_pkt: bad pkt length\n");
+                       sess->act_log(sess, LOG_DEBUG, "receive_pkt: bad pkt 
length");
                return -EPROTO;
        }
 
@@ -504,7 +535,7 @@ int cldc_receive_pkt(struct cldc_session *sess,
 
        if (memcmp(msg->magic, CLD_MSG_MAGIC, sizeof(msg->magic))) {
                if (sess->verbose)
-                       sess->act_log("receive_pkt: bad msg magic\n");
+                       sess->act_log(sess, LOG_DEBUG, "receive_pkt: bad msg 
magic");
                return -EPROTO;
        }
 
@@ -516,8 +547,8 @@ int cldc_receive_pkt(struct cldc_session *sess,
                        sess->next_seqid_in - CLDC_MSG_REMEMBER;
 
                if (sess->verbose)
-                       sess->act_log("receive_pkt: "
-                                        "setting next_seqid_in to %llu\n",
+                       sess->act_log(sess, LOG_DEBUG, "receive_pkt: "
+                                        "setting next_seqid_in to %llu",
                                         (unsigned long long) seqid);
        } else if (!no_seqid) {
                if (seqid != sess->next_seqid_in) {
@@ -527,8 +558,9 @@ int cldc_receive_pkt(struct cldc_session *sess,
                                return ack_seqid(sess, pkt->seqid);
 
                        if (sess->verbose)
-                               sess->act_log("receive_pkt: bad seqid %llu\n",
-                                       (unsigned long long) seqid);
+                               sess->act_log(sess, LOG_DEBUG,
+                                             "receive_pkt: bad seqid %llu",
+                                             (unsigned long long) seqid);
                        return -EBADSLT;
                }
                sess->next_seqid_in++;
@@ -841,7 +873,13 @@ int cldc_new_sess(const struct cldc_ops *ops,
 
        sess->private = private;
        sess->ops = ops;
-       sess->act_log = ops->printf ? ops->printf : cldc_log;
+       if (ops->printf) {      /* obsolete API in use XXX */
+               sess->act_log = cldc_oldlog;
+       } else if (ops->errlog) {
+               sess->act_log = cldc_applog;
+       } else {
+               sess->act_log = cldc_stdlog;
+       }
        sess->fh = g_array_sized_new(FALSE, TRUE, sizeof(struct cldc_fh), 16);
        strcpy(sess->user, user);
        strcpy(sess->secret_key, secret_key);
--
To unsubscribe from this list: send the line "unsubscribe hail-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to