]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ldpd: split log.c into two files
authorRenato Westphal <renato@opensourcerouting.org>
Tue, 18 Apr 2017 15:04:44 +0000 (12:04 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 24 Apr 2017 23:30:58 +0000 (20:30 -0300)
This is basically to keep in sync with OpenBSD's ldpd(8) where the same
change was done.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ldpd/Makefile.am
ldpd/lde.c
ldpd/ldpd.c
ldpd/ldpd.h
ldpd/ldpe.c
ldpd/log.c
ldpd/log.h
ldpd/logmsg.c [new file with mode: 0644]

index 19f819ae365d00fc3559a7d6d192cfca91da2afe..b760b44573141d40331a8a428062e2a1129a8c0d 100644 (file)
@@ -16,7 +16,7 @@ EXTRA_DIST += ldp_vty.xml
 libldp_a_SOURCES = \
        accept.c address.c adjacency.c control.c hello.c init.c interface.c \
        keepalive.c l2vpn.c labelmapping.c lde.c lde_lib.c ldpd.c \
-       ldpe.c log.c neighbor.c notification.c packet.c pfkey.c \
+       ldpe.c log.c logmsg.c neighbor.c notification.c packet.c pfkey.c \
        socket.c util.c ldp_vty_cmds.c ldp_vty_conf.c ldp_vty_exec.c \
        ldp_debug.c ldp_zebra.c
 
index d8a2924b31c9fdd4ee60c6628b01182ac59df5c1..0865112ca61452a9eb7817be3d62bc08cbb82c17 100644 (file)
@@ -161,6 +161,7 @@ lde(const char *user, const char *group, u_short instance)
        setproctitle("label decision engine");
 #endif
        ldpd_process = PROC_LDE_ENGINE;
+       log_procname = log_procnames[PROC_LDE_ENGINE];
 
        /* drop privileges */
        if (user)
index 9729499e284cc5f89054a76ee4445aa573840f17..b1204c7332cd2e07222745bfe267104c62d52fa3 100644 (file)
@@ -208,6 +208,7 @@ main(int argc, char *argv[])
        const char              *instance_char = NULL;
 
        ldpd_process = PROC_MAIN;
+       log_procname = log_procnames[ldpd_process];
 
        saved_argv0 = argv[0];
        if (saved_argv0 == NULL)
index d2fc5aa3afe8be4d12c0dfacfbd00ec843597e0a..91b0348793149590a9a5d9a17bc5533ccb474f10 100644 (file)
@@ -439,6 +439,12 @@ enum ldpd_process {
        PROC_LDE_ENGINE
 } ldpd_process;
 
+static const char * const log_procnames[] = {
+       "parent",
+       "ldpe",
+       "lde"
+};
+
 enum socket_type {
        LDP_SOCKET_DISC,
        LDP_SOCKET_EDISC,
@@ -761,6 +767,30 @@ int                 sock_set_ipv6_mcast_hops(int, int);
 int             sock_set_ipv6_mcast(struct iface *);
 int             sock_set_ipv6_mcast_loop(int);
 
+/* logmsg.h */
+struct in6_addr;
+union ldpd_addr;
+struct hello_source;
+struct fec;
+
+const char     *log_sockaddr(void *);
+const char     *log_in6addr(const struct in6_addr *);
+const char     *log_in6addr_scope(const struct in6_addr *, unsigned int);
+const char     *log_addr(int, const union ldpd_addr *);
+char           *log_label(uint32_t);
+const char     *log_time(time_t);
+char           *log_hello_src(const struct hello_source *);
+const char     *log_map(const struct map *);
+const char     *log_fec(const struct fec *);
+const char     *af_name(int);
+const char     *socket_name(int);
+const char     *nbr_state_name(int);
+const char     *if_state_name(int);
+const char     *if_type_name(enum iface_type);
+const char     *msg_name(uint16_t);
+const char     *status_code_name(uint32_t);
+const char     *pw_type_name(uint16_t);
+
 /* quagga */
 extern struct thread_master    *master;
 extern char                     ctl_sock_path[MAXPATHLEN];
index 1bec3d2a958cd08532db799f5390d71f7263c626..e82416276bb14b67d735378a108df04be4b9c5fa 100644 (file)
@@ -113,6 +113,7 @@ ldpe(const char *user, const char *group, const char *ctl_path)
        setproctitle("ldp engine");
 #endif
        ldpd_process = PROC_LDP_ENGINE;
+       log_procname = log_procnames[ldpd_process];
 
        LIST_INIT(&global.addr_list);
        RB_INIT(&global.adj_tree);
index 407668bb03763f2f7505c5dd21dbcb2887043986..408aaeb6998930480b81f6e5d10fd65de3af3e93 100644 (file)
 
 #include <lib/log.h>
 #include <lib/log_int.h>
-#include "mpls.h"
 
-static const char * const procnames[] = {
-       "parent",
-       "ldpe",
-       "lde"
-};
-
-void            vlog(int, const char *, va_list);
+const char     *log_procname;
 
 void
 logit(int pri, const char *fmt, ...)
@@ -133,15 +126,15 @@ void
 fatal(const char *emsg)
 {
        if (emsg == NULL)
-               logit(LOG_CRIT, "fatal in %s: %s", procnames[ldpd_process],
+               logit(LOG_CRIT, "fatal in %s: %s", log_procname,
                    strerror(errno));
        else
                if (errno)
                        logit(LOG_CRIT, "fatal in %s: %s: %s",
-                           procnames[ldpd_process], emsg, strerror(errno));
+                           log_procname, emsg, strerror(errno));
                else
                        logit(LOG_CRIT, "fatal in %s: %s",
-                           procnames[ldpd_process], emsg);
+                           log_procname, emsg);
 
        exit(1);
 }
@@ -152,465 +145,3 @@ fatalx(const char *emsg)
        errno = 0;
        fatal(emsg);
 }
