usr/src/lib/libc/port/gen/priv_str_xlate.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 6812 febeba71273d
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
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
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
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
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
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 *	priv_str_xlate.c - Privilege translation routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
diff changeset
    33
#pragma weak _priv_str_to_set = priv_str_to_set
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
diff changeset
    34
#pragma weak _priv_set_to_str = priv_set_to_str
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
diff changeset
    35
#pragma weak _priv_gettext = priv_gettext
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
diff changeset
    37
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <priv.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <alloca.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "libc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include "../i18n/_loc_path.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include "priv_private.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
priv_set_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
priv_basic(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	priv_data_t *d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	LOADPRIVDATA(d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	return (d->pd_basicset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
}
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
 *	Name:	priv_str_to_set()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 *	Description:	Given a buffer with privilege strings, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *	equivalent privilege set is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *	Special tokens recognized: all, none, basic and "".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *	On failure, this function returns NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *	*endptr == NULL and errno set: resource error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *	*endptr != NULL: parse error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
priv_set_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
priv_str_to_set(const char *priv_names,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		const char *separators,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
		const char **endptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	char *base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	char *offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	char *last;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	priv_set_t *pset = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	priv_set_t *zone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	priv_set_t *basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	if (endptr != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		*endptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	if ((base = libc_strdup(priv_names)) == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	    (pset = priv_allocset()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		/* Whether base is NULL or allocated, this works */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		libc_free(base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	priv_emptyset(pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	basic = priv_basic();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	zone = privdata->pd_zoneset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	/* This is how to use strtok_r nicely in a while loop ... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	last = base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	while ((offset = strtok_r(NULL, separators, &last)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		 * Search for these special case strings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		if (basic != NULL && strcasecmp(offset, "basic") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
			priv_union(basic, pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		} else if (strcasecmp(offset, "none") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
			priv_emptyset(pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		} else if (strcasecmp(offset, "all") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
			priv_fillset(pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		} else if (strcasecmp(offset, "zone") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
			priv_union(zone, pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
			boolean_t neg = (*offset == '-' || *offset == '!');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
			int privid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
			int slen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
			privid = priv_getbyname(offset +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
			    ((neg || *offset == '+') ? 1 : 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
			if (privid < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
				slen = offset - base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
				libc_free(base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
				priv_freeset(pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
				if (endptr != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
					*endptr = priv_names + slen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
				errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
				if (neg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
					PRIV_DELSET(pset, privid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
					PRIV_ADDSET(pset, privid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		}
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
	libc_free(base);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	return (pset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
 *	Name:	priv_set_to_str()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 *	Description:	Given a set of privileges, list of privileges are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 *	returned in privilege numeric order (which can be an ASCII sorted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 *	list as our implementation allows renumbering.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
 *	String "none" identifies an empty privilege set, and string "all"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 *	identifies a full set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 *	A pointer to a buffer is returned which needs to be freed by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 *	the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 *	Several types of output are supported:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 *		PRIV_STR_PORT		- portable output: basic,!basic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 *		PRIV_STR_LIT		- literal output
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
 *		PRIV_STR_SHORT		- shortest output
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
 * NOTE: this function is called both from inside the library for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
 * current environment and from outside the library using an externally
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
 * generated priv_data_t * in order to analyze core files.  It should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
 * return strings which can be free()ed by applications and it should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
 * not use any data from the current environment except in the special
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
 * case that it is called from within libc, with a NULL priv_data_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
 * argument.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
__priv_set_to_str(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	priv_data_t *d,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	const priv_set_t *pset,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	char separator,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	int flag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	const char *pstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	char *res, *resp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	char neg = separator == '!' ? '-' : '!';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	priv_set_t *zone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	boolean_t all;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	boolean_t use_libc_data = (d == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	if (use_libc_data)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		LOADPRIVDATA(d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	if (flag != PRIV_STR_PORT && __priv_isemptyset(d, pset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		return (strdup("none"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	if (flag != PRIV_STR_LIT && __priv_isfullset(d, pset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		return (strdup("all"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	/* Safe upper bound: global info contains all NULL separated privs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	res = resp = alloca(d->pd_pinfo->priv_globalinfosize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	 * Compute the shortest form; i.e., the form with the fewest privilege
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	 * tokens.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	 * The following forms are possible:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	 *	literal: priv1,priv2,priv3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	 *		tokcount = present
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	 *	port: basic,!missing_basic,other
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	 *		tokcount = 1 + present - presentbasic + missingbasic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	 *	zone: zone,!missing_zone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	 *		tokcount = 1 + missingzone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	 *	all: all,!missing1,!missing2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	 *		tokcount = 1 + d->pd_nprivs - present;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	 * Note that zone and all forms are identical in the global zone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	 * in that case (or any other where the token count is the same),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	 * all is preferred.  Also, the zone form is only used when the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	 * indicated privileges are a subset of the zone set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	if (use_libc_data)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		LOCKPRIVDATA();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	if (flag == PRIV_STR_SHORT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		int presentbasic, missingbasic, present, missing;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		int presentzone, missingzone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		int count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		presentbasic = missingbasic = present = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		presentzone = missingzone = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		zone = d->pd_zoneset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		for (i = 0; i < d->pd_nprivs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
			int mem = PRIV_ISMEMBER(pset, i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
			if (d->pd_basicset != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
			    PRIV_ISMEMBER(d->pd_basicset, i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
				if (mem)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
					presentbasic++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
					missingbasic++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
			if (zone != NULL && PRIV_ISMEMBER(zone, i)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
				if (mem)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
					presentzone++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
					missingzone++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
			if (mem)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				present++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		missing = d->pd_nprivs - present;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		if (1 - presentbasic + missingbasic < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			flag = PRIV_STR_PORT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			count = present + 1 - presentbasic + missingbasic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			flag = PRIV_STR_LIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			count = present;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		if (count >= 1 + missing) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			flag = PRIV_STR_SHORT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			count = 1 + missing;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			all = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		if (present == presentzone && 1 + missingzone < count) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			flag = PRIV_STR_SHORT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
			all = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	switch (flag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	case PRIV_STR_LIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		*res = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	case PRIV_STR_PORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		(void) strcpy(res, "basic");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		if (d->pd_basicset == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
			flag = PRIV_STR_LIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	case PRIV_STR_SHORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		if (all)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
			(void) strcpy(res, "all");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
			(void) strcpy(res, "zone");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		if (use_libc_data)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
			UNLOCKPRIVDATA();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	res += strlen(res);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	for (i = 0; i < d->pd_nprivs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		/* Map the privilege to the next one sorted by name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		int priv = d->pd_setsort[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		if (PRIV_ISMEMBER(pset, priv)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
			switch (flag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			case PRIV_STR_SHORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
				if (all || PRIV_ISMEMBER(zone, priv))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			case PRIV_STR_PORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
				if (PRIV_ISMEMBER(d->pd_basicset, priv))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
			case PRIV_STR_LIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			if (res != resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
				*res++ = separator;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
			switch (flag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
			case PRIV_STR_LIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
			case PRIV_STR_PORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
				if (!PRIV_ISMEMBER(d->pd_basicset, priv))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
			case PRIV_STR_SHORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
				if (!all && !PRIV_ISMEMBER(zone, priv))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			if (res != resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
				*res++ = separator;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			*res++ = neg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		pstr = __priv_getbynum(d, priv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		(void) strcpy(res, pstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		res += strlen(pstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	if (use_libc_data)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		UNLOCKPRIVDATA();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	/* Special case the set with some high bits set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	return (strdup(*resp == '\0' ? "none" : resp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 * priv_set_to_str() is defined to return a string that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 * the caller must deallocate with free(3C).  Grr...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
priv_set_to_str(const priv_set_t *pset, char separator, int flag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	return (__priv_set_to_str(NULL, pset, separator, flag));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
2550
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   345
static char *
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   346
do_priv_gettext(const char *priv, const char *file)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	char buf[8*1024];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	boolean_t inentry = B_FALSE;
2550
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   350
	FILE	*namefp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
2550
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   352
	namefp = fopen(file, "rF");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	if (namefp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	 * parse the file; it must have the following format
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	 * Lines starting with comments "#"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	 * Lines starting with non white space with one single token:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	 * the privileges; white space indented lines which are the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	 * description; no empty lines are allowed in the description.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	while (fgets(buf, sizeof (buf), namefp) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		char *lp;		/* pointer to the current line */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		if (buf[0] == '#')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		if (buf[0] == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
			inentry = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		if (inentry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		/* error; not skipping; yet line starts with white space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		if (isspace((unsigned char)buf[0]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		/* Trim trailing newline */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		buf[strlen(buf) - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		if (strcasecmp(buf, priv) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
			inentry = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		lp = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		while (fgets(lp, sizeof (buf) - (lp - buf), namefp) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
			char *tstart;	/* start of text */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
			int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
			/* Empty line or start of next entry terminates */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
			if (*lp == '\n' || !isspace((unsigned char)*lp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
				*lp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
				(void) fclose(namefp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
				return (strdup(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
			/* Remove leading white space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
			tstart = lp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
			while (*tstart != '\0' &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 2550
diff changeset
   404
			    isspace((unsigned char)*tstart)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
				tstart++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
			len = strlen(tstart);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			(void) memmove(lp, tstart, len + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
			lp += len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			/* Entry to big; prevent fgets() loop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			if (lp == &buf[sizeof (buf) - 1])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
				goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		if (lp != buf) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
			*lp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
			(void) fclose(namefp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
			return (strdup(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	(void) fclose(namefp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
}
2550
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   426
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   427
/*
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   428
 * priv_gettext() is defined to return a string that
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   429
 * the caller must deallocate with free(3C).  Grr...
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   430
 */
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   431
char *
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   432
priv_gettext(const char *priv)
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   433
{
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   434
	char file[MAXPATHLEN];
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   435
	const char *loc;
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   436
	char	*ret;
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   437
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   438
	/* Not a valid privilege */
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   439
	if (priv_getbyname(priv) < 0)
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   440
		return (NULL);
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   441
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   442
	if ((loc = setlocale(LC_MESSAGES, NULL)) == NULL)
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   443
		loc = "C";
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   444
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   445
	if (snprintf(file, sizeof (file),
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   446
	    _DFLT_LOC_PATH "%s/LC_MESSAGES/priv_names", loc) < sizeof (file)) {
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   447
		ret = do_priv_gettext(priv, (const char *)file);
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   448
		if (ret != NULL)
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   449
			return (ret);
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   450
	}
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   451
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   452
	/* If the path is too long or can't be opened, punt to default */
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   453
	ret = do_priv_gettext(priv, "/etc/security/priv_names");
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   454
	return (ret);
8d932f4716ae 6208005 /usr/bin/ppriv -v -l outputs wrong strings if locale is UTF-8.
sayama
parents: 1914
diff changeset
   455
}