usr/src/uts/common/os/strext.c
author Matthew Ahrens <Matthew.Ahrens@Sun.COM>
Thu, 06 Aug 2009 22:16:07 -0700
changeset 10272 a0669934e974
parent 0 68f95e015346
permissions -rw-r--r--
6861581 ZFS frees in synching context during rollback 6869470 panic from refcount_remove when destroy clone
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
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
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
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/varargs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * SunOS-specific extensions to libc's standard set of string routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * NOTE: The standard libc string routines are in $SRC/common/util/string.c,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * to facilitate sharing with standalone.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 * Historical entry point: remove in Solaris 2.8.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
vsprintf_len(size_t buflen, char *buf, const char *fmt, va_list args)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	(void) vsnprintf(buf, buflen, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * Historical entry point: remove in Solaris 2.8.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
/*PRINTFLIKE3*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
sprintf_len(size_t buflen, char *buf, const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	va_list args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	va_start(args, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	(void) vsnprintf(buf, buflen, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	va_end(args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 * Simple-minded conversion of a long into a null-terminated character
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 * string.  Caller must ensure there's enough space to hold the result.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
numtos(unsigned long num, char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	char prbuf[40];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	char *cp = prbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
		*cp++ = "0123456789"[num % 10];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		num /= 10;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	} while (num);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
		*s++ = *--cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	} while (cp > prbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	*s = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 * Returns the integer value of the string of decimal numeric
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * chars beginning at **str.  Does no overflow checking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 * Note: updates *str to point at the last character examined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
stoi(char **str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	char	*p = *str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	int	n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	int	c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	for (n = 0; (c = *p) >= '0' && c <= '9'; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		n = n * 10 + c - '0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	*str = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	return (n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
 * Like strrchr(), except
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
 * (a) it takes a maximum length for the string to be searched, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
 * (b) if the string ends with a null, it is not considered part of the string.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
strnrchr(const char *sp, int c, size_t n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	const char *r = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	while (n-- > 0 && *sp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		if (*sp == c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
			r = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		sp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	return ((char *)r);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
 * NOTE: These routines aren't shared with standalone because the DDI mandates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
 *	 that they return the buffer rather than its length.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
/*PRINTFLIKE2*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
sprintf(char *buf, const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	va_list args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	va_start(args, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	(void) vsnprintf(buf, INT_MAX, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	va_end(args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	return (buf);
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
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
vsprintf(char *buf, const char *fmt, va_list args)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	(void) vsnprintf(buf, INT_MAX, fmt, args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	return (buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
}
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   147
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   148
/*
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   149
 * Do not change the length of the returned string; it must be freed
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   150
 * with strfree().
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   151
 */
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   152
char *
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   153
kmem_asprintf(const char *fmt, ...)
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   154
{
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   155
	int size;
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   156
	va_list adx;
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   157
	char *buf;
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   158
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   159
	va_start(adx, fmt);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   160
	size = vsnprintf(NULL, 0, fmt, adx) + 1;
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   161
	va_end(adx);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   162
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   163
	buf = kmem_alloc(size, KM_SLEEP);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   164
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   165
	va_start(adx, fmt);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   166
	size = vsnprintf(buf, size, fmt, adx);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   167
	va_end(adx);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   168
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   169
	return (buf);
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 0
diff changeset
   170
}