-
-#define NUM_LOGS       4
-const char *
-log_sockaddr(void *vp)
-{
-       static char      buf[NUM_LOGS][NI_MAXHOST];
-       static int       round = 0;
-       struct sockaddr *sa = vp;
-
-       round = (round + 1) % NUM_LOGS;
-
-       if (getnameinfo(sa, sockaddr_len(sa), buf[round], NI_MAXHOST, NULL, 0,
-           NI_NUMERICHOST))
-               return ("(unknown)");
-       else
-               return (buf[round]);
-}
-
-const char *
-log_in6addr(const struct in6_addr *addr)
-{
-       struct sockaddr_in6     sa_in6;
-
-       memset(&sa_in6, 0, sizeof(sa_in6));
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-       sa_in6.sin6_len = sizeof(sa_in6);
-#endif
-       sa_in6.sin6_family = AF_INET6;
-       sa_in6.sin6_addr = *addr;
-
-       recoverscope(&sa_in6);
-
-       return (log_sockaddr(&sa_in6));
-}
-
-const char *
-log_in6addr_scope(const struct in6_addr *addr, unsigned int ifindex)
-{
-       struct sockaddr_in6     sa_in6;
-
-       memset(&sa_in6, 0, sizeof(sa_in6));
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-       sa_in6.sin6_len = sizeof(sa_in6);
-#endif
-       sa_in6.sin6_family = AF_INET6;
-       sa_in6.sin6_addr = *addr;
-
-       addscope(&sa_in6, ifindex);
-
-       return (log_sockaddr(&sa_in6));
-}
-
-const char *
-log_addr(int af, const union ldpd_addr *addr)
-{
-       static char      buf[NUM_LOGS][INET6_ADDRSTRLEN];
-       static int       round = 0;
-
-       switch (af) {
-       case AF_INET:
-               round = (round + 1) % NUM_LOGS;
-               if (inet_ntop(AF_INET, &addr->v4, buf[round],
-                   sizeof(buf[round])) == NULL)
-                       return ("???");
-               return (buf[round]);
-       case AF_INET6:
-               return (log_in6addr(&addr->v6));
-       default:
-               break;
-       }
-
-       return ("???");
-}
-
-#define        TF_BUFS 4
-#define        TF_LEN  32
-
-char *
-log_label(uint32_t label)
-{
-       char            *buf;
-       static char      tfbuf[TF_BUFS][TF_LEN];        /* ring buffer */
-       static int       idx = 0;
-
-       buf = tfbuf[idx++];
-       if (idx == TF_BUFS)
-               idx = 0;
-
-       switch (label) {
-       case NO_LABEL:
-               snprintf(buf, TF_LEN, "-");
-               break;
-       case MPLS_LABEL_IMPLNULL:
-               snprintf(buf, TF_LEN, "imp-null");
-               break;
-       case MPLS_LABEL_IPV4NULL:
-       case MPLS_LABEL_IPV6NULL:
-               snprintf(buf, TF_LEN, "exp-null");
-               break;
-       default:
-               snprintf(buf, TF_LEN, "%u", label);
-               break;
-       }
-
-       return (buf);
-}
-
-const char *
-log_time(time_t t)
-{
-       char            *buf;
-       static char      tfbuf[TF_BUFS][TF_LEN];        /* ring buffer */
-       static int       idx = 0;
-       unsigned int     sec, min, hrs, day, week;
-
-       buf = tfbuf[idx++];
-       if (idx == TF_BUFS)
-               idx = 0;
-
-       week = t;
-
-       sec = week % 60;
-       week /= 60;
-       min = week % 60;
-       week /= 60;
-       hrs = week % 24;
-       week /= 24;
-       day = week % 7;
-       week /= 7;
-
-       if (week > 0)
-               snprintf(buf, TF_LEN, "%02uw%01ud%02uh", week, day, hrs);
-       else if (day > 0)
-               snprintf(buf, TF_LEN, "%01ud%02uh%02um", day, hrs, min);
-       else
-               snprintf(buf, TF_LEN, "%02u:%02u:%02u", hrs, min, sec);
-
-       return (buf);
-}
-
-char *
-log_hello_src(const struct hello_source *src)
-{
-       static char buf[64];
-
-       switch (src->type) {
-       case HELLO_LINK:
-               snprintf(buf, sizeof(buf), "iface %s",
-                   src->link.ia->iface->name);
-               break;
-       case HELLO_TARGETED:
-               snprintf(buf, sizeof(buf), "source %s",
-                   log_addr(src->target->af, &src->target->addr));
-               break;
-       }
-
-       return (buf);
-}
-
-const char *
-log_map(const struct map *map)
-{
-       static char     buf[128];
-
-       switch (map->type) {
-       case MAP_TYPE_WILDCARD:
-               if (snprintf(buf, sizeof(buf), "wildcard") < 0)
-                       return ("???");
-               break;
-       case MAP_TYPE_PREFIX:
-               if (snprintf(buf, sizeof(buf), "%s/%u",
-                   log_addr(map->fec.prefix.af, &map->fec.prefix.prefix),
-                   map->fec.prefix.prefixlen) == -1)
-                       return ("???");
-               break;
-       case MAP_TYPE_PWID:
-               if (snprintf(buf, sizeof(buf), "pw-id %u group-id %u (%s)",
-                   map->fec.pwid.pwid, map->fec.pwid.group_id,
-                   pw_type_name(map->fec.pwid.type)) == -1)
-                       return ("???");
-               break;
-       case MAP_TYPE_TYPED_WCARD:
-               if (snprintf(buf, sizeof(buf), "typed wildcard") < 0)
-                       return ("???");
-               switch (map->fec.twcard.type) {
-               case MAP_TYPE_PREFIX:
-                       if (snprintf(buf + strlen(buf), sizeof(buf) -
-                           strlen(buf), " (prefix, address-family %s)",
-                           af_name(map->fec.twcard.u.prefix_af)) < 0)
-                               return ("???");
-                       break;
-               case MAP_TYPE_PWID:
-                       if (snprintf(buf + strlen(buf), sizeof(buf) -
-                           strlen(buf), " (pwid, type %s)",
-                           pw_type_name(map->fec.twcard.u.pw_type)) < 0)
-                               return ("???");
-                       break;
-               default:
-                       if (snprintf(buf + strlen(buf), sizeof(buf) -
-                           strlen(buf), " (unknown type)") < 0)
-                               return ("???");
-                       break;
-               }
-               break;
-       default:
-               return ("???");
-       }
-
-       return (buf);
-}
-
-const char *
-log_fec(const struct fec *fec)
-{
-       static char     buf[64];
-       union ldpd_addr addr;
-
-       switch (fec->type) {
-       case FEC_TYPE_IPV4:
-               addr.v4 = fec->u.ipv4.prefix;
-               if (snprintf(buf, sizeof(buf), "ipv4 %s/%u",
-                   log_addr(AF_INET, &addr), fec->u.ipv4.prefixlen) == -1)
-                       return ("???");
-               break;
-       case FEC_TYPE_IPV6:
-               addr.v6 = fec->u.ipv6.prefix;
-               if (snprintf(buf, sizeof(buf), "ipv6 %s/%u",
-                   log_addr(AF_INET6, &addr), fec->u.ipv6.prefixlen) == -1)
-                       return ("???");
-               break;
-       case FEC_TYPE_PWID:
-               if (snprintf(buf, sizeof(buf),
-                   "pwid %u (%s) - %s",
-                   fec->u.pwid.pwid, pw_type_name(fec->u.pwid.type),
-                   inet_ntoa(fec->u.pwid.lsr_id)) == -1)
-                       return ("???");
-               break;
-       default:
-               return ("???");
-       }
-
-       return (buf);
-}
-
-/* names */
-const char *
-af_name(int af)
-{
-       switch (af) {
-       case AF_INET:
-               return ("ipv4");
-       case AF_INET6:
-               return ("ipv6");
-#ifdef AF_MPLS
-       case AF_MPLS:
-               return ("mpls");
-#endif
-       default:
-               return ("UNKNOWN");
-       }
-}
-
-const char *
-socket_name(int type)
-{
-       switch (type) {
-       case LDP_SOCKET_DISC:
-               return ("discovery");
-       case LDP_SOCKET_EDISC:
-               return ("extended discovery");
-       case LDP_SOCKET_SESSION:
-               return ("session");
-       default:
-               return ("UNKNOWN");
-       }
-}
-
-const char *
-nbr_state_name(int state)
-{
-       switch (state) {
-       case NBR_STA_PRESENT:
-               return ("PRESENT");
-       case NBR_STA_INITIAL:
-               return ("INITIALIZED");
-       case NBR_STA_OPENREC:
-               return ("OPENREC");
-       case NBR_STA_OPENSENT:
-               return ("OPENSENT");
-       case NBR_STA_OPER:
-               return ("OPERATIONAL");
-       default:
-               return ("UNKNOWN");
-       }
-}
-
-const char *
-if_state_name(int state)
-{
-       switch (state) {
-       case IF_STA_DOWN:
-               return ("DOWN");
-       case IF_STA_ACTIVE:
-               return ("ACTIVE");
-       default:
-               return ("UNKNOWN");
-       }
-}
-
-const char *
-if_type_name(enum iface_type type)
-{
-       switch (type) {
-       case IF_TYPE_POINTOPOINT:
-               return ("POINTOPOINT");
-       case IF_TYPE_BROADCAST:
-               return ("BROADCAST");
-       }
-       /* NOTREACHED */
-       return ("UNKNOWN");
-}
-
-const char *
-msg_name(uint16_t msg)
-{
-       static char buf[16];
-
-       switch (msg) {
-       case MSG_TYPE_NOTIFICATION:
-               return ("notification");
-       case MSG_TYPE_HELLO:
-               return ("hello");
-       case MSG_TYPE_INIT:
-               return ("initialization");
-       case MSG_TYPE_KEEPALIVE:
-               return ("keepalive");
-       case MSG_TYPE_CAPABILITY:
-               return ("capability");
-       case MSG_TYPE_ADDR:
-               return ("address");
-       case MSG_TYPE_ADDRWITHDRAW:
-               return ("address withdraw");
-       case MSG_TYPE_LABELMAPPING:
-               return ("label mapping");
-       case MSG_TYPE_LABELREQUEST:
-               return ("label request");
-       case MSG_TYPE_LABELWITHDRAW:
-               return ("label withdraw");
-       case MSG_TYPE_LABELRELEASE:
-               return ("label release");
-       case MSG_TYPE_LABELABORTREQ:
-       default:
-               snprintf(buf, sizeof(buf), "[%08x]", msg);
-               return (buf);
-       }
-}
-
-const char *
-status_code_name(uint32_t status)
-{
-       static char buf[16];
-
-       switch (status) {
-       case S_SUCCESS:
-               return ("Success");
-       case S_BAD_LDP_ID:
-               return ("Bad LDP Identifier");
-       case S_BAD_PROTO_VER:
-               return ("Bad Protocol Version");
-       case S_BAD_PDU_LEN:
-               return ("Bad PDU Length");
-       case S_UNKNOWN_MSG:
-               return ("Unknown Message Type");
-       case S_BAD_MSG_LEN:
-               return ("Bad Message Length");
-       case S_UNKNOWN_TLV:
-               return ("Unknown TLV");
-       case S_BAD_TLV_LEN:
-               return ("Bad TLV Length");
-       case S_BAD_TLV_VAL:
-               return ("Malformed TLV Value");
-       case S_HOLDTIME_EXP:
-               return ("Hold Timer Expired");
-       case S_SHUTDOWN:
-               return ("Shutdown");
-       case S_LOOP_DETECTED:
-               return ("Loop Detected");
-       case S_UNKNOWN_FEC:
-               return ("Unknown FEC");
-       case S_NO_ROUTE:
-               return ("No Route");
-       case S_NO_LABEL_RES:
-               return ("No Label Resources");
-       case S_AVAILABLE:
-               return ("Label Resources Available");
-       case S_NO_HELLO:
-               return ("Session Rejected, No Hello");
-       case S_PARM_ADV_MODE:
-               return ("Rejected Advertisement Mode Parameter");
-       case S_MAX_PDU_LEN:
-               return ("Rejected Max PDU Length Parameter");
-       case S_PARM_L_RANGE:
-               return ("Rejected Label Range Parameter");
-       case S_KEEPALIVE_TMR:
-               return ("KeepAlive Timer Expired");
-       case S_LAB_REQ_ABRT:
-               return ("Label Request Aborted");
-       case S_MISS_MSG:
-               return ("Missing Message Parameters");
-       case S_UNSUP_ADDR:
-               return ("Unsupported Address Family");
-       case S_KEEPALIVE_BAD:
-               return ("Bad KeepAlive Time");
-       case S_INTERN_ERR:
-               return ("Internal Error");
-       case S_ILLEGAL_CBIT:
-               return ("Illegal C-Bit");
-       case S_WRONG_CBIT:
-               return ("Wrong C-Bit");
-       case S_INCPT_BITRATE:
-               return ("Incompatible bit-rate");
-       case S_CEP_MISCONF:
-               return ("CEP-TDM mis-configuration");
-       case S_PW_STATUS:
-               return ("PW Status");
-       case S_UNASSIGN_TAI:
-               return ("Unassigned/Unrecognized TAI");
-       case S_MISCONF_ERR:
-               return ("Generic Misconfiguration Error");
-       case S_WITHDRAW_MTHD:
-               return ("Label Withdraw PW Status Method");
-       case S_UNSSUPORTDCAP:
-               return ("Unsupported Capability");
-       case S_ENDOFLIB:
-               return ("End-of-LIB");
-       case S_TRANS_MISMTCH:
-               return ("Transport Connection Mismatch");
-       case S_DS_NONCMPLNCE:
-               return ("Dual-Stack Noncompliance");
-       default:
-               snprintf(buf, sizeof(buf), "[%08x]", status);
-               return (buf);
-       }
-}
-
-const char *
-pw_type_name(uint16_t pw_type)
-{
-       static char buf[64];
-
-       switch (pw_type) {
-       case PW_TYPE_ETHERNET_TAGGED:
-               return ("Eth Tagged");
-       case PW_TYPE_ETHERNET:
-               return ("Ethernet");
-       case PW_TYPE_WILDCARD:
-               return ("Wildcard");
-       default:
-               snprintf(buf, sizeof(buf), "[%0x]", pw_type);
-               return (buf);
-       }
-}
index 4d6da43cac9b6c6e411cdbf142e5434f6d350ad7..8c236ff5fe3f3bd3b0e95626fdeb89fac29d1b11 100644 (file)
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#ifndef _LOG_H_
-#define        _LOG_H_
+#ifndef LOG_H
+#define LOG_H
 
 #include <stdarg.h>
 
