view src/logerr.h @ 5441:ff7c7b4799b3 draft

dhcpcd: Redirect stdout/stderr to the launcher stderr descriptor This actually make life really simple! We no longer need to redirect stdout/stderr to /dev/null for privsep and any script output is now captured again - and it all goes to stderr as it should even if a script wants it to go to stdout. On the happy path, only the master process will actually log anything to stderr so we turn that off after we "fork". On the unhappy path, logging to stderr/stdout *may* fail because the launcher process *may* have exited. We *could* have the master process as an intermediary but that's just excess code to avoid errors which *should* not happen. Regardless, any errror should still hit syslog.
author Roy Marples <roy@marples.name>
date Sun, 06 Sep 2020 02:41:08 +0100
parents 3ed7914080a9
children 26b5d9bc2985
line wrap: on
line source

/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * logerr: errx with logging
 * Copyright (c) 2006-2020 Roy Marples <roy@marples.name>
 * All rights reserved

 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef LOGERR_H
#define LOGERR_H

#include <sys/param.h>

#ifndef __printflike
#if __GNUC__ > 2 || defined(__INTEL_COMPILER)
#define	__printflike(a, b) __attribute__((format(printf, a, b)))
#else
#define	__printflike(a, b)
#endif
#endif /* !__printflike */

/* Please do not call log_* functions directly, use macros below */
__printflike(1, 2) void log_debug(const char *, ...);
__printflike(1, 2) void log_debugx(const char *, ...);
__printflike(1, 2) void log_info(const char *, ...);
__printflike(1, 2) void log_infox(const char *, ...);
__printflike(1, 2) void log_warn(const char *, ...);
__printflike(1, 2) void log_warnx(const char *, ...);
__printflike(1, 2) void log_err(const char *, ...);
__printflike(1, 2) void log_errx(const char *, ...);
#define	LOGERROR	logerr("%s: %d", __FILE__, __LINE__)

__printflike(2, 3) void logmessage(int pri, const char *fmt, ...);
__printflike(2, 3) void logerrmessage(int pri, const char *fmt, ...);

/*
 * These are macros to prevent taking address of them so
 * __FILE__, __LINE__, etc can easily be added.
 *
 * We should be using
 * #define loginfox(fmt, __VA_OPT__(,) __VA_ARGS__)
 * but that requires gcc-8 or clang-6 and we still have a need to support
 * old OS's without modern compilers.
 *
 * Likewise, ##__VA_ARGS__ can't be used as that's a gcc only extension.
 *
 * The solution is to put fmt into __VA_ARGS__.
 * It's not pretty but it's 100% portable.
 */
#define logdebug(...)	log_debug(__VA_ARGS__)
#define logdebugx(...)	log_debugx(__VA_ARGS__)
#define loginfo(...)	log_info(__VA_ARGS__)
#define loginfox(...)	log_infox(__VA_ARGS__)
#define logwarn(...)	log_warn(__VA_ARGS__)
#define logwarnx(...)	log_warnx(__VA_ARGS__)
#define logerr(...)	log_err(__VA_ARGS__)
#define logerrx(...)	log_errx(__VA_ARGS__)

unsigned int loggetopts(void);
void logsetopts(unsigned int);
#define	LOGERR_DEBUG	(1U << 6)
#define	LOGERR_QUIET	(1U << 7)
#define	LOGERR_LOG	(1U << 11)
#define	LOGERR_LOG_DATE	(1U << 12)
#define	LOGERR_LOG_HOST	(1U << 13)
#define	LOGERR_LOG_TAG	(1U << 14)
#define	LOGERR_LOG_PID	(1U << 15)
#define	LOGERR_ERR	(1U << 21)
#define	LOGERR_ERR_DATE	(1U << 22)
#define	LOGERR_ERR_HOST	(1U << 23)
#define	LOGERR_ERR_TAG	(1U << 24)
#define	LOGERR_ERR_PID	(1U << 25)

/* To build tag support or not. */
//#define	LOGERR_TAG
#if defined(LOGERR_TAG)
void logsettag(const char *);
#endif

int logopen(const char *);
void logclose(void);
int logreopen(void);

#endif