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