mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
7d32679e96
The motivation for this change was to avoid having to convert to/from
ucs2 strings for so many operations. Doing that was slow, used many
static buffers, and was also incorrect as it didn't cope properly with
unicode codepoints above 65536 (which could not be represented
correctly as smb_ucs2_t chars)
The two core functions that allowed this change are next_codepoint()
and push_codepoint(). These functions allow you to correctly walk a
arbitrary multi-byte string a character at a time without converting
the whole string to ucs2.
While doing this cleanup I also fixed several ucs2 string handling
bugs. See the commit for details.
The following code (which counts the number of occuraces of 'c' in a
string) shows how to use the new interface:
size_t count_chars(const char *s, char c)
{
size_t count = 0;
while (*s) {
size_t size;
codepoint_t c2 = next_codepoint(s, &size);
if (c2 == c) count++;
s += size;
}
return count;
}
(This used to be commit 814881f0e5
)
264 lines
6.8 KiB
C
264 lines
6.8 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
SMB parameters and setup, plus a whole lot more.
|
|
|
|
Copyright (C) Andrew Tridgell 1992-2000
|
|
Copyright (C) John H Terpstra 1996-2002
|
|
Copyright (C) Luke Kenneth Casson Leighton 1996-2000
|
|
Copyright (C) Paul Ashton 1998-2000
|
|
Copyright (C) Simo Sorce 2001-2002
|
|
Copyright (C) Martin Pool 2002
|
|
|
|
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.
|
|
*/
|
|
|
|
#ifndef _REWRITE_H
|
|
#define _REWRITE_H
|
|
|
|
#define False (0)
|
|
#define True (1)
|
|
#define Auto (2)
|
|
|
|
#ifndef _BOOL
|
|
typedef int BOOL;
|
|
#define _BOOL /* So we don't typedef BOOL again in vfs.h */
|
|
#endif
|
|
|
|
/* string manipulation flags - see clistr.c and srvstr.c */
|
|
#define STR_TERMINATE 1
|
|
#define STR_UPPER 2
|
|
#define STR_ASCII 4
|
|
#define STR_UNICODE 8
|
|
#define STR_NOALIGN 16
|
|
#define STR_NO_RANGE_CHECK 32
|
|
#define STR_LEN8BIT 64
|
|
#define STR_TERMINATE_ASCII 128 /* only terminate if ascii */
|
|
#define STR_LEN_NOTERM 256 /* the length field is the unterminated length */
|
|
|
|
/* Debugging stuff */
|
|
#include "debug.h"
|
|
#include "doserr.h"
|
|
|
|
/* for compatibility */
|
|
#define SID_NAME_USE samr_SidType
|
|
|
|
/* used to hold an arbitrary blob of data */
|
|
typedef struct data_blob {
|
|
uint8_t *data;
|
|
size_t length;
|
|
} DATA_BLOB;
|
|
|
|
#include "enums.h"
|
|
#include "events.h"
|
|
#include "librpc/gen_ndr/ndr_misc.h"
|
|
#include "smb_interfaces.h"
|
|
#include "librpc/ndr/libndr.h"
|
|
|
|
/* used for network interfaces */
|
|
struct interface
|
|
{
|
|
struct interface *next, *prev;
|
|
struct in_addr ip;
|
|
struct in_addr bcast;
|
|
struct in_addr nmask;
|
|
};
|
|
|
|
/* key and data in the connections database - used in smbstatus and smbd */
|
|
struct connections_key {
|
|
pid_t pid;
|
|
int cnum;
|
|
fstring name;
|
|
};
|
|
|
|
struct connections_data {
|
|
int magic;
|
|
pid_t pid;
|
|
int cnum;
|
|
uid_t uid;
|
|
gid_t gid;
|
|
char name[24];
|
|
char addr[24];
|
|
char machine[FSTRING_LEN];
|
|
time_t start;
|
|
uint32_t bcast_msg_flags;
|
|
};
|
|
|
|
/* the following are used by loadparm for option lists */
|
|
typedef enum
|
|
{
|
|
P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,P_LIST,
|
|
P_STRING,P_USTRING,P_ENUM,P_SEP
|
|
} parm_type;
|
|
|
|
typedef enum
|
|
{
|
|
P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
|
|
} parm_class;
|
|
|
|
struct enum_list {
|
|
int value;
|
|
const char *name;
|
|
};
|
|
|
|
struct parm_struct
|
|
{
|
|
const char *label;
|
|
parm_type type;
|
|
parm_class class;
|
|
void *ptr;
|
|
BOOL (*special)(const char *, char **);
|
|
const struct enum_list *enum_list;
|
|
uint_t flags;
|
|
union {
|
|
BOOL bvalue;
|
|
int ivalue;
|
|
char *svalue;
|
|
char cvalue;
|
|
char **lvalue;
|
|
} def;
|
|
};
|
|
|
|
struct bitmap {
|
|
uint32_t *b;
|
|
uint_t n;
|
|
};
|
|
|
|
#define FLAG_BASIC 0x0001 /* fundamental options */
|
|
#define FLAG_SHARE 0x0002 /* file sharing options */
|
|
#define FLAG_PRINT 0x0004 /* printing options */
|
|
#define FLAG_GLOBAL 0x0008 /* local options that should be globally settable in SWAT */
|
|
#define FLAG_WIZARD 0x0010 /* Parameters that the wizard will operate on */
|
|
#define FLAG_ADVANCED 0x0020 /* Parameters that the wizard will operate on */
|
|
#define FLAG_DEVELOPER 0x0040 /* Parameters that the wizard will operate on */
|
|
#define FLAG_DEPRECATED 0x1000 /* options that should no longer be used */
|
|
#define FLAG_HIDE 0x2000 /* options that should be hidden in SWAT */
|
|
#define FLAG_DOS_STRING 0x4000 /* convert from UNIX to DOS codepage when reading this string. */
|
|
#define FLAG_CMDLINE 0x8000 /* this option was set from the command line */
|
|
|
|
#ifndef LOCKING_VERSION
|
|
#define LOCKING_VERSION 4
|
|
#endif /* LOCKING_VERSION */
|
|
|
|
#ifndef SIGNAL_CAST
|
|
#define SIGNAL_CAST (RETSIGTYPE (*)(int))
|
|
#endif
|
|
|
|
#ifndef SELECT_CAST
|
|
#define SELECT_CAST
|
|
#endif
|
|
|
|
/*
|
|
* Loopback command offsets.
|
|
*/
|
|
|
|
#define OPBRK_CMD_LEN_OFFSET 0
|
|
#define OPBRK_CMD_PORT_OFFSET 4
|
|
#define OPBRK_CMD_HEADER_LEN 6
|
|
|
|
#define OPBRK_MESSAGE_CMD_OFFSET 0
|
|
|
|
/* Message types */
|
|
#define OPLOCK_BREAK_CMD 0x1
|
|
#define KERNEL_OPLOCK_BREAK_CMD 0x2
|
|
#define LEVEL_II_OPLOCK_BREAK_CMD 0x3
|
|
#define ASYNC_LEVEL_II_OPLOCK_BREAK_CMD 0x4
|
|
|
|
/*
|
|
* Capabilities abstracted for different systems.
|
|
*/
|
|
|
|
#define KERNEL_OPLOCK_CAPABILITY 0x1
|
|
|
|
/*
|
|
* Oplock break command code sent via the kernel interface (if it exists).
|
|
*
|
|
* Form of this is :
|
|
*
|
|
* 0 2 2+devsize 2+devsize+inodesize
|
|
* +----+--------+--------+----------+
|
|
* | cmd| dev | inode | fileid |
|
|
* +----+--------+--------+----------+
|
|
*/
|
|
#define KERNEL_OPLOCK_BREAK_DEV_OFFSET 2
|
|
#define KERNEL_OPLOCK_BREAK_INODE_OFFSET (KERNEL_OPLOCK_BREAK_DEV_OFFSET + sizeof(SMB_DEV_T))
|
|
#define KERNEL_OPLOCK_BREAK_FILEID_OFFSET (KERNEL_OPLOCK_BREAK_INODE_OFFSET + sizeof(SMB_INO_T))
|
|
#define KERNEL_OPLOCK_BREAK_MSG_LEN (KERNEL_OPLOCK_BREAK_FILEID_OFFSET + sizeof(unsigned long))
|
|
|
|
|
|
#define CMD_REPLY 0x8000
|
|
|
|
#include "smb_macros.h"
|
|
|
|
/* A netbios name structure. */
|
|
struct nmb_name {
|
|
char name[17];
|
|
char scope[64];
|
|
uint_t name_type;
|
|
};
|
|
|
|
|
|
/* A netbios node status array element. */
|
|
struct node_status {
|
|
char name[16];
|
|
uint8_t type;
|
|
uint8_t flags;
|
|
};
|
|
|
|
#include "rpc_secdes.h"
|
|
|
|
#include "client.h"
|
|
|
|
/*
|
|
Do you want session setups at user level security with a invalid
|
|
password to be rejected or allowed in as guest? WinNT rejects them
|
|
but it can be a pain as it means "net view" needs to use a password
|
|
|
|
You have 3 choices in the setting of map_to_guest:
|
|
|
|
"NEVER_MAP_TO_GUEST" means session setups with an invalid password
|
|
are rejected. This is the default.
|
|
|
|
"MAP_TO_GUEST_ON_BAD_USER" means session setups with an invalid password
|
|
are rejected, unless the username does not exist, in which case it
|
|
is treated as a guest login
|
|
|
|
"MAP_TO_GUEST_ON_BAD_PASSWORD" means session setups with an invalid password
|
|
are treated as a guest login
|
|
|
|
Note that map_to_guest only has an effect in user or server
|
|
level security.
|
|
*/
|
|
|
|
#define NEVER_MAP_TO_GUEST 0
|
|
#define MAP_TO_GUEST_ON_BAD_USER 1
|
|
#define MAP_TO_GUEST_ON_BAD_PASSWORD 2
|
|
|
|
#define SAFE_NETBIOS_CHARS ". -_"
|
|
|
|
/* generic iconv conversion structure */
|
|
typedef struct {
|
|
size_t (*direct)(void *cd, const char **inbuf, size_t *inbytesleft,
|
|
char **outbuf, size_t *outbytesleft);
|
|
size_t (*pull)(void *cd, const char **inbuf, size_t *inbytesleft,
|
|
char **outbuf, size_t *outbytesleft);
|
|
size_t (*push)(void *cd, const char **inbuf, size_t *inbytesleft,
|
|
char **outbuf, size_t *outbytesleft);
|
|
void *cd_direct, *cd_pull, *cd_push;
|
|
} *smb_iconv_t;
|
|
|
|
#include "lib/cmdline/popt_common.h"
|
|
|
|
#endif /* _REWRITE_H */
|