usr/src/lib/libc/port/gen/catopen.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
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
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
 * catopen.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    34
#pragma weak _catopen = catopen
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    35
#pragma weak _catclose = catclose
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    37
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include "libc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <nl_types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "../i18n/_loc_path.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include "nlspath_checks.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	SAFE_F		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#define	UNSAFE_F	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
replace_nls_option(char *, char *, char *, char *, char *, char *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static nl_catd file_open(const char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static nl_catd process_nls_path(char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
nl_catd
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    61
catopen(const char *name, int oflag)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	nl_catd p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	if (!name) {				/* Null pointer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
		errno = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
		return ((nl_catd)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	} else if (!*name) {		/* Empty string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
		errno = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
		return ((nl_catd)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	} else if (strchr(name, '/') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
		/* If name contains '/', then it is complete file name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
		p = file_open(name, SAFE_F);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	} else {				/* Normal case */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
		p = process_nls_path((char *)name, oflag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	if (p == NULL) {  /* Opening catalog file failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
		return ((nl_catd)-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
		return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
}
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
 * This routine will process NLSPATH environment variable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * It will return catd id whenever it finds valid catalog.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
static nl_catd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
process_nls_path(char *name, int oflag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	char	*s, *s1, *s2, *t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	char	*nlspath, *lang, *territory, *codeset, *locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	char	pathname[PATH_MAX + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	nl_catd	p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	 * locale=language_territory.codeset
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	 * XPG4 uses LC_MESSAGES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	 * XPG3 uses LANG.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	 * From the following two lines, choose one depending on XPG3 or 4.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	 * Chose XPG4. If oflag == NL_CAT_LOCALE, use LC_MESSAGES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	if (oflag == NL_CAT_LOCALE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		locale = setlocale(LC_MESSAGES, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		locale = getenv("LANG");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	nlspath = getenv("NLSPATH");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	lang = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	if (nlspath) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		territory = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		codeset = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		 * extract lang, territory and codeset from locale name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		if (locale) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
			lang = s = libc_strdup(locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
			if (!lang) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
				/* strdup failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
				return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
			s1 = s2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
			while (s && *s) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
				if (*s == '_') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
					s1 = s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
					*s1++ = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
				} else if (*s == '.') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
					s2 = s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
					*s2++ = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
				s++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
			territory = s1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			codeset   = s2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		} /* if (locale) */
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
		 * March through NLSPATH until finds valid cat file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		s = nlspath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		while (*s) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			if (*s == ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
				/* unqualified pathname is unsafe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
				p = file_open(name, UNSAFE_F);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
				if (p != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
					if (lang)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
						libc_free(lang);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
					return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
				++s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
			/* replace Substitution field */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
			s = replace_nls_option(s, name, pathname, locale,
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   159
			    lang, territory, codeset);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
			p = file_open(pathname, UNSAFE_F);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
			if (p != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
				if (lang)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
					libc_free(lang);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
				return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
			if (*s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
				++s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		} /* while */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	} /* if (nlspath) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	/* lang is not used any more, free it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	if (lang)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		libc_free(lang);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	 * Implementation dependent default location of XPG3.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	 * We use /usr/lib/locale/<locale>/LC_MESSAGES/%N.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	 * If C locale, do not translate message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	if (locale == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	} else if (locale[0] == 'C' && locale[1] == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		p = libc_malloc(sizeof (struct _nl_catd_struct));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		if (p == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
			/* malloc failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		p->__content = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		p->__size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		p->__trust = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	s = _DFLT_LOC_PATH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	t = pathname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	while (*t++ = *s++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
		continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	t--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	s = locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	while (*s && t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		*t++ = *s++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	s = "/LC_MESSAGES/";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	while (*s && t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
		*t++ = *s++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	s = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	while (*s && t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		*t++ = *s++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	*t = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	return (file_open(pathname, SAFE_F));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
 * This routine will replace substitution parameters in NLSPATH
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
 * with appropiate values. Returns expanded pathname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
replace_nls_option(char *s, char *name, char *pathname, char *locale,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	char *lang, char *territory, char *codeset)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	char	*t, *u;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	t = pathname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	while (*s && *s != ':') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		if (t < pathname + PATH_MAX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
			 * %% is considered a single % character (XPG).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
			 * %L : LC_MESSAGES (XPG4) LANG(XPG3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
			 * %l : The language element from the current locale.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
			 *	(XPG3, XPG4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
			if (*s != '%')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
				*t++ = *s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			else if (*++s == 'N') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
				u = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
				while (*u && t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
					*t++ = *u++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			} else if (*s == 'L') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
				if (locale) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
					u = locale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
					while (*u && t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
						*t++ = *u++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
			} else if (*s == 'l') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
				if (lang) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
					u = lang;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
					while (*u && *u != '_' &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   249
					    t < pathname + PATH_MAX)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
						*t++ = *u++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			} else if (*s == 't') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
				if (territory) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
					u = territory;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
					while (*u && *u != '.' &&
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   256
					    t < pathname + PATH_MAX)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
						*t++ = *u++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			} else if (*s == 'c') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
				if (codeset) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
					u = codeset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
					while (*u && t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
						*t++ = *u++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
				if (t < pathname + PATH_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
					*t++ = *s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		++s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	*t = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	return (s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
 * This routine will open file, mmap it, and return catd id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
static nl_catd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
file_open(const char *name, int safe)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	int		fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	struct stat64	statbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	void		*addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	struct _cat_hdr	*tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	nl_catd		tmp_catd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	int		trust;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	fd = nls_safe_open(name, &statbuf, &trust, safe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	if (fd == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	addr = mmap(0, (size_t)statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	if (addr == MAP_FAILED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	/* check MAGIC number of catalogue file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	tmp = (struct _cat_hdr *)addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	if (tmp->__hdr_magic != _CAT_MAGIC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		(void) munmap(addr, (size_t)statbuf.st_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	tmp_catd = libc_malloc(sizeof (struct _nl_catd_struct));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	if (tmp_catd == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		/* malloc failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		(void) munmap(addr, statbuf.st_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	tmp_catd->__content = addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	tmp_catd->__size = (int)statbuf.st_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	tmp_catd->__trust = trust;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	return (tmp_catd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
int
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
   323
catclose(nl_catd catd)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	if (catd &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	    catd != (nl_catd)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		if (catd->__content) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			(void) munmap(catd->__content, catd->__size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
			catd->__content = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		catd->__size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		catd->__trust = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		libc_free(catd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
}