-struct in6_addr;
-union ldpd_addr;
-struct hello_source;
-struct fec;
+extern const char      *log_procname;
 
-void            logit(int, const char *, ...)
-                       __attribute__((__format__ (printf, 2, 3)));
-void            log_warn(const char *, ...)
-                       __attribute__((__format__ (printf, 1, 2)));
-void            log_warnx(const char *, ...)
-                       __attribute__((__format__ (printf, 1, 2)));
-void            log_info(const char *, ...)
-                       __attribute__((__format__ (printf, 1, 2)));
-void            log_notice(const char *, ...)
-                       __attribute__((__format__ (printf, 1, 2)));
-void            log_debug(const char *, ...)
-                       __attribute__((__format__ (printf, 1, 2)));
-void            fatal(const char *)
-                       __attribute__ ((noreturn))
-                       __attribute__((__format__ (printf, 1, 0)));
-void            fatalx(const char *)
-                       __attribute__ ((noreturn))
-                       __attribute__((__format__ (printf, 1, 0)));
-const char     *log_sockaddr(void *);
-const char     *log_in6addr(const struct in6_addr *);
-const char     *log_in6addr_scope(const struct in6_addr *, unsigned int);
-const char     *log_addr(int, const union ldpd_addr *);
-char           *log_label(uint32_t);
-const char     *log_time(time_t);
-char           *log_hello_src(const struct hello_source *);
-const char     *log_map(const struct map *);
-const char     *log_fec(const struct fec *);
-const char     *af_name(int);
-const char     *socket_name(int);
-const char     *nbr_state_name(int);
-const char     *if_state_name(int);
-const char     *if_type_name(enum iface_type);
-const char     *msg_name(uint16_t);
-const char     *status_code_name(uint32_t);
-const char     *pw_type_name(uint16_t);
+void    logit(int, const char *, ...)
+               __attribute__((__format__ (printf, 2, 3)));
+void    vlog(int, const char *, va_list)
+               __attribute__((__format__ (printf, 2, 0)));
+void    log_warn(const char *, ...)
+               __attribute__((__format__ (printf, 1, 2)));
+void    log_warnx(const char *, ...)
+               __attribute__((__format__ (printf, 1, 2)));
+void    log_info(const char *, ...)
+               __attribute__((__format__ (printf, 1, 2)));
+void    log_notice(const char *, ...)
+               __attribute__((__format__ (printf, 1, 2)));
+void    log_debug(const char *, ...)
+               __attribute__((__format__ (printf, 1, 2)));
+void    fatal(const char *)
+               __attribute__ ((noreturn))
+               __attribute__((__format__ (printf, 1, 0)));
+void    fatalx(const char *)
+               __attribute__ ((noreturn))
+               __attribute__((__format__ (printf, 1, 0)));
 
