usr/src/lib/libc/port/gen/gettxt.c
author stevel@tonic-gate
Tue, 14 Jun 2005 00:00:00 -0700
changeset 0 68f95e015346
child 1219 f89f56c2d9ac
permissions -rw-r--r--
OpenSolaris Launch
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
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
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*	  All Rights Reserved  	*/
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
#pragma weak Msgdb = _Msgdb
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#pragma weak gettxt = _gettxt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/mman.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <pfmt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "../i18n/_locale.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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	MAXDB	10	/* maximum number of data bases per program */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#define	MESSAGES 	"/LC_MESSAGES/"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#define	DB_NAME_LEN	15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
char 	*handle_return(const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
/* support multiple versions of a package */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
char	*Msgdb = (char *)NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static	char	*saved_locale = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
static  const	char	*not_found = "Message not found!!\n";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
static	struct	db_info {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	char	db_name[DB_NAME_LEN];	/* name of the message file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	uintptr_t	addr;		/* virtual memory address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	size_t  length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
} *db_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
static	int	db_count;   	/* number of currently accessible data bases */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
gettxt(const char *msg_id, const char *dflt_str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	char  msgfile[DB_NAME_LEN];	/* name of static shared library */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	int   msgnum;			/* message number */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	char  pathname[PATH_MAX];	/* full pathname to message file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	int   i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	int   new_locale = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	int   fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	struct stat64 sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	void	*addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	char   *tokp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	size_t   name_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	char	*curloc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	if ((msg_id == NULL) || (*msg_id == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	/* first time called, allocate space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	if (!db_info) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		if ((db_info = (struct db_info *) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		    malloc(MAXDB * sizeof (struct db_info))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
			return (handle_return(dflt_str));
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
	/* parse msg_id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	if (((tokp = strchr(msg_id, ':')) == NULL) || *(tokp+1) == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	if ((name_len = (tokp - msg_id)) >= DB_NAME_LEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (name_len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		(void) strncpy(msgfile, msg_id, name_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		msgfile[name_len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		if (Msgdb && strlen(Msgdb) < DB_NAME_LEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
			(void) strcpy(msgfile, Msgdb);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
			char *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
			p = (char *)setcat((const char *)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
			if ((p != NULL) && strlen(p) < DB_NAME_LEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
				(void) strcpy(msgfile, p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
				return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	while (*++tokp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		if (!isdigit(*tokp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
			return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	msgnum = atoi(msg_id + name_len + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	/* Has locale been changed? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	curloc = setlocale(LC_MESSAGES, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	if (saved_locale != NULL && strcmp(curloc, saved_locale) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		for (i = 0; i < db_count; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
			if (strcmp(db_info[i].db_name, msgfile) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	} else { /* new locale - clear everything */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		if (saved_locale)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
			free(saved_locale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		 * allocate at least 2 bytes, so that we can copy "C"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		 * without re-allocating the saved_locale.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		if ((saved_locale = malloc(strlen(curloc)+2)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		(void) strcpy(saved_locale, curloc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		for (i = 0; i < db_count; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			(void) munmap((void *)db_info[i].addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			    db_info[i].length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			(void) strcpy(db_info[i].db_name, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			new_locale++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		db_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	if (new_locale || i == db_count) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		if (db_count == MAXDB)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
			return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		if (snprintf(pathname, sizeof (pathname),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			_DFLT_LOC_PATH "%s" MESSAGES "%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			saved_locale, msgfile) >= sizeof (pathname)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
			return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		if ((fd = open(pathname, O_RDONLY)) == -1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
			fstat64(fd, &sb) == -1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
				(addr = mmap(0, (size_t)sb.st_size,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
					PROT_READ, MAP_SHARED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
						fd, 0)) == MAP_FAILED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
			if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
				(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
			if (strcmp(saved_locale, "C") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
				return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
			/* Change locale to C */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
			if (snprintf(pathname, sizeof (pathname),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
				_DFLT_LOC_PATH "C" MESSAGES "%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
				msgfile) >= sizeof (pathname)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
				return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
			for (i = 0; i < db_count; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
				(void) munmap((void *)db_info[i].addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
							db_info[i].length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
				(void) strcpy(db_info[i].db_name, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
			db_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
			if ((fd = open(pathname, O_RDONLY)) != -1 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
				fstat64(fd, &sb) != -1 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
					(addr = mmap(0, (size_t)sb.st_size,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
						PROT_READ, MAP_SHARED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
						fd, 0)) != MAP_FAILED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
				(void) strcpy(saved_locale, "C");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
				if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
					(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
				return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		if (fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		/* save file name, memory address, fd and size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		(void) strcpy(db_info[db_count].db_name, msgfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
		db_info[db_count].addr = (uintptr_t)addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		db_info[db_count].length = (size_t)sb.st_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		i = db_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		db_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	/* check if msgnum out of domain */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	if (msgnum <= 0 || msgnum > *(int *)(db_info[i].addr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		return (handle_return(dflt_str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	/* return pointer to message */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	return ((char *)(db_info[i].addr + *(int *)(db_info[i].addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		+ msgnum * sizeof (int))));
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
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
handle_return(const char *dflt_str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	return ((char *)(dflt_str && *dflt_str ? dflt_str : not_found));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
}