usr/src/lib/brand/lx/lx_brand/common/debug.c
author nn35248
Mon, 11 Sep 2006 22:51:59 -0700
changeset 2712 f74a135872bc
permissions -rw-r--r--
PSARC/2005/471 BrandZ: Support for non-native zones 6374606 ::nm -D without an object may not work on processes in zones 6409350 BrandZ project integration into Solaris 6455289 pthread_setschedparam() should return EPERM rather than panic libc 6455591 setpriority(3C) gets errno wrong for deficient privileges failure 6458178 fifofs doesn't support lofs mounts of fifos 6460380 Attempted open() of a symlink with the O_NOFOLLOW flag set returns EINVAL, not ELOOP 6463857 renice(1) errors erroneously
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     1
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     2
 * CDDL HEADER START
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     3
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     7
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    11
 * and limitations under the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    12
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    18
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    19
 * CDDL HEADER END
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    20
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    21
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    23
 * Use is subject to license terms.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    24
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    25
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    27
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    28
#include <assert.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    29
#include <errno.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    30
#include <fcntl.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    31
#include <stdarg.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    32
#include <stdio.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    33
#include <stdlib.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    34
#include <strings.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    35
#include <thread.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    36
#include <unistd.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    37
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    38
#include <sys/modctl.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    39
#include <sys/stat.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    40
#include <sys/types.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    41
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    42
#include <sys/lx_brand.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    43
#include <sys/lx_debug.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    44
#include <sys/lx_misc.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    45
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    46
/* internal debugging state */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    47
static char	*lx_debug_path = NULL;		/* debug output file path */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    48
static char	lx_debug_path_buf[MAXPATHLEN];
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    49
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    50
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    51
lx_debug_enable(void)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    52
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    53
	/* send all debugging output to /dev/tty */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    54
	lx_debug_path = "/dev/tty";
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    55
	lx_debug("lx_debug: debugging output enabled: %s", lx_debug_path);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    56
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    57
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    58
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    59
lx_debug_init(void)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    60
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    61
	if (getenv("LX_DEBUG") == NULL)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    62
		return;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    63
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    64
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    65
	 * It's OK to use this value without any locking, as all callers can
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    66
	 * use the return value to decide whether extra work should be done
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    67
	 * before calling lx_debug().
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    68
	 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    69
	 * If debugging is disabled after a routine calls this function it
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    70
	 * doesn't really matter as lx_debug() will see debugging is disabled
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    71
	 * and will not output anything.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    72
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    73
	lx_debug_enabled = 1;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    74
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    75
	/* check if there's a debug log file specified */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    76
	lx_debug_path = getenv("LX_DEBUG_FILE");
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    77
	if (lx_debug_path == NULL) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    78
		/* send all debugging output to /dev/tty */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    79
		lx_debug_path = "/dev/tty";
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    80
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    81
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    82
	(void) strlcpy(lx_debug_path_buf, lx_debug_path,
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    83
	    sizeof (lx_debug_path_buf));
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    84
	lx_debug_path = lx_debug_path_buf;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    85
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    86
	lx_debug("lx_debug: debugging output ENABLED to path: \"%s\"",
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    87
	    lx_debug_path);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    88
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    89
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    90
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    91
lx_debug(const char *msg, ...)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    92
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    93
	va_list		ap;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    94
	char		buf[LX_MSG_MAXLEN + 1];
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    95
	int		rv, fd, n;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    96
	int		errno_backup;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    97
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    98
	if (lx_debug_enabled == 0)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    99
		return;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   100
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   101
	errno_backup = errno;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   102
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   103
	/* prefix the message with pid/tid */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   104
	if ((n = snprintf(buf, sizeof (buf), "%u/%u: ",
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   105
	    getpid(), thr_self())) == -1) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   106
		errno = errno_backup;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   107
		return;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   108
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   109
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   110
	/* format the message */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   111
	va_start(ap, msg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   112
	rv = vsnprintf(&buf[n], sizeof (buf) - n, msg, ap);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   113
	va_end(ap);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   114
	if (rv == -1) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   115
		errno = errno_backup;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   116
		return;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   117
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   118
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   119
	/* add a carrige return if there isn't one already */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   120
	if ((buf[strlen(buf) - 1] != '\n') &&
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   121
	    (strlcat(buf, "\n", sizeof (buf)) >= sizeof (buf))) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   122
		errno = errno_backup;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   123
		return;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   124
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   125
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   126
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   127
	 * Open the debugging output file.  note that we don't protect
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   128
	 * ourselves against exec or fork1 here.  if an mt process were
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   129
	 * to exec/fork1 while we're doing this they'd end up with an
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   130
	 * extra open desciptor in their fd space.  a'well.  shouldn't
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   131
	 * really matter.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   132
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   133
	if ((fd = open(lx_debug_path,
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   134
	    O_WRONLY|O_APPEND|O_CREAT|O_NDELAY|O_NOCTTY, 0666)) == -1) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   135
		return;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   136
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   137
	(void) fchmod(fd, 0666);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   138
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   139
	/* we retry in case of EINTR */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   140
	do {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   141
		rv = write(fd, buf, strlen(buf));
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   142
	} while ((rv == -1) && (errno == EINTR));
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   143
	(void) fsync(fd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   144
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   145
	(void) close(fd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   146
	errno = errno_backup;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   147
}