-#endif /* _LOG_H_ */
+#endif /* LOG_H */
diff --git a/ldpd/logmsg.c b/ldpd/logmsg.c
new file mode 100644 (file)
index 0000000..c819b33
--- /dev/null
@@ -0,0 +1,487 @@
+/*     $OpenBSD$ */
+
+/*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <zebra.h>
+
+#include "mpls.h"
+
+#include "ldpd.h"
+#include "ldpe.h"
+#include "lde.h"
+
+#define NUM_LOGS       4
+const char *
+log_sockaddr(void *vp)
+{
+       static char      buf[NUM_LOGS][NI_MAXHOST];
+       static int       round = 0;
+       struct sockaddr *sa = vp;
+
+       round = (round + 1) % NUM_LOGS;
+
+       if (getnameinfo(sa, sockaddr_len(sa), buf[round], NI_MAXHOST, NULL, 0,
+           NI_NUMERICHOST))
+               return ("(unknown)");
+       else
+               return (buf[round]);
+}
+
+const char *
+log_in6addr(const struct in6_addr *addr)
+{
+       struct sockaddr_in6     sa_in6;
+
+       memset(&sa_in6, 0, sizeof(sa_in6));
+#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
+       sa_in6.sin6_len = sizeof(sa_in6);
+#endif
+       sa_in6.sin6_family = AF_INET6;
+       sa_in6.sin6_addr = *addr;
+
+       recoverscope(&sa_in6);
+
+       return (log_sockaddr(&sa_in6));
+}
+
+const char *
+log_in6addr_scope(const struct in6_addr *addr, unsigned int ifindex)
+{
+       struct sockaddr_in6     sa_in6;
+
+       memset(&sa_in6, 0, sizeof(sa_in6));
+#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
+       sa_in6.sin6_len = sizeof(sa_in6);
+#endif
+       sa_in6.sin6_family = AF_INET6;
+       sa_in6.sin6_addr = *addr;
+
+       addscope(&sa_in6, ifindex);
+
+       return (log_sockaddr(&sa_in6));
+}
+
+const char *
+log_addr(int af, const union ldpd_addr *addr)
+{
+       static char      buf[NUM_LOGS][INET6_ADDRSTRLEN];
+       static int       round = 0;
+
+       switch (af) {
+       case AF_INET:
+               round = (round + 1) % NUM_LOGS;
+               if (inet_ntop(AF_INET, &addr->v4, buf[round],
+                   sizeof(buf[round])) == NULL)
+                       return ("???");
+               return (buf[round]);
+       case AF_INET6:
+               return (log_in6addr(&addr->v6));
+       default:
+               break;
+       }
+
+       return ("???");
+}
+
+#define        TF_BUFS 4
+#define        TF_LEN  32
+
+char *
+log_label(uint32_t label)
+{
+       char            *buf;
+       static char      tfbuf[TF_BUFS][TF_LEN];        /* ring buffer */
+       static int       idx = 0;
+
+       buf = tfbuf[idx++];
+       if (idx == TF_BUFS)
+               idx = 0;
+
+       switch (label) {
+       case NO_LABEL:
+               snprintf(buf, TF_LEN, "-");
+               break;
+       case MPLS_LABEL_IMPLNULL:
+               snprintf(buf, TF_LEN, "imp-null");
+               break;
+       case MPLS_LABEL_IPV4NULL:
+       case MPLS_LABEL_IPV6NULL:
+               snprintf(buf, TF_LEN, "exp-null");
+               break;
+       default:
+               snprintf(buf, TF_LEN, "%u", label);
+               break;
+       }
+
+       return (buf);
+}
+
+const char *
+log_time(time_t t)
+{
+       char            *buf;
+       static char      tfbuf[TF_BUFS][TF_LEN];        /* ring buffer */
+       static int       idx = 0;
+       unsigned int     sec, min, hrs, day, week;
+
+       buf = tfbuf[idx++];
+       if (idx == TF_BUFS)
+               idx = 0;
+
+       week = t;
+
+       sec = week % 60;
+       week /= 60;
+       min = week % 60;
+       week /= 60;
+       hrs = week % 24;
+       week /= 24;
+       day = week % 7;
+       week /= 7;
+
+       if (week > 0)
+               snprintf(buf, TF_LEN, "%02uw%01ud%02uh", week, day, hrs);
+       else if (day > 0)
+               snprintf(buf, TF_LEN, "%01ud%02uh%02um", day, hrs, min);
+       else
+               snprintf(buf, TF_LEN, "%02u:%02u:%02u", hrs, min, sec);
+
+       return (buf);
+}
+
+char *
+log_hello_src(const struct hello_source *src)
+{
+       static char buf[64];
+
+       switch (src->type) {
+       case HELLO_LINK:
+               snprintf(buf, sizeof(buf), "iface %s",
+                   src->link.ia->iface->name);
+               break;
+       case HELLO_TARGETED:
+               snprintf(buf, sizeof(buf), "source %s",
+                   log_addr(src->target->af, &src->target->addr));
+               break;
+       }
+
+       return (buf);
+}
+
+const char *
+log_map(const struct map *map)
+{
+       static char     buf[128];
+
+       switch (map->type) {
+       case MAP_TYPE_WILDCARD:
+               if (snprintf(buf, sizeof(buf), "wildcard") < 0)
+                       return ("???");
+               break;
+       case MAP_TYPE_PREFIX:
+               if (snprintf(buf, sizeof(buf), "%s/%u",
+                   log_addr(map->fec.prefix.af, &map->fec.prefix.prefix),
+                   map->fec.prefix.prefixlen) == -1)
+                       return ("???");
+               break;
+       case MAP_TYPE_PWID:
+               if (snprintf(buf, sizeof(buf), "pw-id %u group-id %u (%s)",
+                   map->fec.pwid.pwid, map->fec.pwid.group_id,
+                   pw_type_name(map->fec.pwid.type)) == -1)
+                       return ("???");
+               break;
+       case MAP_TYPE_TYPED_WCARD:
+               if (snprintf(buf, sizeof(buf), "typed wildcard") < 0)
+                       return ("???");
+               switch (map->fec.twcard.type) {
+               case MAP_TYPE_PREFIX:
+                       if (snprintf(buf + strlen(buf), sizeof(buf) -
+                           strlen(buf), " (prefix, address-family %s)",
+                           af_name(map->fec.twcard.u.prefix_af)) < 0)
+                               return ("???");
+                       break;
+               case MAP_TYPE_PWID:
+                       if (snprintf(buf + strlen(buf), sizeof(buf) -
+                           strlen(buf), " (pwid, type %s)",
+                           pw_type_name(map->fec.twcard.u.pw_type)) < 0)
+                               return ("???");
+                       break;
+               default:
+                       if (snprintf(buf + strlen(buf), sizeof(buf) -
+                           strlen(buf), " (unknown type)") < 0)
+                               return ("???");
+                       break;
+               }
+               break;
+       default:
+               return ("???");
+       }
+
+       return (buf);
+}
+
+const char *
+log_fec(const struct fec *fec)
+{
+       static char     buf[64];
+       union ldpd_addr addr;
+
+       switch (fec->type) {
+       case FEC_TYPE_IPV4:
+               addr.v4 = fec->u.ipv4.prefix;
+               if (snprintf(buf, sizeof(buf), "ipv4 %s/%u",
+                   log_addr(AF_INET, &addr), fec->u.ipv4.prefixlen) == -1)
+                       return ("???");
+               break;
+       case FEC_TYPE_IPV6:
+               addr.v6 = fec->u.ipv6.prefix;
+               if (snprintf(buf, sizeof(buf), "ipv6 %s/%u",
+                   log_addr(AF_INET6, &addr), fec->u.ipv6.prefixlen) == -1)
+                       return ("???");
+               break;
+       case FEC_TYPE_PWID:
+               if (snprintf(buf, sizeof(buf),
+                   "pwid %u (%s) - %s",
+                   fec->u.pwid.pwid, pw_type_name(fec->u.pwid.type),
+                   inet_ntoa(fec->u.pwid.lsr_id)) == -1)
+                       return ("???");
+               break;
+       default:
+               return ("???");
+       }
+
+       return (buf);
+}
+
+/* names */
+const char *
+af_name(int af)
+{
+       switch (af) {
+       case AF_INET:
+               return ("ipv4");
+       case AF_INET6:
+               return ("ipv6");
+#ifdef AF_MPLS
+       case AF_MPLS:
+               return ("mpls");
+#endif
+       default:
+               return ("UNKNOWN");
+       }
+}
+
+const char *
+socket_name(int type)
+{
+       switch (type) {
+       case LDP_SOCKET_DISC:
+               return ("discovery");
+       case LDP_SOCKET_EDISC:
+               return ("extended discovery");
+       case LDP_SOCKET_SESSION:
+               return ("session");
+       default:
+               return ("UNKNOWN");
+       }
+}
+
+const char *
+nbr_state_name(int state)
+{
+       switch (state) {
+       case NBR_STA_PRESENT:
+               return ("PRESENT");
+       case NBR_STA_INITIAL:
+               return ("INITIALIZED");
+       case NBR_STA_OPENREC:
+               return ("OPENREC");
+       case NBR_STA_OPENSENT:
+               return ("OPENSENT");
+       case NBR_STA_OPER:
+               return ("OPERATIONAL");
+       default:
+               return ("UNKNOWN");
+       }
+}
+
+const char *
+if_state_name(int state)
+{
+       switch (state) {
+       case IF_STA_DOWN:
+               return ("DOWN");
+       case IF_STA_ACTIVE:
+               return ("ACTIVE");
+       default:
+               return ("UNKNOWN");
+       }
+}
+
+const char *
+if_type_name(enum iface_type type)
+{
+       switch (type) {
+       case IF_TYPE_POINTOPOINT:
+               return ("POINTOPOINT");
+       case IF_TYPE_BROADCAST:
+               return ("BROADCAST");
+       }
+       /* NOTREACHED */
+       return ("UNKNOWN");
+}
+
+const char *
+msg_name(uint16_t msg)
+{
+       static char buf[16];
+
+       switch (msg) {
+       case MSG_TYPE_NOTIFICATION:
+               return ("notification");
+       case MSG_TYPE_HELLO:
+               return ("hello");
+       case MSG_TYPE_INIT:
+               return ("initialization");
+       case MSG_TYPE_KEEPALIVE:
+               return ("keepalive");
+       case MSG_TYPE_CAPABILITY:
+               return ("capability");
+       case MSG_TYPE_ADDR:
+               return ("address");
+       case MSG_TYPE_ADDRWITHDRAW:
+               return ("address withdraw");
+       case MSG_TYPE_LABELMAPPING:
+               return ("label mapping");
+       case MSG_TYPE_LABELREQUEST:
+               return ("label request");
+       case MSG_TYPE_LABELWITHDRAW:
+               return ("label withdraw");
+       case MSG_TYPE_LABELRELEASE:
+               return ("label release");
+       case MSG_TYPE_LABELABORTREQ:
+       default:
+               snprintf(buf, sizeof(buf), "[%08x]", msg);
+               return (buf);
+       }
+}
+
+const char *
+status_code_name(uint32_t status)
+{
+       static char buf[16];
+
+       switch (status) {
+       case S_SUCCESS:
+               return ("Success");
+       case S_BAD_LDP_ID:
+               return ("Bad LDP Identifier");
+       case S_BAD_PROTO_VER:
+               return ("Bad Protocol Version");
+       case S_BAD_PDU_LEN:
+               return ("Bad PDU Length");
+       case S_UNKNOWN_MSG:
+               return ("Unknown Message Type");
+       case S_BAD_MSG_LEN:
+               return ("Bad Message Length");
+       case S_UNKNOWN_TLV:
+               return ("Unknown TLV");
+       case S_BAD_TLV_LEN:
+               return ("Bad TLV Length");
+       case S_BAD_TLV_VAL:
+               return ("Malformed TLV Value");
+       case S_HOLDTIME_EXP:
+               return ("Hold Timer Expired");
+       case S_SHUTDOWN:
+               return ("Shutdown");
+       case S_LOOP_DETECTED:
+               return ("Loop Detected");
+       case S_UNKNOWN_FEC:
+               return ("Unknown FEC");
+       case S_NO_ROUTE:
+               return ("No Route");
+       case S_NO_LABEL_RES:
+               return ("No Label Resources");
+       case S_AVAILABLE:
+               return ("Label Resources Available");
+       case S_NO_HELLO:
+               return ("Session Rejected, No Hello");
+       case S_PARM_ADV_MODE:
+               return ("Rejected Advertisement Mode Parameter");
+       case S_MAX_PDU_LEN:
+               return ("Rejected Max PDU Length Parameter");
+       case S_PARM_L_RANGE:
+               return ("Rejected Label Range Parameter");
+       case S_KEEPALIVE_TMR:
+               return ("KeepAlive Timer Expired");
+       case S_LAB_REQ_ABRT:
+               return ("Label Request Aborted");
+       case S_MISS_MSG:
+               return ("Missing Message Parameters");
+       case S_UNSUP_ADDR:
+               return ("Unsupported Address Family");
+       case S_KEEPALIVE_BAD:
+               return ("Bad KeepAlive Time");
+       case S_INTERN_ERR:
+               return ("Internal Error");
+       case S_ILLEGAL_CBIT:
+               return ("Illegal C-Bit");
+       case S_WRONG_CBIT:
+               return ("Wrong C-Bit");
+       case S_INCPT_BITRATE:
+               return ("Incompatible bit-rate");
+       case S_CEP_MISCONF:
+               return ("CEP-TDM mis-configuration");
+       case S_PW_STATUS:
+               return ("PW Status");
+       case S_UNASSIGN_TAI:
+               return ("Unassigned/Unrecognized TAI");
+       case S_MISCONF_ERR:
+               return ("Generic Misconfiguration Error");
+       case S_WITHDRAW_MTHD:
+               return ("Label Withdraw PW Status Method");
+       case S_UNSSUPORTDCAP:
+               return ("Unsupported Capability");
+       case S_ENDOFLIB:
+               return ("End-of-LIB");
+       case S_TRANS_MISMTCH:
+               return ("Transport Connection Mismatch");
+       case S_DS_NONCMPLNCE:
+               return ("Dual-Stack Noncompliance");
+       default:
+               snprintf(buf, sizeof(buf), "[%08x]", status);
+               return (buf);
+       }
+}
+
+const char *
+pw_type_name(uint16_t pw_type)
+{
+       static char buf[64];
+
+       switch (pw_type) {
+       case PW_TYPE_ETHERNET_TAGGED:
+               return ("Eth Tagged");
+       case PW_TYPE_ETHERNET:
+               return ("Ethernet");
+       case PW_TYPE_WILDCARD:
+               return ("Wildcard");
+       default:
+               snprintf(buf, sizeof(buf), "[%0x]", pw_type);
+               return (buf);
+       }
+}