2 Unix SMB/Netbios implementation.
5 Copyright (C) Andrew Tridgell 2001
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.
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 the
15 GNU General Public License for more details.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
26 /****************************************************************************
27 copy a string from a char* src to a unicode or ascii
28 dos code page destination choosing unicode or ascii based on the
29 cli->capabilities flag
30 return the number of bytes occupied by the string in the destination
32 CLISTR_TERMINATE means include the null termination
33 CLISTR_CONVERT means convert from unix to dos codepage
34 CLISTR_UPPER means uppercase in the destination
35 CLISTR_ASCII use ascii even with unicode servers
36 dest_len is the maximum length allowed in the destination. If dest_len
37 is -1 then no maxiumum is used
38 ****************************************************************************/
39 int clistr_push(struct cli_state *cli, void *dest, char *src, int dest_len, int flags)
43 /* treat a pstring as "unlimited" length */
45 dest_len = sizeof(pstring);
48 if (!(flags & CLISTR_ASCII) && clistr_align(cli, PTR_DIFF(dest, cli->outbuf))) {
55 if ((flags & CLISTR_ASCII) || !(cli->capabilities & CAP_UNICODE)) {
56 /* the server doesn't want unicode */
57 safe_strcpy(dest, src, dest_len);
59 if (flags & CLISTR_TERMINATE) len++;
60 if (flags & CLISTR_CONVERT) unix_to_dos(dest,True);
61 if (flags & CLISTR_UPPER) strupper(dest);
65 /* the server likes unicode. give it the works */
66 if (flags & CLISTR_CONVERT) {
67 dos_PutUniCode(dest, src, dest_len, flags & CLISTR_TERMINATE);
69 ascii_to_unistr(dest, src, dest_len);
71 if (flags & CLISTR_UPPER) {
75 if (flags & CLISTR_TERMINATE) len += 2;
80 /****************************************************************************
81 return the length that a string would occupy when copied with clistr_push()
82 CLISTR_TERMINATE means include the null termination
83 CLISTR_CONVERT means convert from unix to dos codepage
84 CLISTR_UPPER means uppercase in the destination
85 note that dest is only used for alignment purposes. No data is written.
86 ****************************************************************************/
87 int clistr_push_size(struct cli_state *cli, void *dest, char *src, int dest_len, int flags)
89 int len = strlen(src);
90 if (flags & CLISTR_TERMINATE) len++;
91 if (!(flags & CLISTR_ASCII) && (cli->capabilities & CAP_UNICODE)) len *= 2;
93 if (!(flags & CLISTR_ASCII) && dest && clistr_align(cli, PTR_DIFF(cli->outbuf, dest))) {
100 /****************************************************************************
101 copy a string from a unicode or ascii source (depending on
102 cli->capabilities) to a char* destination
104 CLISTR_CONVERT means convert from dos to unix codepage
105 CLISTR_TERMINATE means the string in src is null terminated
106 if CLISTR_TERMINATE is set then src_len is ignored
107 src_len is the length of the source area in bytes
108 return the number of bytes occupied by the string in src
109 ****************************************************************************/
110 int clistr_pull(struct cli_state *cli, char *dest, void *src, int dest_len, int src_len, int flags)
114 if (dest_len == -1) {
115 dest_len = sizeof(pstring);
118 if (clistr_align(cli, PTR_DIFF(cli->inbuf, src))) {
120 if (src_len > 0) src_len--;
123 if (!(cli->capabilities & CAP_UNICODE)) {
124 /* the server doesn't want unicode */
125 if (flags & CLISTR_TERMINATE) {
126 safe_strcpy(dest, src, dest_len);
129 if (src_len > dest_len) src_len = dest_len;
131 memcpy(dest, src, len);
134 if (flags & CLISTR_CONVERT) dos_to_unix(dest,True);
138 if (flags & CLISTR_TERMINATE) {
139 unistr_to_ascii(dest, src, dest_len);
140 len = strlen(dest)*2 + 2;
143 if (dest_len < src_len) src_len = dest_len;
144 for (i=0; i < src_len; i += 2) {
151 if (flags & CLISTR_CONVERT) dos_to_unix(dest,True);
155 /****************************************************************************
156 return the length that a string would occupy (not including the null)
157 when copied with clistr_pull()
158 if src_len is -1 then assume the source is null terminated
159 ****************************************************************************/
160 int clistr_pull_size(struct cli_state *cli, void *src, int src_len)
162 if (clistr_align(cli, PTR_DIFF(cli->inbuf, src))) {
164 if (src_len > 0) src_len--;
167 if (!(cli->capabilities & CAP_UNICODE)) {
170 return strlen_w(src);
173 /****************************************************************************
174 return an alignment of either 0 or 1
175 if unicode is not negotiated then return 0
176 otherwise return 1 if offset is off
177 ****************************************************************************/
178 int clistr_align(struct cli_state *cli, int offset)
180 if (!(cli->capabilities & CAP_UNICODE)) return 0;