xref: /titanic_51/usr/src/lib/libsmbfs/smb/nls.c (revision 4bff34e37def8a90f9194d81bc345c52ba20086a)
1*4bff34e3Sthurlow /*
2*4bff34e3Sthurlow  * Copyright (c) 2000-2001, Boris Popov
3*4bff34e3Sthurlow  * All rights reserved.
4*4bff34e3Sthurlow  *
5*4bff34e3Sthurlow  * Redistribution and use in source and binary forms, with or without
6*4bff34e3Sthurlow  * modification, are permitted provided that the following conditions
7*4bff34e3Sthurlow  * are met:
8*4bff34e3Sthurlow  * 1. Redistributions of source code must retain the above copyright
9*4bff34e3Sthurlow  *    notice, this list of conditions and the following disclaimer.
10*4bff34e3Sthurlow  * 2. Redistributions in binary form must reproduce the above copyright
11*4bff34e3Sthurlow  *    notice, this list of conditions and the following disclaimer in the
12*4bff34e3Sthurlow  *    documentation and/or other materials provided with the distribution.
13*4bff34e3Sthurlow  * 3. All advertising materials mentioning features or use of this software
14*4bff34e3Sthurlow  *    must display the following acknowledgement:
15*4bff34e3Sthurlow  *    This product includes software developed by Boris Popov.
16*4bff34e3Sthurlow  * 4. Neither the name of the author nor the names of any co-contributors
17*4bff34e3Sthurlow  *    may be used to endorse or promote products derived from this software
18*4bff34e3Sthurlow  *    without specific prior written permission.
19*4bff34e3Sthurlow  *
20*4bff34e3Sthurlow  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21*4bff34e3Sthurlow  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22*4bff34e3Sthurlow  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*4bff34e3Sthurlow  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24*4bff34e3Sthurlow  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25*4bff34e3Sthurlow  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26*4bff34e3Sthurlow  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*4bff34e3Sthurlow  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28*4bff34e3Sthurlow  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29*4bff34e3Sthurlow  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30*4bff34e3Sthurlow  * SUCH DAMAGE.
31*4bff34e3Sthurlow  *
32*4bff34e3Sthurlow  * $Id: nls.c,v 1.10 2004/12/13 00:25:22 lindak Exp $
33*4bff34e3Sthurlow  */
34*4bff34e3Sthurlow 
35*4bff34e3Sthurlow #pragma ident	"%Z%%M%	%I%	%E% SMI"
36*4bff34e3Sthurlow 
37*4bff34e3Sthurlow #include <sys/types.h>
38*4bff34e3Sthurlow #include <ctype.h>
39*4bff34e3Sthurlow #include <errno.h>
40*4bff34e3Sthurlow #include <stdio.h>
41*4bff34e3Sthurlow #include <strings.h>
42*4bff34e3Sthurlow #include <stdlib.h>
43*4bff34e3Sthurlow #include <locale.h>
44*4bff34e3Sthurlow #include <errno.h>
45*4bff34e3Sthurlow 
46*4bff34e3Sthurlow #include <netsmb/smb_lib.h>
47*4bff34e3Sthurlow 
48*4bff34e3Sthurlow /*
49*4bff34e3Sthurlow  * prototype iconv* functions
50*4bff34e3Sthurlow  */
51*4bff34e3Sthurlow typedef void *iconv_t;
52*4bff34e3Sthurlow 
53*4bff34e3Sthurlow static size_t(*my_iconv)(iconv_t, const char **, size_t *, char **, size_t *);
54*4bff34e3Sthurlow 
55*4bff34e3Sthurlow u_char nls_lower[256];
56*4bff34e3Sthurlow u_char nls_upper[256];
57*4bff34e3Sthurlow 
58*4bff34e3Sthurlow static iconv_t nls_toext, nls_toloc;
59*4bff34e3Sthurlow static int iconv_loaded;
60*4bff34e3Sthurlow 
61*4bff34e3Sthurlow int
62*4bff34e3Sthurlow nls_setlocale(const char *name)
63*4bff34e3Sthurlow {
64*4bff34e3Sthurlow 	int i;
65*4bff34e3Sthurlow 
66*4bff34e3Sthurlow 	if (setlocale(LC_CTYPE, name) == NULL) {
67*4bff34e3Sthurlow 		fprintf(stdout, dgettext(TEXT_DOMAIN,
68*4bff34e3Sthurlow 		    "can't set locale '%s'\n"), name);
69*4bff34e3Sthurlow 	}
70*4bff34e3Sthurlow 	for (i = 0; i < 256; i++) {
71*4bff34e3Sthurlow 		nls_lower[i] = tolower(i);
72*4bff34e3Sthurlow 		nls_upper[i] = toupper(i);
73*4bff34e3Sthurlow 	}
74*4bff34e3Sthurlow 	return 0;
75*4bff34e3Sthurlow }
76*4bff34e3Sthurlow 
77*4bff34e3Sthurlow int
78*4bff34e3Sthurlow nls_setrecode(const char *local, const char *external)
79*4bff34e3Sthurlow {
80*4bff34e3Sthurlow 	return ENOENT;
81*4bff34e3Sthurlow }
82*4bff34e3Sthurlow 
83*4bff34e3Sthurlow char *
84*4bff34e3Sthurlow nls_str_toloc(char *dst, const char *src)
85*4bff34e3Sthurlow {
86*4bff34e3Sthurlow 	char *p = dst;
87*4bff34e3Sthurlow 	size_t inlen, outlen;
88*4bff34e3Sthurlow 
89*4bff34e3Sthurlow 	if (!iconv_loaded)
90*4bff34e3Sthurlow 		return strcpy(dst, src);
91*4bff34e3Sthurlow 
92*4bff34e3Sthurlow 	if (nls_toloc == (iconv_t)0)
93*4bff34e3Sthurlow 		return strcpy(dst, src);
94*4bff34e3Sthurlow 	inlen = outlen = strlen(src);
95*4bff34e3Sthurlow 	my_iconv(nls_toloc, NULL, NULL, &p, &outlen);
96*4bff34e3Sthurlow 	my_iconv(nls_toloc, &src, &inlen, &p, &outlen);
97*4bff34e3Sthurlow 	*p = 0;
98*4bff34e3Sthurlow 	return dst;
99*4bff34e3Sthurlow }
100*4bff34e3Sthurlow 
101*4bff34e3Sthurlow char *
102*4bff34e3Sthurlow nls_str_toext(char *dst, const char *src)
103*4bff34e3Sthurlow {
104*4bff34e3Sthurlow 	char *p = dst;
105*4bff34e3Sthurlow 	size_t inlen, outlen;
106*4bff34e3Sthurlow 
107*4bff34e3Sthurlow 	if (!iconv_loaded)
108*4bff34e3Sthurlow 		return strcpy(dst, src);
109*4bff34e3Sthurlow 
110*4bff34e3Sthurlow 	if (nls_toext == (iconv_t)0)
111*4bff34e3Sthurlow 		return strcpy(dst, src);
112*4bff34e3Sthurlow 	inlen = outlen = strlen(src);
113*4bff34e3Sthurlow 	my_iconv(nls_toext, NULL, NULL, &p, &outlen);
114*4bff34e3Sthurlow 	my_iconv(nls_toext, &src, &inlen, &p, &outlen);
115*4bff34e3Sthurlow 	*p = 0;
116*4bff34e3Sthurlow 	return dst;
117*4bff34e3Sthurlow }
118*4bff34e3Sthurlow 
119*4bff34e3Sthurlow void *
120*4bff34e3Sthurlow nls_mem_toloc(void *dst, const void *src, int size)
121*4bff34e3Sthurlow {
122*4bff34e3Sthurlow 	char *p = dst;
123*4bff34e3Sthurlow 	const char *s = src;
124*4bff34e3Sthurlow 	size_t inlen, outlen;
125*4bff34e3Sthurlow 
126*4bff34e3Sthurlow 	if (!iconv_loaded)
127*4bff34e3Sthurlow 		return memcpy(dst, src, size);
128*4bff34e3Sthurlow 
129*4bff34e3Sthurlow 	if (size == 0)
130*4bff34e3Sthurlow 		return NULL;
131*4bff34e3Sthurlow 
132*4bff34e3Sthurlow 	if (nls_toloc == (iconv_t)0)
133*4bff34e3Sthurlow 		return memcpy(dst, src, size);
134*4bff34e3Sthurlow 	inlen = outlen = size;
135*4bff34e3Sthurlow 	my_iconv(nls_toloc, NULL, NULL, &p, &outlen);
136*4bff34e3Sthurlow 	my_iconv(nls_toloc, &s, &inlen, &p, &outlen);
137*4bff34e3Sthurlow 	return dst;
138*4bff34e3Sthurlow }
139*4bff34e3Sthurlow 
140*4bff34e3Sthurlow void *
141*4bff34e3Sthurlow nls_mem_toext(void *dst, const void *src, int size)
142*4bff34e3Sthurlow {
143*4bff34e3Sthurlow 	char *p = dst;
144*4bff34e3Sthurlow 	const char *s = src;
145*4bff34e3Sthurlow 	size_t inlen, outlen;
146*4bff34e3Sthurlow 
147*4bff34e3Sthurlow 	if (size == 0)
148*4bff34e3Sthurlow 		return NULL;
149*4bff34e3Sthurlow 
150*4bff34e3Sthurlow 	if (!iconv_loaded || nls_toext == (iconv_t)0)
151*4bff34e3Sthurlow 		return memcpy(dst, src, size);
152*4bff34e3Sthurlow 
153*4bff34e3Sthurlow 	inlen = outlen = size;
154*4bff34e3Sthurlow 	my_iconv(nls_toext, NULL, NULL, &p, &outlen);
155*4bff34e3Sthurlow 	my_iconv(nls_toext, &s, &inlen, &p, &outlen);
156*4bff34e3Sthurlow 	return dst;
157*4bff34e3Sthurlow }
158*4bff34e3Sthurlow 
159*4bff34e3Sthurlow char *
160*4bff34e3Sthurlow nls_str_upper(char *dst, const char *src)
161*4bff34e3Sthurlow {
162*4bff34e3Sthurlow 	char *p = dst;
163*4bff34e3Sthurlow 
164*4bff34e3Sthurlow 	while (*src)
165*4bff34e3Sthurlow 		*dst++ = toupper(*src++);
166*4bff34e3Sthurlow 	*dst = 0;
167*4bff34e3Sthurlow 	return p;
168*4bff34e3Sthurlow }
169*4bff34e3Sthurlow 
170*4bff34e3Sthurlow char *
171*4bff34e3Sthurlow nls_str_lower(char *dst, const char *src)
172*4bff34e3Sthurlow {
173*4bff34e3Sthurlow 	char *p = dst;
174*4bff34e3Sthurlow 
175*4bff34e3Sthurlow 	while (*src)
176*4bff34e3Sthurlow 		*dst++ = tolower(*src++);
177*4bff34e3Sthurlow 	*dst = 0;
178*4bff34e3Sthurlow 	return p;
179*4bff34e3Sthurlow }
180