2 Unix SMB/Netbios implementation.
4 server specific string routines
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 #define UNICODE_FLAG(buf, flags) (!(flags & STR_ASCII) && \
27 ((flags & STR_UNICODE || \
28 (SVAL(buf, smb_flg2) & FLAGS2_UNICODE_STRINGS))))
30 /****************************************************************************
31 return an alignment of either 0 or 1
32 if unicode is not negotiated then return 0
33 otherwise return 1 if offset is off
34 ****************************************************************************/
35 static int srvstr_align(void *inbuf, int offset, int flags)
37 if ((flags & STR_NOALIGN) || !UNICODE_FLAG(inbuf, flags)) return 0;
41 /****************************************************************************
42 copy a string from a char* src to a unicode or ascii
43 dos code page destination choosing unicode or ascii based on the
44 FLAGS2_UNICODE_STRINGS bit in inbuf
45 return the number of bytes occupied by the string in the destination
47 STR_TERMINATE means include the null termination
48 STR_CONVERT means convert from unix to dos codepage
49 STR_UPPER means uppercase in the destination
50 STR_ASCII use ascii even with unicode servers
51 STR_UNICODE means to force as unicode
52 STR_NOALIGN means don't do alignment
53 dest_len is the maximum length allowed in the destination. If dest_len
54 is -1 then no maxiumum is used
55 ****************************************************************************/
56 int srvstr_push(void *outbuf, void *dest, const char *src, int dest_len, int flags)
60 /* treat a pstring as "unlimited" length */
62 dest_len = sizeof(pstring);
65 if (srvstr_align(outbuf, PTR_DIFF(dest, outbuf), flags)) {
67 dest = (void *)((char *)dest + 1);
72 if (!UNICODE_FLAG(outbuf, flags)) {
73 /* the client doesn't want unicode */
74 safe_strcpy(dest, src, dest_len);
76 if (flags & STR_TERMINATE) len++;
77 if (flags & STR_CONVERT) unix_to_dos(dest,True);
78 if (flags & STR_UPPER) strupper(dest);
82 /* the server likes unicode. give it the works */
83 if (flags & STR_CONVERT) {
84 dos_PutUniCode(dest, src, dest_len, flags & STR_TERMINATE);
86 ascii_to_unistr(dest, src, dest_len);
88 if (flags & STR_UPPER) {
92 if (flags & STR_TERMINATE) len += 2;
96 /****************************************************************************
97 copy a string from a unicode or ascii source (depending on flg2)
98 to a char* destination
100 STR_CONVERT means convert from dos to unix codepage
101 STR_TERMINATE means the string in src is null terminated
102 STR_UNICODE means to force as unicode
103 STR_NOALIGN means don't do alignment
104 if STR_TERMINATE is set then src_len is ignored
105 src_len is the length of the source area in bytes
106 return the number of bytes occupied by the string in src
107 ****************************************************************************/
108 int srvstr_pull(void *inbuf, char *dest, const void *src, int dest_len, int src_len, int flags)
112 if (dest_len == -1) {
113 dest_len = sizeof(pstring);
116 if (srvstr_align(inbuf, PTR_DIFF(src, inbuf), flags)) {
117 src = (void *)((char *)src + 1);
118 if (src_len > 0) src_len--;
121 if (!UNICODE_FLAG(inbuf, flags)) {
122 /* the server doesn't want unicode */
123 if (flags & STR_TERMINATE) {
124 safe_strcpy(dest, src, dest_len);
127 if (src_len > dest_len) src_len = dest_len;
129 memcpy(dest, src, len);
132 if (flags & STR_CONVERT) dos_to_unix(dest,True);
136 if (flags & STR_TERMINATE) {
137 unistr_to_ascii(dest, src, dest_len);
138 len = strlen(dest)*2 + 2;
141 if (dest_len*2 < src_len) src_len = 2*dest_len;
142 for (i=0; i < src_len; i += 2) {
149 if (flags & STR_CONVERT) dos_to_unix(dest,True);
153 /****************************************************************************
154 these are useful for replacing all those StrnCpy() ops for copying data
156 ****************************************************************************/
158 int srvstr_push_ascii(void *dest, const char *src, int dest_len)
160 return srvstr_push(NULL, dest, src, dest_len,
161 STR_ASCII|STR_CONVERT|STR_TERMINATE);
164 int srvstr_pull_ascii(char *dest, const void *src, int dest_len)
166 return srvstr_pull(NULL, dest, src, dest_len, -1,
167 STR_ASCII|STR_CONVERT|STR_TERMINATE);