summaryrefslogtreecommitdiffstats
path: root/source3/smbd/srvstr.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2001-07-04 07:15:53 +0000
committerAndrew Tridgell <tridge@samba.org>2001-07-04 07:15:53 +0000
commit87fbb7092b8f8b2f0db0f361c3d625e19de57cd9 (patch)
tree3c302f710cbaa03e3c0d46549e8982771b12b8a5 /source3/smbd/srvstr.c
parent9e9e73303ec10a64bd744b9b33f4e6cd7d394f03 (diff)
downloadsamba-87fbb7092b8f8b2f0db0f361c3d625e19de57cd9.tar.gz
samba-87fbb7092b8f8b2f0db0f361c3d625e19de57cd9.tar.xz
samba-87fbb7092b8f8b2f0db0f361c3d625e19de57cd9.zip
The big character set handling changeover!
This commit gets rid of all our old codepage handling and replaces it with iconv. All internal strings in Samba are now in "unix" charset, which may be multi-byte. See internals.doc and my posting to samba-technical for a more complete explanation. (This used to be commit debb471267960e56005a741817ebd227ecfc512a)
Diffstat (limited to 'source3/smbd/srvstr.c')
-rw-r--r--source3/smbd/srvstr.c145
1 files changed, 5 insertions, 140 deletions
diff --git a/source3/smbd/srvstr.c b/source3/smbd/srvstr.c
index 0651fb725b..3c452653f2 100644
--- a/source3/smbd/srvstr.c
+++ b/source3/smbd/srvstr.c
@@ -19,150 +19,15 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#define NO_SYSLOG
-
#include "includes.h"
-#define UNICODE_FLAG(buf, flags) (!(flags & STR_ASCII) && \
- ((flags & STR_UNICODE || \
- (SVAL(buf, smb_flg2) & FLAGS2_UNICODE_STRINGS))))
-
-/****************************************************************************
-return an alignment of either 0 or 1
-if unicode is not negotiated then return 0
-otherwise return 1 if offset is off
-****************************************************************************/
-static int srvstr_align(void *inbuf, int offset, int flags)
-{
- if ((flags & STR_NOALIGN) || !UNICODE_FLAG(inbuf, flags)) return 0;
- return offset & 1;
-}
-
-/****************************************************************************
-copy a string from a char* src to a unicode or ascii
-dos code page destination choosing unicode or ascii based on the
-FLAGS2_UNICODE_STRINGS bit in inbuf
-return the number of bytes occupied by the string in the destination
-flags can have:
- STR_TERMINATE means include the null termination
- STR_CONVERT means convert from unix to dos codepage
- STR_UPPER means uppercase in the destination
- STR_ASCII use ascii even with unicode servers
- STR_UNICODE means to force as unicode
- STR_NOALIGN means don't do alignment
-dest_len is the maximum length allowed in the destination. If dest_len
-is -1 then no maxiumum is used
-****************************************************************************/
-int srvstr_push(void *outbuf, void *dest, const char *src, int dest_len, int flags)
-{
- int len=0;
-
- /* treat a pstring as "unlimited" length */
- if (dest_len == -1) {
- dest_len = sizeof(pstring);
- }
-
- if (srvstr_align(outbuf, PTR_DIFF(dest, outbuf), flags)) {
- *(char *)dest = 0;
- dest = (void *)((char *)dest + 1);
- dest_len--;
- len++;
- }
-
- if (!UNICODE_FLAG(outbuf, flags)) {
- /* the client doesn't want unicode */
- safe_strcpy(dest, src, dest_len);
- len = strlen(dest);
- if (flags & STR_TERMINATE) len++;
- if (flags & STR_CONVERT) unix_to_dos(dest,True);
- if (flags & STR_UPPER) strupper(dest);
- return len;
- }
-
- /* the server likes unicode. give it the works */
- if (flags & STR_CONVERT) {
- dos_PutUniCode(dest, src, dest_len, flags & STR_TERMINATE);
- } else {
- ascii_to_unistr(dest, src, dest_len);
- }
- if (flags & STR_UPPER) {
- strupper_w(dest);
- }
- len += strlen(src)*2;
- if (flags & STR_TERMINATE) len += 2;
- return len;
-}
-
-/****************************************************************************
-copy a string from a unicode or ascii source (depending on flg2)
-to a char* destination
-flags can have:
- STR_CONVERT means convert from dos to unix codepage
- STR_TERMINATE means the string in src is null terminated
- STR_UNICODE means to force as unicode
- STR_NOALIGN means don't do alignment
-if STR_TERMINATE is set then src_len is ignored
-src_len is the length of the source area in bytes
-return the number of bytes occupied by the string in src
-****************************************************************************/
-int srvstr_pull(void *inbuf, char *dest, const void *src, int dest_len, int src_len, int flags)
-{
- int len;
-
- if (dest_len == -1) {
- dest_len = sizeof(pstring);
- }
-
- if (srvstr_align(inbuf, PTR_DIFF(src, inbuf), flags)) {
- src = (void *)((char *)src + 1);
- if (src_len > 0) src_len--;
- }
-
- if (!UNICODE_FLAG(inbuf, flags)) {
- /* the server doesn't want unicode */
- if (flags & STR_TERMINATE) {
- safe_strcpy(dest, src, dest_len);
- len = strlen(src)+1;
- } else {
- if (src_len > dest_len) src_len = dest_len;
- len = src_len;
- memcpy(dest, src, len);
- dest[len] = 0;
- }
- if (flags & STR_CONVERT) dos_to_unix(dest,True);
- return len;
- }
-
- if (flags & STR_TERMINATE) {
- unistr_to_ascii(dest, src, dest_len);
- len = strlen(dest)*2 + 2;
- } else {
- int i, c;
- if (dest_len*2 < src_len) src_len = 2*dest_len;
- for (i=0; i < src_len; i += 2) {
- c = SVAL(src, i);
- *dest++ = c;
- }
- *dest++ = 0;
- len = src_len;
- }
- if (flags & STR_CONVERT) dos_to_unix(dest,True);
- return len;
-}
-
-/****************************************************************************
-these are useful for replacing all those StrnCpy() ops for copying data
-to/from the wire
-****************************************************************************/
-
-int srvstr_push_ascii(void *dest, const char *src, int dest_len)
+int srvstr_push(void *base_ptr, void *dest, const char *src, int dest_len, int flags)
{
- return srvstr_push(NULL, dest, src, dest_len,
- STR_ASCII|STR_CONVERT|STR_TERMINATE);
+ return push_string(base_ptr, dest, src, dest_len, flags);
}
-int srvstr_pull_ascii(char *dest, const void *src, int dest_len)
+int srvstr_pull(void *base_ptr, char *dest, const void *src, int dest_len, int src_len,
+ int flags)
{
- return srvstr_pull(NULL, dest, src, dest_len, -1,
- STR_ASCII|STR_CONVERT|STR_TERMINATE);
+ return pull_string(base_ptr, dest, src, dest_len, src_len, flags);
}