49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * CDDL HEADER START
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * The contents of this file are subject to the terms of the
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Common Development and Distribution License (the "License").
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * You may not use this file except in compliance with the License.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * or http://www.opensolaris.org/os/licensing.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * See the License for the specific language governing permissions
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * and limitations under the License.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * When distributing Covered Code, include this CDDL HEADER in each
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * If applicable, add the following below this CDDL HEADER, with the
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * fields enclosed by brackets "[]" replaced with your own identifying
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * information: Portions Copyright [yyyy] [name of copyright owner]
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * CDDL HEADER END
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Use is subject to license terms.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Logging support for the LDoms Agent daemon
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <errno.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <stdarg.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <stdio.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <string.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <syslog.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/types.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MAX_MSG_LEN 512
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MAX_TIME_LEN 32
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreextern boolean_t ldma_debug;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreextern boolean_t ldma_daemon;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic char *log_prio_str[] = {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "EMERG", /* LOG_EMERG */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "ALERT", /* LOG_ALERT */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "CRIT", /* LOG_CRIT */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "ERROR", /* LOG_ERR */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "WARNING", /* LOG_WARNING */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "NOTICE", /* LOG_NOTICE */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "INFO", /* LOG_INFO */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "DEBUG" /* LOG_DEBUG */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre};
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Generate a timestamp string in the provided buffer.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * If any errors are encountered, the function returns
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * with the buffer containing an empty string.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic void
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_timestamp(char *buf, size_t buflen)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre{
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre struct tm ltime;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre struct timeval now;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if ((buf == NULL) || (buflen == 0))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre buf[0] = '\0';
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (gettimeofday(&now, NULL) != 0) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) fprintf(stderr, "gettimeofday failed: %s\n",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre strerror(errno));
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (localtime_r(&now.tv_sec, &ltime) == NULL) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) fprintf(stderr, "localtime_r failed: %s\n",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre strerror(errno));
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (strftime(buf, buflen, "%b %e %T ", &ltime) == 0) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) fprintf(stderr, "strftime failed: buffer[%d] too "
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "small\n", buflen);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * On failure, the contents of the buffer
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * are indeterminate. Restore it to a known
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * state before returning.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre buf[0] = '\0';
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic void
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_log_msg(int prio, char *module, char *fmt, va_list vap)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre{
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char msgbuf[LDMA_MAX_MSG_LEN];
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char timebuf[LDMA_MAX_TIME_LEN] = "";
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* generate a timestamp for the SMF log */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_timestamp(timebuf, sizeof (timebuf));
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* LINTED E_SEC_PRINTF_VAR_FMT */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) vsnprintf(msgbuf, LDMA_MAX_MSG_LEN, fmt, vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Print the message to stderr. In daemon mode, it
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * will be sent to the SMF log. In standalone mode,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * it will be sent to the controlling terminal.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) fprintf(stderr, "%s%s.%s: %s\n", timebuf, module,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre log_prio_str[prio], msgbuf);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (ldma_daemon && prio != LOG_DEBUG) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* LINTED E_SEC_PRINTF_VAR_FMT */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre syslog(prio, msgbuf);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrevoid
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_err(char *module, char *fmt, ...)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre{
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_list vap;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_start(vap, fmt);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_log_msg(LOG_ERR, module, fmt, vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_end(vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrevoid
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_info(char *module, char *fmt, ...)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre{
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_list vap;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_start(vap, fmt);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_log_msg(LOG_INFO, module, fmt, vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_end(vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrevoid
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_dbg(char *module, char *fmt, ...)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre{
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_list vap;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (!ldma_debug) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* not debugging */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_start(vap, fmt);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_log_msg(LOG_DEBUG, module, fmt, vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre va_end(vap);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}