1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

work on making log.c similar in all daemons:

move daemon-local functions into new logmsg.c, and reduce
the (mostly whitespace) differences so that log.c's can be diffed easily.

ok claudio@, feedback from henning@, deraadt@, reyk@
This commit is contained in:
benno 2016-09-02 14:00:29 +00:00
parent 0e505e7302
commit 02cd9e4b93
7 changed files with 177 additions and 318 deletions

View File

@ -1,7 +1,7 @@
# $OpenBSD: Makefile,v 1.29 2010/05/26 16:44:32 nicm Exp $
# $OpenBSD: Makefile,v 1.30 2016/09/02 14:00:29 benno Exp $
PROG= bgpd
SRCS= bgpd.c session.c log.c parse.y config.c \
SRCS= bgpd.c session.c log.c logmsg.c parse.y config.c \
rde.c rde_rib.c rde_decide.c rde_prefix.c mrt.c kroute.c \
control.c pfkey.c rde_update.c rde_attr.c printconf.c \
rde_filter.c pftable.c name2id.c util.c carp.c timer.c

View File

@ -1,4 +1,4 @@
/* $OpenBSD: bgpd.c,v 1.185 2016/06/20 20:12:52 benno Exp $ */
/* $OpenBSD: bgpd.c,v 1.186 2016/09/02 14:00:29 benno Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -117,6 +117,7 @@ main(int argc, char *argv[])
conffile = CONFFILE;
bgpd_process = PROC_MAIN;
log_procname = log_procnames[bgpd_process];
log_init(1); /* log to stderr until daemonized */
log_verbose(1);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: bgpd.h,v 1.294 2016/06/06 15:59:10 benno Exp $ */
/* $OpenBSD: bgpd.h,v 1.295 2016/09/02 14:00:29 benno Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -33,6 +33,8 @@
#include <imsg.h>
#include "log.h"
#define BGP_VERSION 4
#define BGP_PORT 179
#define CONFFILE "/etc/bgpd.conf"
@ -1079,4 +1081,134 @@ int af2aid(sa_family_t, u_int8_t, u_int8_t *);
struct sockaddr *addr2sa(struct bgpd_addr *, u_int16_t);
void sa2addr(struct sockaddr *, struct bgpd_addr *);
static const char * const log_procnames[] = {
"parent",
"SE",
"RDE"
};
/* logmsg.c and needed by bgpctl */
static const char * const statenames[] = {
"None",
"Idle",
"Connect",
"Active",
"OpenSent",
"OpenConfirm",
"Established"
};
static const char * const msgtypenames[] = {
"NONE",
"OPEN",
"UPDATE",
"NOTIFICATION",
"KEEPALIVE",
"RREFRESH"
};
static const char * const eventnames[] = {
"None",
"Start",
"Stop",
"Connection opened",
"Connection closed",
"Connection open failed",
"Fatal error",
"ConnectRetryTimer expired",
"HoldTimer expired",
"KeepaliveTimer expired",
"OPEN message received",
"KEEPALIVE message received",
"UPDATE message received",
"NOTIFICATION received"
};
static const char * const errnames[] = {
"none",
"Header error",
"error in OPEN message",
"error in UPDATE message",
"HoldTimer expired",
"Finite State Machine error",
"Cease"
};
static const char * const suberr_header_names[] = {
"none",
"synchronization error",
"wrong length",
"unknown message type"
};
static const char * const suberr_open_names[] = {
"none",
"version mismatch",
"AS unacceptable",
"BGPID invalid",
"optional parameter error",
"authentication error",
"unacceptable holdtime",
"unsupported capability",
"group membership conflict", /* draft-ietf-idr-bgp-multisession-07 */
"group membership required" /* draft-ietf-idr-bgp-multisession-07 */
};
static const char * const suberr_fsm_names[] = {
"unspecified error",
"received unexpected message in OpenSent",
"received unexpected message in OpenConfirm",
"received unexpected message in Established"
};
static const char * const suberr_update_names[] = {
"none",
"attribute list error",
"unknown well-known attribute",
"well-known attribute missing",
"attribute flags error",
"attribute length wrong",
"origin unacceptable",
"loop detected",
"nexthop unacceptable",
"optional attribute error",
"network unacceptable",
"AS-Path unacceptable"
};
static const char * const suberr_cease_names[] = {
"none",
"max-prefix exceeded",
"administratively down",
"peer unconfigured",
"administrative reset",
"connection rejected",
"other config change",
"collision",
"resource exhaustion"
};
static const char * const ctl_res_strerror[] = {
"no error",
"no such neighbor",
"permission denied",
"neighbor does not have this capability",
"config file has errors, reload failed",
"previous reload still running",
"out of memory",
"not a cloned peer",
"peer still active, down peer first"
};
static const char * const timernames[] = {
"None",
"ConnectRetryTimer",
"KeepaliveTimer",
"HoldTimer",
"IdleHoldTimer",
"IdleHoldResetTimer",
"CarpUndemoteTimer",
""
};
#endif /* __BGPD_H__ */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: log.c,v 1.60 2016/08/08 21:44:00 renato Exp $ */
/* $OpenBSD: log.c,v 1.61 2016/09/02 14:00:29 benno Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -16,52 +16,19 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <err.h>
#include <errno.h>
#include <netdb.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <time.h>
#include <unistd.h>
#include "bgpd.h"
#include "session.h"
#include "log.h"
int debug;
int verbose;
char *
log_fmt_peer(const struct peer_config *peer)
{
const char *ip;
char *pfmt, *p;
ip = log_addr(&peer->remote_addr);
if ((peer->remote_addr.aid == AID_INET && peer->remote_masklen != 32) ||
(peer->remote_addr.aid == AID_INET6 &&
peer->remote_masklen != 128)) {
if (asprintf(&p, "%s/%u", ip, peer->remote_masklen) == -1)
fatal(NULL);
} else {
if ((p = strdup(ip)) == NULL)
fatal(NULL);
}
if (peer->descr[0]) {
if (asprintf(&pfmt, "neighbor %s (%s)", p, peer->descr) ==
-1)
fatal(NULL);
} else {
if (asprintf(&pfmt, "neighbor %s", p) == -1)
fatal(NULL);
}
free(p);
return (pfmt);
}
int debug;
int verbose;
const char *log_procname;
void
log_init(int n_debug)
@ -111,45 +78,6 @@ vlog(int pri, const char *fmt, va_list ap)
vsyslog(pri, fmt, ap);
}
void
log_peer_warn(const struct peer_config *peer, const char *emsg, ...)
{
char *p, *nfmt;
va_list ap;
p = log_fmt_peer(peer);
if (emsg == NULL) {
if (asprintf(&nfmt, "%s: %s", p, strerror(errno)) == -1)
fatal(NULL);
} else {
if (asprintf(&nfmt, "%s: %s: %s", p, emsg, strerror(errno)) ==
-1)
fatal(NULL);
}
va_start(ap, emsg);
vlog(LOG_CRIT, nfmt, ap);
va_end(ap);
free(p);
free(nfmt);
}
void
log_peer_warnx(const struct peer_config *peer, const char *emsg, ...)
{
char *p, *nfmt;
va_list ap;
p = log_fmt_peer(peer);
if (asprintf(&nfmt, "%s: %s", p, emsg) == -1)
fatal(NULL);
va_start(ap, emsg);
vlog(LOG_CRIT, nfmt, ap);
va_end(ap);
free(p);
free(nfmt);
}
void
log_warn(const char *emsg, ...)
{
@ -217,15 +145,15 @@ fatal(const char *emsg, ...)
va_end(ap);
if (emsg == NULL)
logit(LOG_CRIT, "fatal in %s: %s", procnames[bgpd_process],
logit(LOG_CRIT, "fatal in %s: %s", log_procname,
strerror(errno));
else
if (errno)
logit(LOG_CRIT, "fatal in %s: %s: %s",
procnames[bgpd_process], s, strerror(errno));
log_procname, s, strerror(errno));
else
logit(LOG_CRIT, "fatal in %s: %s",
procnames[bgpd_process], s);
log_procname, s);
exit(1);
}
@ -236,109 +164,3 @@ fatalx(const char *emsg)
errno = 0;
fatal(emsg);
}
void
log_statechange(struct peer *peer, enum session_state nstate,
enum session_events event)
{
char *p;
/* don't clutter the logs with constant Connect -> Active -> Connect */
if (nstate == STATE_CONNECT && peer->state == STATE_ACTIVE &&
peer->prev_state == STATE_CONNECT)
return;
if (nstate == STATE_ACTIVE && peer->state == STATE_CONNECT &&
peer->prev_state == STATE_ACTIVE)
return;
peer->lasterr = 0;
p = log_fmt_peer(&peer->conf);
logit(LOG_INFO, "%s: state change %s -> %s, reason: %s",
p, statenames[peer->state], statenames[nstate], eventnames[event]);
free(p);
}
void
log_notification(const struct peer *peer, u_int8_t errcode, u_int8_t subcode,
u_char *data, u_int16_t datalen, const char *dir)
{
char *p;
const char *suberrname = NULL;
int uk = 0;
p = log_fmt_peer(&peer->conf);
switch (errcode) {
case ERR_HEADER:
if (subcode >= sizeof(suberr_header_names)/sizeof(char *))
uk = 1;
else
suberrname = suberr_header_names[subcode];
break;
case ERR_OPEN:
if (subcode >= sizeof(suberr_open_names)/sizeof(char *))
uk = 1;
else
suberrname = suberr_open_names[subcode];
break;
case ERR_UPDATE:
if (subcode >= sizeof(suberr_update_names)/sizeof(char *))
uk = 1;
else
suberrname = suberr_update_names[subcode];
break;
case ERR_CEASE:
if (subcode >= sizeof(suberr_cease_names)/sizeof(char *))
uk = 1;
else
suberrname = suberr_cease_names[subcode];
break;
case ERR_HOLDTIMEREXPIRED:
if (subcode != 0)
uk = 1;
break;
case ERR_FSM:
if (subcode >= sizeof(suberr_fsm_names)/sizeof(char *))
uk = 1;
else
suberrname = suberr_fsm_names[subcode];
break;
default:
logit(LOG_CRIT, "%s: %s notification, unknown errcode "
"%u, subcode %u", p, dir, errcode, subcode);
free(p);
return;
}
if (uk)
logit(LOG_CRIT, "%s: %s notification: %s, unknown subcode %u",
p, dir, errnames[errcode], subcode);
else {
if (suberrname == NULL)
logit(LOG_CRIT, "%s: %s notification: %s", p,
dir, errnames[errcode]);
else
logit(LOG_CRIT, "%s: %s notification: %s, %s",
p, dir, errnames[errcode], suberrname);
}
free(p);
}
void
log_conn_attempt(const struct peer *peer, struct sockaddr *sa)
{
char *p;
const char *b;
if (peer == NULL) { /* connection from non-peer, drop */
b = log_sockaddr(sa);
logit(LOG_INFO, "connection from non-peer %s refused", b);
} else {
/* only log if there is a chance that the session may come up */
if (peer->conf.down && peer->state == STATE_IDLE)
return;
p = log_fmt_peer(&peer->conf);
logit(LOG_INFO, "Connection attempt from %s while session is "
"in state %s", p, statenames[peer->state]);
free(p);
}
}

