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