cb5caa98562cf06753163f558cbcfe30b8f4673adjl/*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * CDDL HEADER START
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * The contents of this file are subject to the terms of the
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * Common Development and Distribution License (the "License").
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * You may not use this file except in compliance with the License.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * or http://www.opensolaris.org/os/licensing.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * See the License for the specific language governing permissions
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * and limitations under the License.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * When distributing Covered Code, include this CDDL HEADER in each
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * If applicable, add the following below this CDDL HEADER, with the
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * fields enclosed by brackets "[]" replaced with your own identifying
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * information: Portions Copyright [yyyy] [name of copyright owner]
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * CDDL HEADER END
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/*
18bdb8a7484e018149ac9a2766c97bdea9752c87michen * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * Use is subject to license terms.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#pragma ident "%Z%%M% %I% %E% SMI"
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <stdlib.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <locale.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <limits.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <fcntl.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <sys/stat.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <sys/varargs.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <synch.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <thread.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <string.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include <unistd.h>
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include "nscd_log.h"
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include "nscd_config.h"
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include "nscd_switch.h"
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#include "cache.h"
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * old nscd debug levels
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#define DBG_OFF 0
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#define DBG_CANT_FIND 2
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#define DBG_NETLOOKUPS 4
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#define DBG_ALL 6
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* max. chars in a nscd log entry */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl#define LOGBUFLEN 1024
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* configuration for the nscd log component */
18bdb8a7484e018149ac9a2766c97bdea9752c87michenint _nscd_log_comp = 0x0;
18bdb8a7484e018149ac9a2766c97bdea9752c87michenint _nscd_log_level = 0x0;
18bdb8a7484e018149ac9a2766c97bdea9752c87michenstatic char _nscd_logfile[PATH_MAX] = { 0 };
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
18bdb8a7484e018149ac9a2766c97bdea9752c87michen#define NSCD_DEBUG_NONE '0'
18bdb8a7484e018149ac9a2766c97bdea9752c87michen#define NSCD_DEBUG_OPEN '1'
18bdb8a7484e018149ac9a2766c97bdea9752c87michen#define NSCD_DEBUG_CLOSE '2'
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
18bdb8a7484e018149ac9a2766c97bdea9752c87michenstatic char _nscd_debug = NSCD_DEBUG_NONE;
18bdb8a7484e018149ac9a2766c97bdea9752c87michenstatic char _nscd_logfile_d[PATH_MAX] = { 0 };
18bdb8a7484e018149ac9a2766c97bdea9752c87michenstatic char _nscd_logfile_s[PATH_MAX] = { 0 };
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* statistics data */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlstatic nscd_cfg_stat_global_log_t logstats = {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl NSCD_CFG_STAT_GROUP_INFO_GLOBAL_LOG, 0 };
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* if no log file specified, log entry goes to stderr */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlint _logfd = 2;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* close old log file and open a new one */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlstatic nscd_rc_t
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_set_lf(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char *lf)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int newlogfd;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char *me = "_nscd_set_lf";
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * don't try and open the log file /dev/null
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (lf == NULL || *lf == 0) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* ignore empty log file specs */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else if (strcmp(lf, "/dev/null") == 0) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) strlcpy(_nscd_logfile, lf, PATH_MAX);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_logfd >= 0)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) close(_logfd);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _logfd = -1;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else if (strcmp(lf, "stderr") == 0) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) strlcpy(_nscd_logfile, lf, PATH_MAX);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_logfd != -1 && _logfd != 2)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) close(_logfd);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _logfd = 2;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * In order to open this file securely, we'll try a few tricks
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if ((newlogfd = open(lf, O_EXCL|O_WRONLY|O_CREAT, 0644)) < 0) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * File already exists... now we need to get cute
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * since opening a file in a world-writeable directory
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * safely is hard = it could be a hard link or a
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * symbolic link to a system file.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl struct stat before;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (lstat(lf, &before) < 0) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_NONE)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_logit(me, "Cannot open new "
18bdb8a7484e018149ac9a2766c97bdea9752c87michen "logfile \"%s\": %sn",
18bdb8a7484e018149ac9a2766c97bdea9752c87michen lf, strerror(errno));
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_FILE_OPEN_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (S_ISREG(before.st_mode) && /* no symbolic links */
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (before.st_nlink == 1) && /* no hard links */
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (before.st_uid == 0)) { /* owned by root */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if ((newlogfd =
cb5caa98562cf06753163f558cbcfe30b8f4673adjl open(lf, O_APPEND|O_WRONLY, 0644)) < 0) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_NONE)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_logit(me,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen "Cannot open new "\
18bdb8a7484e018149ac9a2766c97bdea9752c87michen "logfile \"%s\": %s\n", lf,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen strerror(errno));
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_FILE_OPEN_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_NONE)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_logit(me, "Cannot use specified "
18bdb8a7484e018149ac9a2766c97bdea9752c87michen "logfile \"%s\": "\
18bdb8a7484e018149ac9a2766c97bdea9752c87michen "file is/has links or isn't "
18bdb8a7484e018149ac9a2766c97bdea9752c87michen "owned by root\n", lf);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_FILE_OPEN_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) close(_logfd);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) strlcpy(_nscd_logfile, lf, PATH_MAX);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _logfd = newlogfd;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_NONE)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_logit(me, "Start of new logfile %s\n", lf);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* log an entry to the configured nscd log file */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlvoid
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_logit(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char *funcname,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char *format,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl ...)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl static mutex_t loglock = DEFAULTMUTEX;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl struct timeval tv;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char tid_buf[32];
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char pid_buf[32];
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char buffer[LOGBUFLEN];
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int safechars, offset;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl va_list ap;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_logfd < 0)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_OPEN) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) mutex_lock(&loglock);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_OPEN &&
18bdb8a7484e018149ac9a2766c97bdea9752c87michen *_nscd_logfile_d != '\0' &&
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (strcmp(_nscd_logfile, "/dev/null") == 0 ||
18bdb8a7484e018149ac9a2766c97bdea9752c87michen strcmp(_nscd_logfile, "stderr") == 0)) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) strlcpy(_nscd_logfile_s,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_logfile, PATH_MAX);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) _nscd_set_lf(_nscd_logfile_d);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen }
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_debug = NSCD_DEBUG_NONE;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) mutex_unlock(&loglock);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen } else if (_nscd_debug == NSCD_DEBUG_CLOSE) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) mutex_lock(&loglock);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_debug == NSCD_DEBUG_CLOSE)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) _nscd_set_lf(_nscd_logfile_s);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_debug = NSCD_DEBUG_NONE;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) mutex_unlock(&loglock);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen }
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
cb5caa98562cf06753163f558cbcfe30b8f4673adjl va_start(ap, format);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (gettimeofday(&tv, NULL) != 0 ||
cb5caa98562cf06753163f558cbcfe30b8f4673adjl ctime_r(&tv.tv_sec, buffer, LOGBUFLEN) == NULL) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) snprintf(buffer, LOGBUFLEN,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl "<time conversion failed>\t");
cb5caa98562cf06753163f558cbcfe30b8f4673adjl } else {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) sprintf(tid_buf, "--%d", thr_self());
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) sprintf(pid_buf, "--%ld", getpid());
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * ctime_r() includes some stuff we don't want;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * adjust length to overwrite " YYYY\n" and
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * include tid string length.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl offset = strlen(buffer) - 6;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl safechars = LOGBUFLEN - (offset - 1);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) snprintf(buffer + offset,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen safechars, ".%.4ld%s%s\t%s:\n\t\t",
18bdb8a7484e018149ac9a2766c97bdea9752c87michen tv.tv_usec/100, tid_buf, pid_buf,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen funcname);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl offset = strlen(buffer);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl safechars = LOGBUFLEN - (offset - 1);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*LINTED: E_SEC_PRINTF_VAR_FMT*/
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (vsnprintf(buffer + offset, safechars, format, ap) >
cb5caa98562cf06753163f558cbcfe30b8f4673adjl safechars) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) strncat(buffer, "...\n", LOGBUFLEN);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) mutex_lock(&loglock);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) write(_logfd, buffer, strlen(buffer));
cb5caa98562cf06753163f558cbcfe30b8f4673adjl logstats.entries_logged++;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl (void) mutex_unlock(&loglock);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl va_end(ap);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
18bdb8a7484e018149ac9a2766c97bdea9752c87michen/*
18bdb8a7484e018149ac9a2766c97bdea9752c87michen * Map old nscd debug level (0 -10) to log level:
18bdb8a7484e018149ac9a2766c97bdea9752c87michen * -- >= 6: DBG_ALL --> NSCD_LOG_LEVEL_ALL
18bdb8a7484e018149ac9a2766c97bdea9752c87michen * -- >= 4: DBG_DBG_NETLOOKUPS --> NSCD_LOG_LEVEL_CANT_FIND
18bdb8a7484e018149ac9a2766c97bdea9752c87michen * -- >= 2: DBG_CANT_FIND --> NSCD_LOG_LEVEL_CANT_FIND
18bdb8a7484e018149ac9a2766c97bdea9752c87michen * -- >= 0: DBG_OFF --> NSCD_LOG_LEVEL_NONE
18bdb8a7484e018149ac9a2766c97bdea9752c87michen */
18bdb8a7484e018149ac9a2766c97bdea9752c87michenstatic int
18bdb8a7484e018149ac9a2766c97bdea9752c87michendebug_to_log_level(
18bdb8a7484e018149ac9a2766c97bdea9752c87michen int level)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen{
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (level >= 0 && level <= 10) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (level >= DBG_ALL)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen return (NSCD_LOG_LEVEL_ALL);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen else if (level >= DBG_NETLOOKUPS)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen return (NSCD_LOG_LEVEL_CANT_FIND);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen else if (level >= DBG_CANT_FIND)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen return (NSCD_LOG_LEVEL_CANT_FIND);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen else if (level >= DBG_OFF)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen return (NSCD_LOG_LEVEL_NONE);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen }
18bdb8a7484e018149ac9a2766c97bdea9752c87michen return (level);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* ARGSUSED */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlnscd_rc_t
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_cfg_log_notify(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl void *data,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl struct nscd_cfg_param_desc *pdesc,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_id_t *nswdb,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_flag_t dflag,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_error_t **errorp,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl void *cookie)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_global_log_t *logcfg;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int off;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * At init time, the whole group of config params are received.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * At update time, group or individual parameter value could
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * be received.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_flag_is_set(dflag, NSCD_CFG_DFLAG_GROUP)) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl logcfg = (nscd_cfg_global_log_t *)data;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _nscd_log_comp = logcfg->debug_comp;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _nscd_log_level = logcfg->debug_level;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * logcfg->logfile should have been opened
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * by _nscd_cfg_log_verify()
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * individual config parameter
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl off = offsetof(nscd_cfg_global_log_t, debug_comp);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (pdesc->p_offset == off) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _nscd_log_comp = *(nscd_cfg_bitmap_t *)data;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl off = offsetof(nscd_cfg_global_log_t, debug_level);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (pdesc->p_offset == off)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _nscd_log_level = *(nscd_cfg_bitmap_t *)data;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * logcfg->logfile should have been opened
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * by _nscd_cfg_log_verify()
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* ARGSUSED */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlnscd_rc_t
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_cfg_log_verify(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl void *data,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl struct nscd_cfg_param_desc *pdesc,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_id_t *nswdb,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_flag_t dflag,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_error_t **errorp,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl void **cookie)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_global_log_t *logcfg;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_bitmap_t bt;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int off;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * There is no switch db specific config params
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * for the nscd log component. It is a bug if
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * the input param description is global.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_flag_is_not_set(pdesc->pflag, NSCD_CFG_PFLAG_GLOBAL))
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_PARAM_DESC_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * At init time, the whole group of config params are received.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * At update time, group or individual parameter value could
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * be received.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_flag_is_set(dflag, NSCD_CFG_DFLAG_GROUP)) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl logcfg = (nscd_cfg_global_log_t *)data;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_bitmap_valid(logcfg->debug_comp,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen NSCD_LOG_ALL) == 0)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_SYNTAX_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_bitmap_valid(logcfg->debug_level,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen NSCD_LOG_LEVEL_ALL) == 0)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_SYNTAX_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (logcfg->logfile != NULL)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (_nscd_set_lf(logcfg->logfile));
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * individual config parameter
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl off = offsetof(nscd_cfg_global_log_t, debug_comp);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (pdesc->p_offset == off) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl bt = *(nscd_cfg_bitmap_t *)data;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_bitmap_valid(bt, NSCD_LOG_ALL) == 0)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_SYNTAX_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl off = offsetof(nscd_cfg_global_log_t, debug_level);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (pdesc->p_offset == off) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl bt = *(nscd_cfg_bitmap_t *)data;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (_nscd_cfg_bitmap_valid(bt, NSCD_LOG_LEVEL_ALL) == 0)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_SYNTAX_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl off = offsetof(nscd_cfg_global_log_t, logfile);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (pdesc->p_offset == off) {
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (data != NULL)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (_nscd_set_lf((char *)data));
cb5caa98562cf06753163f558cbcfe30b8f4673adjl else
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_CFG_PARAM_DESC_ERROR);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/* ARGSUSED */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlnscd_rc_t
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_cfg_log_get_stat(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl void **stat,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl struct nscd_cfg_stat_desc *sdesc,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_id_t *nswdb,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_flag_t *dflag,
cb5caa98562cf06753163f558cbcfe30b8f4673adjl void (**free_stat)(void *stat),
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_error_t **errorp)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *(nscd_cfg_stat_global_log_t **)stat = &logstats;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl /* indicate the statistics are static, i.e., do not free */
cb5caa98562cf06753163f558cbcfe30b8f4673adjl *dflag = _nscd_cfg_flag_set(*dflag, NSCD_CFG_DFLAG_STATIC_DATA);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl/*
cb5caa98562cf06753163f558cbcfe30b8f4673adjl * set the name of the current log file and make it current.
cb5caa98562cf06753163f558cbcfe30b8f4673adjl */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlnscd_rc_t
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_set_log_file(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl char *name)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_rc_t rc;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_handle_t *h;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl rc = _nscd_cfg_get_handle("logfile", NULL, &h, NULL);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (rc != NSCD_SUCCESS)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (rc);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl rc = _nscd_cfg_set(h, name, NULL);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _nscd_cfg_free_handle(h);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (rc != NSCD_SUCCESS)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl exit(rc);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
18bdb8a7484e018149ac9a2766c97bdea9752c87michen/* Set debug level to the new one and make it current */
cb5caa98562cf06753163f558cbcfe30b8f4673adjlnscd_rc_t
cb5caa98562cf06753163f558cbcfe30b8f4673adjl_nscd_set_debug_level(
cb5caa98562cf06753163f558cbcfe30b8f4673adjl int level)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl{
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_rc_t rc;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl nscd_cfg_handle_t *h;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen int l = 0;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen int c = -1;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
18bdb8a7484e018149ac9a2766c97bdea9752c87michen /* old nscd debug level is 1 to 10, map it to log_level and log_comp */
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (level >= 0 && level <= 10) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen l = debug_to_log_level(level);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen c = NSCD_LOG_CACHE;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen } else
18bdb8a7484e018149ac9a2766c97bdea9752c87michen l = level;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (level < 0)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen c = -1 * level / 1000000;
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (c != -1) {
18bdb8a7484e018149ac9a2766c97bdea9752c87michen rc = _nscd_cfg_get_handle("debug-components", NULL, &h, NULL);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (rc != NSCD_SUCCESS)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen return (rc);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
18bdb8a7484e018149ac9a2766c97bdea9752c87michen rc = _nscd_cfg_set(h, &c, NULL);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen _nscd_cfg_free_handle(h);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (rc != NSCD_SUCCESS)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen exit(rc);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen }
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl rc = _nscd_cfg_get_handle("debug-level", NULL, &h, NULL);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (rc != NSCD_SUCCESS)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (rc);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (level < 0)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen l = -1 * level % 1000000;
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl rc = _nscd_cfg_set(h, &l, NULL);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl _nscd_cfg_free_handle(h);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl if (rc != NSCD_SUCCESS)
cb5caa98562cf06753163f558cbcfe30b8f4673adjl exit(rc);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl
cb5caa98562cf06753163f558cbcfe30b8f4673adjl return (NSCD_SUCCESS);
cb5caa98562cf06753163f558cbcfe30b8f4673adjl}
18bdb8a7484e018149ac9a2766c97bdea9752c87michen
18bdb8a7484e018149ac9a2766c97bdea9752c87michenvoid
18bdb8a7484e018149ac9a2766c97bdea9752c87michen_nscd_get_log_info(
18bdb8a7484e018149ac9a2766c97bdea9752c87michen char *level,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen int llen,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen char *file,
18bdb8a7484e018149ac9a2766c97bdea9752c87michen int flen)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen{
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (_nscd_log_level != 0)
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) snprintf(level, llen, "%d", _nscd_log_level);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen if (*_nscd_logfile != '\0')
18bdb8a7484e018149ac9a2766c97bdea9752c87michen (void) strlcpy(file, _nscd_logfile, flen);
18bdb8a7484e018149ac9a2766c97bdea9752c87michen}