View File

@ -1,4 +1,4 @@
/* $OpenBSD: log.h,v 1.17 2015/10/24 08:06:45 claudio Exp $ */
/* $OpenBSD: log.h,v 1.18 2016/09/02 14:00:29 benno Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -16,131 +16,31 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
static const char * const statenames[] = {
"None",
"Idle",
"Connect",
"Active",
"OpenSent",
"OpenConfirm",
"Established"
};
#ifndef LOG_H
#define LOG_H
static const char * const msgtypenames[] = {
"NONE",
"OPEN",
"UPDATE",
"NOTIFICATION",
"KEEPALIVE",
"RREFRESH"
};
#include <stdarg.h>
#include <sys/cdefs.h>
static const char * const eventnames[] = {
"None",
"Start",
"Stop",
"Connection opened",
"Connection closed",
"Connection open failed",
"Fatal error",
"ConnectRetryTimer expired",
"HoldTimer expired",
"KeepaliveTimer expired",
"OPEN message received",
"KEEPALIVE message received",
"UPDATE message received",
"NOTIFICATION received"
};
extern const char *log_procname;
static const char * const errnames[] = {
"none",
"Header error",
"error in OPEN message",
"error in UPDATE message",
"HoldTimer expired",
"Finite State Machine error",
"Cease"
};
void log_init(int);
void log_verbose(int);
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_debug(const char *, ...)
__attribute__((__format__ (printf, 1, 2)));
void fatal(const char *, ...) __dead
__attribute__((__format__ (printf, 1, 2)));
void fatalx(const char *) __dead
__attribute__((__format__ (printf, 1, 0)));
static const char * const suberr_header_names[] = {
"none",
"synchronization error",
"wrong length",
"unknown message type"
};
static const char * const suberr_open_names[] = {
"none",
"version mismatch",
"AS unacceptable",
"BGPID invalid",
"optional parameter error",
"authentication error",
"unacceptable holdtime",
"unsupported capability",
"group membership conflict", /* draft-ietf-idr-bgp-multisession-07 */
"group membership required" /* draft-ietf-idr-bgp-multisession-07 */
};
static const char * const suberr_fsm_names[] = {
"unspecified error",
"received unexpected message in OpenSent",
"received unexpected message in OpenConfirm",
"received unexpected message in Established"
};
static const char * const suberr_update_names[] = {
"none",
"attribute list error",
"unknown well-known attribute",
"well-known attribute missing",
"attribute flags error",
"attribute length wrong",
"origin unacceptable",
"loop detected",
"nexthop unacceptable",
"optional attribute error",
"network unacceptable",
"AS-Path unacceptable"
};
static const char * const suberr_cease_names[] = {
"none",
"max-prefix exceeded",
"administratively down",
"peer unconfigured",
"administrative reset",
"connection rejected",
"other config change",
"collision",
"resource exhaustion"
};
static const char * const procnames[] = {
"parent",
"SE",
"RDE"
};
static const char * const ctl_res_strerror[] = {
"no error",
"no such neighbor",
"permission denied",
"neighbor does not have this capability",
"config file has errors, reload failed",
"previous reload still running",
"out of memory",
"not a cloned peer",
"peer still active, down peer first"
};
static const char * const timernames[] = {
"None",
"ConnectRetryTimer",
"KeepaliveTimer",
"HoldTimer",
"IdleHoldTimer",
"IdleHoldResetTimer",
"CarpUndemoteTimer",
""
};
#endif /* LOG_H */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: rde.c,v 1.348 2016/08/08 21:44:00 renato Exp $ */
/* $OpenBSD: rde.c,v 1.349 2016/09/02 14:00:29 benno Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -168,6 +168,9 @@ rde_main(int debug, int verbose)
int timeout;
u_int8_t aid;
bgpd_process = PROC_RDE;
log_procname = log_procnames[bgpd_process];
log_init(debug);
log_verbose(verbose);
@ -180,7 +183,6 @@ rde_main(int debug, int verbose)
fatal("chdir(\"/\")");
setproctitle("route decision engine");
bgpd_process = PROC_RDE;
if (setgroups(1, &pw->pw_gid) ||
setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||

View File

@ -1,4 +1,4 @@
/* $OpenBSD: session.c,v 1.352 2016/08/08 21:44:00 renato Exp $ */
/* $OpenBSD: session.c,v 1.353 2016/09/02 14:00:29 benno Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@ -202,6 +202,9 @@ session_main(int debug, int verbose)
void *newp;
short events;
bgpd_process = PROC_SE;
log_procname = log_procnames[bgpd_process];
log_init(debug);
log_verbose(verbose);
@ -214,7 +217,6 @@ session_main(int debug, int verbose)
fatal("chdir(\"/\")");
setproctitle("session engine");
bgpd_process = PROC_SE;
pfkeysock = pfkey_init(&sysdep);
if (setgroups(1, &pw->pw_gid) ||