45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER START
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The contents of this file are subject to the terms of the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Common Development and Distribution License (the "License").
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You may not use this file except in compliance with the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or http://www.opensolaris.org/os/licensing.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * See the License for the specific language governing permissions
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and limitations under the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * When distributing Covered Code, include this CDDL HEADER in each
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If applicable, add the following below this CDDL HEADER, with the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fields enclosed by brackets "[]" replaced with your own identifying
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * information: Portions Copyright [yyyy] [name of copyright owner]
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER END
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Use is subject to license terms.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#pragma ident "%Z%%M% %I% %E% SMI"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Binary label to label string translations.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <locale.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdio.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdlib.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <string.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <strings.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <wchar.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/mman.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <tsol/label.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include "clnt.h"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include "labeld.h"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/tsol/label_macro.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#if !defined(TEXT_DOMAIN) /* should be defined by Makefiles */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define TEXT_DOMAIN "SYS_TEST"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#endif /* TEXT_DOMAIN */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic bslabel_t slow; /* static admin_low high sensitivity label */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic bslabel_t shigh; /* static admin_high sensitivity label */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic bclear_t clrlow, clrhigh; /* static admin_low and admin_high Clearance */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic char *sstring; /* return string for sb*tos */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic size_t ssize; /* current size of return string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkreturn_string(char **string, int str_len, char *val)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *cpyptr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t val_len = strlen(val) + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*string == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((*string = malloc(val_len)) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (val_len > str_len) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk **string = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk cpyptr = *string;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk bcopy(val, cpyptr, val_len);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (val_len);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkvoid
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkset_label_view(uint_t *callflags, uint_t flags)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flags&VIEW_INTERNAL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *callflags |= LABELS_VIEW_INTERNAL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (flags&VIEW_EXTERNAL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *callflags |= LABELS_VIEW_EXTERNAL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkalloc_string(char **string, size_t size, char val)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*string == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((*string = malloc(ALLOC_CHUNK)) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((*string = realloc(*string, size + ALLOC_CHUNK)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk **string = val;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk **string = val;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (ALLOC_CHUNK);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define slcall callp->param.acall.cargs.bsltos_arg
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define slret callp->param.aret.rvals.bsltos_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * bsltos - Convert Binary Sensitivity Label to Sensitivity Label string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry label = Binary Sensitivity Label to be converted.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * string = NULL ((char *) 0), if memory to be allocated,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * otherwise, pointer to preallocated memory.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * str_len = Length of preallocated memory, else ignored.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * flags = Logical sum of:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_CLASSIFICATION or SHORT_CLASSIFICATION,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_WORDS or SHORT_WORDS,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * VIEW_INTERNAL or VIEW_EXTERNAL, and
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * NO_CLASSIFICATION.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_CLASSIFICATION, use long classification names.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * SHORT_CLASSIFICATION, use short classification
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * names (default).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * NO_CLASSIFICATION, don't translate classification.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_WORDS, use the long form of words (default).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * SHORTWORDS, use the short form of words where available.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * VIEW_INTERNAL, don't promote/demote admin low/high.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * VIEW_EXTERNAL, promote/demote admin low/high.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit string = Sensitivity Label string, or empty string if
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * not enough preallocated memory.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If unable to access label encodings database.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, If unable to allocate string,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or allocated string to short
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * (and **string = '\0').
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * length (including null) of Sensitivity Label string,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If successful.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls RPC - LABELS_BSLTOS, BCLHIGH, BCLLOW, BCLTOSL, BLEQUAL,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * BLTYPE, SETBSLABEL, UCLNT, memcpy, clnt_call,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * clnt_perror, malloc, strcat, strlen.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses ADMIN_HIGH, ADMIN_LOW, shigh, slow.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkssize_t
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkbsltos(const bslabel_t *label, char **string, size_t str_len,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int flags)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(bsltos_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rval;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(label, SUN_SL_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = BSLTOS;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slcall.label = *label;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slcall.flags = (flags&NO_CLASSIFICATION) ? LABELS_NO_CLASS : 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slcall.flags |= (flags&SHORT_CLASSIFICATION ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk !(flags&LONG_CLASSIFICATION)) ? LABELS_SHORT_CLASS : 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slcall.flags |= (flags&SHORT_WORDS && !(flags&LONG_WORDS)) ?
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk LABELS_SHORT_WORDS : 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk set_label_view(&slcall.flags, flags);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((rval = __call_labeld(&callp, &bufsize, &datasize)) == SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp->reterr != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* unpack Sensitivity Label */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rval = return_string(string, str_len, slret.slabel);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (rval == NOSERVER) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* server not present */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* special case admin_high and admin_low */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(&slow, SUN_SL_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* initialize static labels */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BSLLOW(&slow);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BSLHIGH(&shigh);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (BLEQUAL(label, &slow)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (return_string(string, str_len, ADMIN_LOW));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (BLEQUAL(label, &shigh)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (return_string(string, str_len, ADMIN_HIGH));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* bsltos */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef slcall
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef slret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define clrcall callp->param.acall.cargs.bcleartos_arg
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define clrret callp->param.aret.rvals.bcleartos_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * bcleartos - Convert Binary Clearance to Clearance string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry clearance = Binary Clearance to be converted.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * string = NULL ((char *) 0), if memory to be allocated,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * otherwise, pointer to preallocated memory.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * str_len = Length of preallocated memory, else ignored.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * flags = Logical sum of:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_CLASSIFICATION or SHORT_CLASSIFICATION,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_WORDS or SHORT_WORDS,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * VIEW_INTERNAL or VIEW_EXTERNAL.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_CLASSIFICATION, use long classification names.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * SHORT_CLASSIFICATION, use short classification
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * names (default).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * LONG_WORDS, use the long form of words (default).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * SHORTWORDS, use the short form of words where available.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * VIEW_INTERNAL, don't promote/demote admin low/high.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * VIEW_EXTERNAL, promote/demote admin low/high.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit string = Clearance string, or empty string if not
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * enough preallocated memory.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If unable to access label encodings database.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, If unable to allocate string,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or allocated string to short
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * (and **string = '\0').
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * length (including null) of Clearance string,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If successful.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls RPC - LABELS_BSLTOS, BCLHIGH, BCLLOW, BCLTOSL, BLEQUAL,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * BLTYPE, SETBSLABEL, UCLNT, memcpy, clnt_call,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * clnt_perror, malloc, strcat, strlen.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses ADMIN_HIGH, ADMIN_LOW, clrhigh, clrlow.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkssize_t
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkbcleartos(const bclear_t *clearance, char **string, size_t str_len,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int flags)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(bcleartos_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rval;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(clearance, SUN_CLR_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = BCLEARTOS;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clrcall.clear = *clearance;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clrcall.flags = (flags&SHORT_CLASSIFICATION ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk !(flags&LONG_CLASSIFICATION)) ? LABELS_SHORT_CLASS : 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clrcall.flags |= (flags&SHORT_WORDS && !(flags&LONG_WORDS)) ?
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk LABELS_SHORT_WORDS : 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk set_label_view(&clrcall.flags, flags);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((rval = __call_labeld(&callp, &bufsize, &datasize)) == SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp->reterr != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* unpack Clearance */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rval = return_string(string, str_len, clrret.cslabel);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (rval == NOSERVER) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* server not present */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* special case admin_high and admin_low */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(&clrlow, SUN_CLR_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* initialize static labels */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BCLEARLOW(&clrlow);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BCLEARHIGH(&clrhigh);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (BLEQUAL(clearance, &clrlow)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (return_string(string, str_len, ADMIN_LOW));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (BLEQUAL(clearance, &clrhigh)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (return_string(string, str_len, ADMIN_HIGH));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* bcleartos */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef clrcall
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef clrret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * sbsltos - Convert Sensitivity Label to canonical clipped form.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry label = Sensitivity Label to be converted.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * len = Maximum length of translated string, excluding NULL.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, full string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * sstring = address of string to translate into.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * ssize = size of memory currently allocated to sstring.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit sstring = Newly translated string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * ssize = Updated if more memory pre-allocated.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns NULL, If error, len too small, unable to translate, or get
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * memory for string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Address of string containing converted value.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls alloc_string, bsltos, strcpy.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses ssize, sstring.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkchar *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpksbsltos(const bslabel_t *label, size_t len)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ssize_t slen; /* length including NULL */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk wchar_t *wstring;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int wccount;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (ssize == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Allocate string memory. */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((ssize = alloc_string(&sstring, ssize, 's')) == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* can't get initial memory for string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkagain:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((slen = bsltos(label, &sstring, ssize,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (SHORT_CLASSIFICATION | LONG_WORDS))) <= 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* error in translation */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (slen == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*sstring == '\0') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* sstring not long enough */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((newsize = alloc_string(&sstring, ssize,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk 's')) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Can't get more memory */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ssize += newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto again;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (len < MIN_SL_LEN) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((wstring = malloc(slen * sizeof (wchar_t))) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((wccount = mbstowcs(wstring, sstring, slen - 1)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (wccount > len) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk wchar_t *clipp = wstring + (len - 2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Adjust string size to desired length */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clipp[0] = L'<';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clipp[1] = L'-';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clipp[2] = L'\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (wcstombs(NULL, wstring, 0) >= ssize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* sstring not long enough */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((newsize = alloc_string(&sstring, ssize, 's')) ==
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Can't get more memory */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ssize += newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((wccount = wcstombs(sstring, wstring, ssize)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* sbsltos */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * sbcleartos - Convert Clearance to canonical clipped form.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry clearance = Clearance to be converted.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * len = Maximum length of translated string, excluding NULL.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, full string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * sstring = address of string to translate into.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * ssize = size of memory currently allocated to sstring.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit sstring = Newly translated string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * ssize = Updated if more memory pre-allocated.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns NULL, If error, len too small, unable to translate, or get
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * memory for string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Address of string containing converted value.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls alloc_string, bcleartos, strcpy.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses ssize, sstring.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkchar *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpksbcleartos(const bclear_t *clearance, size_t len)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ssize_t slen; /* length including NULL */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk wchar_t *wstring;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int wccount;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (ssize == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Allocate string memory. */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((ssize = alloc_string(&sstring, ssize, 'c')) == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* can't get initial memory for string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkagain:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((slen = bcleartos(clearance, &sstring, ssize,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (SHORT_CLASSIFICATION | LONG_WORDS))) <= 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* error in translation */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (slen == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*sstring == '\0') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* sstring not long enough */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((newsize = alloc_string(&sstring, ssize,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk 'c')) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Can't get more memory */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ssize += newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto again;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (len < MIN_CLR_LEN) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((wstring = malloc(slen * sizeof (wchar_t))) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((wccount = mbstowcs(wstring, sstring, slen - 1)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (wccount > len) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk wchar_t *clipp = wstring + (len - 2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Adjust string size to desired length */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clipp[0] = L'<';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clipp[1] = L'-';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clipp[2] = L'\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (wcstombs(NULL, wstring, 0) >= ssize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* sstring not long enough */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((newsize = alloc_string(&sstring, ssize, 'c')) ==
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Can't get more memory */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ssize += newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((wccount = wcstombs(sstring, wstring, ssize)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(wstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sstring);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* sbcleartos */