usr/src/lib/libc/port/gen/syslog.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 7632 91aa3d8541b5
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 3235
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * University Copyright- Copyright (c) 1982, 1986, 1988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * The Regents of the University of California
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * All Rights Reserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * University Acknowledgment- Portions of this document are derived from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * software developed by the University of California, Berkeley, and its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * contributors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * SYSLOG -- print message on log file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * This routine looks a lot like printf, except that it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * outputs to the log file instead of the standard output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 * Also:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 *	adds a timestamp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 *	prints the module name in front of the message,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 *	has some other formatting types (or will sometime),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 *	adds a newline on the end of the message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * The output of this routine is intended to be read by /etc/syslogd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 3235
diff changeset
    55
#pragma weak _syslog = syslog
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 3235
diff changeset
    57
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/types32.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <sys/stropts.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <sys/strlog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <sys/log.h>		/* for LOG_MAXPS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <procfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include <stdarg.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#include <thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#include <sys/door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#include <stropts.h>
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
    81
#include <sys/fork.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
#include <sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#include "libc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#define	MAXLINE		1024		/* max message size (but see below) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#define	PRIMASK(p)	(1 << ((p) & LOG_PRIMASK))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
#define	PRIFAC(p)	(((p) & LOG_FACMASK) >> 3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#define	IMPORTANT 	LOG_ERR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
#ifndef FALSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
#define	FALSE 	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#ifndef TRUE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
#define	TRUE	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
#define	logname		"/dev/conslog"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
#define	ctty		"/dev/syscon"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
#define	sysmsg		"/dev/sysmsg"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
#define	DOORFILE	"/var/run/syslog_door"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
static struct __syslog {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	int	_LogFile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	int	_LogStat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	const char *_LogTag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	int	_LogMask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	char	*_SyslogHost;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	int	_LogFacility;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	int	_LogFileInvalid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	int	_OpenLogCalled;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	dev_t   _LogDev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	char	_ProcName[PRFNSZ + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
} __syslog = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	-1,		/* fd for log */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	0,		/* status bits, set by openlog() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	"syslog",	/* string to tag the entry with */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	0xff,		/* mask of priorities to be logged */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	LOG_USER,	/* default facility code */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	FALSE,		/* check for validity of fd for log */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	0,		/* openlog has not yet been called */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#define	LogFile (__syslog._LogFile)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
#define	LogStat (__syslog._LogStat)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
#define	LogTag (__syslog._LogTag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
#define	LogMask (__syslog._LogMask)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
#define	SyslogHost (__syslog._SyslogHost)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
#define	LogFacility (__syslog._LogFacility)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
#define	LogFileInvalid (__syslog._LogFileInvalid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
#define	OpenLogCalled (__syslog._OpenLogCalled)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
#define	LogDev (__syslog._LogDev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
#define	ProcName (__syslog._ProcName)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
static int syslogd_ok(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
 * Regrettably, there are several instances inside libc where
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
 * syslog() is called from the bottom of a deep call stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
 * and a critical lock was acquired near the top of the stack.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
 * Because syslog() uses stdio (and it is called from within stdio)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
 * it runs the danger of deadlocking, perhaps with an interposed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 * malloc() when fork() is occurring concurrently, perhaps with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 * some other lock within libc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 * The only fix for this problem is to restructure libc not to do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 * this thing and always to call syslog() with no locks held.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
 * This restructuring will require a substantial effort.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 * Meanwhile, we just hope that on the rare occasion that syslog()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 * is called from within libc (such occurrences should "never happen")
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * that we don't get caught in a race condition deadlock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
syslog(int pri, const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	va_list ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	va_start(ap, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	vsyslog(pri, fmt, ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	va_end(ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
vsyslog(int pri, const char *fmt, va_list ap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	char *b, *f, *o;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	char c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	int clen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	char buf[MAXLINE + 2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	char outline[MAXLINE + 256];  /* pad to allow date, system name... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	time_t now;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	pid_t pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	struct log_ctl hdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	struct strbuf dat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	struct strbuf ctl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	char timestr[26];	/* hardwired value 26 due to Posix */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	size_t taglen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	int olderrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	struct stat statbuff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	int procfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	char procfile[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	psinfo_t p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	int showpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	uint32_t msgid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	char *msgid_start, *msgid_end;
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   192
	int nowait;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 * Maximum tag length is 256 (the pad in outline) minus the size of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 * other things that can go in the pad.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
#define	MAX_TAG		230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	/* see if we should just throw out this message */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	if (pri < 0 || PRIFAC(pri) >= LOG_NFACILITIES ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	    (PRIMASK(pri) & LogMask) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	if (LogFileInvalid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	 * if openlog() has not been called by the application,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	 * try to get the name of the application and set it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	 * as the ident string for messages. If unable to get
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	 * it for any reason, fall back to using the default
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	 * of syslog. If we succeed in getting the name, also
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	 * turn on LOG_PID, to provide greater detail.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	showpid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	if (OpenLogCalled == 0) {
7632
91aa3d8541b5 6733185 Further cleanup of SUN Studio 12 lint warnings in ON source.
Nick Todd <Nick.Todd@Sun.COM>
parents: 6812
diff changeset
   218
		(void) sprintf(procfile, "/proc/%d/psinfo", (int)getpid());
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		if ((procfd = open(procfile, O_RDONLY)) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			if (read(procfd, &p, sizeof (psinfo_t)) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
				(void) strncpy(ProcName, p.pr_fname, PRFNSZ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
				LogTag = (const char *) &ProcName;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
				showpid = LOG_PID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			(void) close(procfd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	if (LogFile < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		openlog(LogTag, LogStat|LOG_NDELAY|showpid, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	if ((fstat(LogFile, &statbuff) != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	    (!S_ISCHR(statbuff.st_mode)) || (statbuff.st_rdev != LogDev)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		LogFileInvalid = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	/* set default facility if none specified */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	if ((pri & LOG_FACMASK) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		pri |= LogFacility;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	/* build the header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	hdr.pri = pri;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	hdr.flags = SL_CONSOLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	hdr.level = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	/* build the message */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	 * To avoid potential security problems, bounds checking is done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	 * on outline and buf.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	 * The following code presumes that the header information will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	 * fit in 250-odd bytes, as was accounted for in the buffer size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	 * allocation.  This is dependent on the assumption that the LogTag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	 * and the string returned by sprintf() for getpid() will return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	 * be less than 230-odd characters combined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	o = outline;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	(void) time(&now);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	(void) sprintf(o, "%.15s ", ctime_r(&now, timestr, 26) + 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	o += strlen(o);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	if (LogTag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		taglen = strlen(LogTag) < MAX_TAG ? strlen(LogTag) : MAX_TAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		(void) strncpy(o, LogTag, taglen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		o[taglen] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		o += strlen(o);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	if (LogStat & LOG_PID) {
7632
91aa3d8541b5 6733185 Further cleanup of SUN Studio 12 lint warnings in ON source.
Nick Todd <Nick.Todd@Sun.COM>
parents: 6812
diff changeset
   268
		(void) sprintf(o, "[%d]", (int)getpid());
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		o += strlen(o);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	if (LogTag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		(void) strcpy(o, ": ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		o += 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	STRLOG_MAKE_MSGID(fmt, msgid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	(void) sprintf(o, "[ID %u FACILITY_AND_PRIORITY] ", msgid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	o += strlen(o);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	b = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	f = (char *)fmt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	while ((c = *f++) != '\0' && b < &buf[MAXLINE]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		char *errmsg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		if (c != '%') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
			*b++ = c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		if ((c = *f++) != 'm') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			*b++ = '%';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
			*b++ = c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		if ((errmsg = strerror(olderrno)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
			(void) snprintf(b, &buf[MAXLINE] - b, "error %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			    olderrno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
			while (*errmsg != '\0' && b < &buf[MAXLINE]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
				if (*errmsg == '%') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
					(void) strcpy(b, "%%");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
					b += 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
					*b++ = *errmsg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
				errmsg++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			*b = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		b += strlen(b);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	if (b > buf && *(b-1) != '\n')	/* ensure at least one newline */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		*b++ = '\n';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	*b = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	/* LINTED variable format specifier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	(void) vsnprintf(o, &outline[sizeof (outline)] - o, buf, ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	clen  = (int)strlen(outline) + 1;	/* add one for NULL byte */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	if (clen > MAXLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		clen = MAXLINE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		outline[MAXLINE-1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	 * 1136432 points out that the underlying log driver actually
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	 * refuses to accept (ERANGE) messages longer than LOG_MAXPS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	 * bytes.  So it really doesn't make much sense to putmsg a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	 * longer message..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	if (clen > LOG_MAXPS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		clen = LOG_MAXPS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		outline[LOG_MAXPS-1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	/* set up the strbufs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	ctl.maxlen = sizeof (struct log_ctl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	ctl.len = sizeof (struct log_ctl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	ctl.buf = (caddr_t)&hdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	dat.maxlen = sizeof (outline);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	dat.len = clen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	dat.buf = outline;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	/* output the message to the local logger */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	if ((putmsg(LogFile, &ctl, &dat, 0) >= 0) && syslogd_ok())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	if (!(LogStat & LOG_CONS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	 * Output the message to the console directly.  To reduce visual
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	 * clutter, we strip out the message ID.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	if ((msgid_start = strstr(outline, "[ID ")) != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	    (msgid_end = strstr(msgid_start, "] ")) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
		(void) strcpy(msgid_start, msgid_end + 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	clen = strlen(outline) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   356
	nowait = (LogStat & LOG_NOWAIT);
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   357
	pid = forkx(nowait? 0 : (FORK_NOSIGCHLD | FORK_WAITPID));
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   358
	if (pid == -1)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		return;
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   360
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	if (pid == 0) {
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   362
		sigset_t sigs;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   365
		(void) sigset(SIGALRM, SIG_DFL);
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   366
		(void) sigemptyset(&sigs);
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   367
		(void) sigaddset(&sigs, SIGALRM);
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   368
		(void) sigprocmask(SIG_UNBLOCK, &sigs, NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		(void) alarm(5);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		if (((fd = open(sysmsg, O_WRONLY)) >= 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		    (fd = open(ctty, O_WRONLY)) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			(void) alarm(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			outline[clen - 1] = '\r';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			(void) write(fd, outline, clen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		_exit(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	}
3235
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   379
	if (!nowait)
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   380
		while (waitpid(pid, NULL, 0) == -1 && errno == EINTR)
9af05252020c PSARC 2006/659 fork extensions
raf
parents: 0
diff changeset
   381
			continue;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
 * Use a door call to syslogd to see if it's alive.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
syslogd_ok(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	int d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	int s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	door_arg_t darg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	door_info_t info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	if ((d = open(DOORFILE, O_RDONLY)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	 * see if our pid matches the pid of the door server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	 * If so, syslogd has called syslog(), probably as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	 * a result of some name service library error, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	 * we don't want to let syslog continue and possibly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	 * fork here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	info.di_target = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	if (__door_info(d, &info) < 0 || info.di_target == getpid()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		(void) close(d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	darg.data_ptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	darg.data_size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	darg.desc_ptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	darg.desc_num = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	darg.rbuf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	darg.rsize = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	s = __door_call(d, &darg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	(void) close(d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	if (s < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		return (0);		/* failure - syslogd dead */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 * OPENLOG -- open system log
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
openlog(const char *ident, int logstat, int logfac)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	struct	stat	statbuff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	OpenLogCalled = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	if (ident != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		LogTag = ident;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	LogStat = logstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	if (logfac != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		LogFacility = logfac & LOG_FACMASK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	 * if the fstat(2) fails or the st_rdev has changed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	 * then we must open the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	if ((fstat(LogFile, &statbuff) == 0) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	    (S_ISCHR(statbuff.st_mode)) && (statbuff.st_rdev == LogDev))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	if (LogStat & LOG_NDELAY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		LogFile = open(logname, O_WRONLY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		(void) fcntl(LogFile, F_SETFD, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		(void) fstat(LogFile, &statbuff);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		LogDev = statbuff.st_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
 * CLOSELOG -- close the system log
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
closelog(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	struct	stat	statbuff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	OpenLogCalled = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	/* if the LogFile is invalid it can not be closed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	if (LogFileInvalid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	 * if the fstat(2) fails or the st_rdev has changed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	 * then we can not close the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	if ((fstat(LogFile, &statbuff) == 0) && (statbuff.st_rdev == LogDev)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		(void) close(LogFile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
		LogFile = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		LogStat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
 * SETLOGMASK -- set the log mask level
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
setlogmask(int pmask)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	int omask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	omask = LogMask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	if (pmask != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		LogMask = pmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	return (omask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
}