mc/vfs/samba/lib/util_unistr.c
Miguel de Icaza 2a8730b21c 1999-06-01 Robert Brady <rwb197@ecs.soton.ac.uk>
* file.c (move_dir_dir): Give an error when an attempt is made to
	move an empty directory into itself.

1999-06-14  Wayne Roberts <wroberts1@cx983858-b.orng1.occa.home.com>

	* vfs/smbfs.c: New file.  Implements the Samba-based file system.

	* vfs/vfs.h: Declare vfs_smbfs_ops, vfs_file_is_smb.

	* vfs/vfs.c (vfs_file_is_smb): implemented.
	(vfs_init) register smbfs.

	* vfs/samba: Incorporate SAMBA source code required for smbfs

1999-05-27  Miguel de Icaza  <miguel@nuclecu.unam.mx>

	* Make.common.in (confdir): Define confdir as sysconfdir.  This
	should fix the problem we had with FSSTND distributions.
1999-06-22 19:56:36 +00:00

263 lines
5.8 KiB
C

/*
Unix SMB/Netbios implementation.
Version 1.9.
Samba utility functions
Copyright (C) Andrew Tridgell 1992-1998
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#ifndef MAXUNI
#define MAXUNI 1024
#endif
/*******************************************************************
write a string in (little-endian) unicoode format
********************************************************************/
int PutUniCode(char *dst,char *src)
{
int ret = 0;
while (*src) {
SSVAL(dst,ret,(*src) & 0xFF);
ret += 2;
src++;
}
SSVAL(dst,ret,0);
ret += 2;
return(ret);
}
/*******************************************************************
skip past some unicode strings in a buffer
********************************************************************/
char *skip_unicode_string(char *buf,int n)
{
while (n--)
{
while (*buf)
buf += 2;
buf += 2;
}
return(buf);
}
/*******************************************************************
Return a ascii version of a little-endian unicode string.
Hack alert: uses fixed buffer(s) and only handles ascii strings
********************************************************************/
char *unistrn2(uint16 *src, int len)
{
static char lbufs[8][MAXUNI];
static int nexti;
char *lbuf = lbufs[nexti];
char *p;
nexti = (nexti+1)%8;
for (p = lbuf; *src && p-lbuf < MAXUNI-2 && len > 0; len--, src++)
{
*p++ = (SVAL(src,0) & 0xff);
}
*p = 0;
return lbuf;
}
static char lbufs[8][MAXUNI];
static int nexti;
/*******************************************************************
Return a ascii version of a little-endian unicode string.
Hack alert: uses fixed buffer(s) and only handles ascii strings
********************************************************************/
char *unistr2(uint16 *src)
{
char *lbuf = lbufs[nexti];
char *p;
nexti = (nexti+1)%8;
for (p = lbuf; *src && p-lbuf < MAXUNI-2; p++, src++)
{
*p = (SVAL(src,0) & 0xff);
}
*p = 0;
return lbuf;
}
/*******************************************************************
Return a ascii version of a little-endian unicode string
********************************************************************/
char *unistr2_to_str(UNISTR2 *str)
{
char *lbuf = lbufs[nexti];
char *p;
uint16 *src = str->buffer;
int max_size = MIN(sizeof(str->buffer)-2, str->uni_str_len);
nexti = (nexti+1)%8;
for (p = lbuf; *src && p-lbuf < max_size; p++, src++)
{
*p = (SVAL(src,0) & 0xff);
}
*p = 0;
return lbuf;
}
/*******************************************************************
Return a number stored in a buffer
********************************************************************/
uint32 buffer2_to_uint32(BUFFER2 *str)
{
if (str->buf_len == 4)
{
return IVAL(str->buffer, 0);
}
else
{
return 0;
}
}
/*******************************************************************
Return a ascii version of a NOTunicode string
********************************************************************/
char *buffer2_to_str(BUFFER2 *str)
{
char *lbuf = lbufs[nexti];
char *p;
uint16 *src = str->buffer;
int max_size = MIN(sizeof(str->buffer)-2, str->buf_len/2);
nexti = (nexti+1)%8;
for (p = lbuf; *src && p-lbuf < max_size; p++, src++)
{
*p = (SVAL(src,0) & 0xff);
}
*p = 0;
return lbuf;
}
/*******************************************************************
Return a ascii version of a NOTunicode string
********************************************************************/
char *buffer2_to_multistr(BUFFER2 *str)
{
char *lbuf = lbufs[nexti];
char *p;
uint16 *src = str->buffer;
int max_size = MIN(sizeof(str->buffer)-2, str->buf_len/2);
nexti = (nexti+1)%8;
for (p = lbuf; p-lbuf < max_size; p++, src++)
{
if (*src == 0)
{
*p = ' ';
}
else
{
*p = (SVAL(src,0) & 0xff);
}
}
*p = 0;
return lbuf;
}
/*******************************************************************
create a null-terminated unicode string from a null-terminated ascii string.
return number of unicode chars copied, excluding the null character.
only handles ascii strings
Unicode strings created are in little-endian format.
********************************************************************/
int struni2(char *dst, const char *src)
{
size_t len = 0;
if (dst == NULL)
return 0;
if (src != NULL)
{
for (; *src && len < MAXUNI-2; len++, dst +=2, src++)
{
SSVAL(dst,0,(*src) & 0xFF);
}
}
SSVAL(dst,0,0);
return len;
}
/*******************************************************************
Return a ascii version of a little-endian unicode string.
Hack alert: uses fixed buffer(s) and only handles ascii strings
********************************************************************/
char *unistr(char *buf)
{
char *lbuf = lbufs[nexti];
char *p;
nexti = (nexti+1)%8;
for (p = lbuf; *buf && p-lbuf < MAXUNI-2; p++, buf += 2)
{
*p = (SVAL(buf,0) & 0xff);
}
*p = 0;
return lbuf;
}
/*******************************************************************
strcpy for unicode strings. returns length (in num of wide chars)
********************************************************************/
int unistrcpy(char *dst, char *src)
{
int num_wchars = 0;
while (*src)
{
*dst++ = *src++;
*dst++ = *src++;
num_wchars++;
}
*dst++ = 0;
*dst++ = 0;
return num_wchars;
}