[CIFS] Support for setting up SMB sessions to legacy lanman servers
[linux-2.6.git] / fs / cifs / cifs_unicode.c
1 /*
2  *   fs/cifs/cifs_unicode.c
3  *
4  *   Copyright (c) International Business Machines  Corp., 2000,2005
5  *   Modified by Steve French (sfrench@us.ibm.com)
6  *
7  *   This program is free software;  you can redistribute it and/or modify
8  *   it under the terms of the GNU General Public License as published by
9  *   the Free Software Foundation; either version 2 of the License, or 
10  *   (at your option) any later version.
11  * 
12  *   This program is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15  *   the GNU General Public License for more details.
16  *
17  *   You should have received a copy of the GNU General Public License
18  *   along with this program;  if not, write to the Free Software 
19  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 #include <linux/fs.h>
22 #include "cifs_unicode.h"
23 #include "cifs_uniupr.h"
24 #include "cifspdu.h"
25 #include "cifsglob.h"
26 #include "cifs_debug.h"
27
28 /*
29  * NAME:        cifs_strfromUCS()
30  *
31  * FUNCTION:    Convert little-endian unicode string to character string
32  *
33  */
34 int
35 cifs_strfromUCS_le(char *to, const __le16 * from,       
36                    int len, const struct nls_table *codepage)
37 {
38         int i;
39         int outlen = 0;
40
41         for (i = 0; (i < len) && from[i]; i++) {
42                 int charlen;
43                 /* 2.4.0 kernel or greater */
44                 charlen =
45                     codepage->uni2char(le16_to_cpu(from[i]), &to[outlen],
46                                        NLS_MAX_CHARSET_SIZE);
47                 if (charlen > 0) {
48                         outlen += charlen;
49                 } else {
50                         to[outlen++] = '?';
51                 }
52         }
53         to[outlen] = 0;
54         return outlen;
55 }
56
57 /*
58  * NAME:        cifs_strtoUCS()
59  *
60  * FUNCTION:    Convert character string to unicode string
61  *
62  */
63 int
64 cifs_strtoUCS(__le16 * to, const char *from, int len,
65               const struct nls_table *codepage)
66 {
67         int charlen;
68         int i;
69         wchar_t * wchar_to = (wchar_t *)to; /* needed to quiet sparse */  
70
71         for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
72
73                 /* works for 2.4.0 kernel or later */
74                 charlen = codepage->char2uni(from, len, &wchar_to[i]);
75                 if (charlen < 1) {
76                         cERROR(1,
77                                ("cifs_strtoUCS: char2uni returned %d",
78                                 charlen));
79                         /* A question mark */
80                         to[i] = cpu_to_le16(0x003f);
81                         charlen = 1;
82                 } else 
83                         to[i] = cpu_to_le16(wchar_to[i]);
84
85         }
86
87         to[i] = 0;
88         return i;
89 }
90