The goal is to move all this variables into a big context structure.
metze
$(AFS_SETTOKEN_OBJ) smbd/aio.o smbd/statvfs.o \
smbd/dmapi.o \
smbd/file_access.o \
- smbd/dnsregister.o \
+ smbd/dnsregister.o smbd/globals.o \
$(MANGLE_OBJ) @VFS_STATIC@
SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) $(LIBSMB_OBJ) \
*/
#include "includes.h"
+#include "smbd/globals.h"
#if defined(WITH_AIO)
static int handle_aio_read_complete(struct aio_extra *aio_ex);
static int handle_aio_write_complete(struct aio_extra *aio_ex);
-static struct aio_extra *aio_list_head;
-
static int aio_extra_destructor(struct aio_extra *aio_ex)
{
DLIST_REMOVE(aio_list_head, aio_ex);
We can have these many aio buffers in flight.
*****************************************************************************/
-static int aio_pending_size;
-static sig_atomic_t signals_received;
-static int outstanding_aio_calls;
-static uint16 *aio_pending_array;
-
/****************************************************************************
Signal handler when an aio request completes.
*****************************************************************************/
void aio_request_done(uint16_t mid)
{
- if (signals_received < aio_pending_size) {
- aio_pending_array[signals_received] = mid;
- signals_received++;
+ if (aio_signals_received < aio_pending_size) {
+ aio_pending_array[aio_signals_received] = mid;
+ aio_signals_received++;
}
/* Else signal is lost. */
}
bool aio_finished(void)
{
- return (signals_received != 0);
+ return (aio_signals_received != 0);
}
/****************************************************************************
BlockSignals(True, RT_SIGNAL_AIO);
DEBUG(10,("process_aio_queue: signals_received = %d\n",
- (int)signals_received));
+ (int)aio_signals_received));
DEBUG(10,("process_aio_queue: outstanding_aio_calls = %d\n",
outstanding_aio_calls));
- if (!signals_received) {
+ if (!aio_signals_received) {
BlockSignals(False, RT_SIGNAL_AIO);
return 0;
}
/* Drain all the complete aio_reads. */
- for (i = 0; i < signals_received; i++) {
+ for (i = 0; i < aio_signals_received; i++) {
uint16 mid = aio_pending_array[i];
files_struct *fsp = NULL;
struct aio_extra *aio_ex = find_aio_ex(mid);
TALLOC_FREE(aio_ex);
}
- outstanding_aio_calls -= signals_received;
- signals_received = 0;
+ outstanding_aio_calls -= aio_signals_received;
+ aio_signals_received = 0;
BlockSignals(False, RT_SIGNAL_AIO);
return ret;
}
*/
#include "includes.h"
+#include "smbd/globals.h"
+
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_LOCKING
struct smb_request *req;
} blocking_lock_record;
-/* dlink list we store pending lock records on. */
-static blocking_lock_record *blocking_lock_queue;
-
-/* dlink list we move cancelled lock records onto. */
-static blocking_lock_record *blocking_lock_cancelled_queue;
-
-/* The event that makes us process our blocking lock queue */
-static struct timed_event *brl_timeout;
-
/****************************************************************************
Determine if this is a secondary element of a chained SMB.
**************************************************************************/
uint64_t count,
uint32_t blocking_pid)
{
- static bool set_lock_msg;
blocking_lock_record *blr;
NTSTATUS status;
recalc_brl_timeout();
/* Ensure we'll receive messages when this is unlocked. */
- if (!set_lock_msg) {
+ if (!blocking_lock_unlock_state) {
messaging_register(smbd_messaging_context(), NULL,
MSG_SMB_UNLOCK, received_unlock_msg);
- set_lock_msg = True;
+ blocking_lock_unlock_state = true;
}
DEBUG(3,("push_blocking_lock_request: lock request blocked with "
unsigned char locktype,
NTSTATUS err)
{
- static bool initialized;
char msg[MSG_BLOCKING_LOCK_CANCEL_SIZE];
blocking_lock_record *blr;
- if (!initialized) {
+ if (!blocking_lock_cancel_state) {
/* Register our message. */
messaging_register(smbd_messaging_context(), NULL,
MSG_SMB_BLOCKING_LOCK_CANCEL,
process_blocking_lock_cancel_message);
- initialized = True;
+ blocking_lock_cancel_state = True;
}
for (blr = blocking_lock_queue; blr; blr = blr->next) {
*/
#include "includes.h"
+#include "smbd/globals.h"
/* The connections bitmap is expanded in increments of BITMAP_BLOCK_SZ. The
* maximum size of the bitmap is the largest positive integer, but you will hit
*/
#define BITMAP_BLOCK_SZ 128
-static connection_struct *Connections;
-
-/* number of open connections */
-static struct bitmap *bmap;
-static int num_open;
-
/****************************************************************************
init the conn structures
****************************************************************************/
*/
#include "includes.h"
+#include "smbd/globals.h"
/****************************************************************************
Normalise for DOS usage.
}
if ((*dsize)<1) {
- static bool done = false;
- if (!done) {
+ if (!dfree_broken) {
DEBUG(0,("WARNING: dfree is broken on this system\n"));
- done=true;
+ dfree_broken=true;
}
*dsize = 20*1024*1024/(*bsize);
*dfree = MAX(1,*dfree);
*/
#include "includes.h"
+#include "smbd/globals.h"
/*
This module implements directory related functions for Samba.
bool did_stat; /* Optimisation for non-wcard searches. */
};
-static struct bitmap *dptr_bmap;
-static struct dptr_struct *dirptrs;
-static int dirhandles_open = 0;
#define INVALID_DPTR_KEY (-3)
void init_dptrs(void)
{
- static bool dptrs_init=False;
-
- if (dptrs_init)
+ if (dptr_bmap)
return;
dptr_bmap = bitmap_allocate(MAX_DIRECTORY_HANDLES);
if (!dptr_bmap)
exit_server("out of memory in init_dptrs");
-
- dptrs_init = True;
}
/****************************************************************************
*/
#include "includes.h"
+#include "smbd/globals.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_DMAPI
*/
#include "includes.h"
+#include "smbd/globals.h"
/* From lib/error.c */
extern struct unix_error_map unix_dos_nt_errmap[];
-extern uint32 global_client_caps;
-
bool use_nt_status(void)
{
return lp_nt_status_support() && (global_client_caps & CAP_STATUS32);
*/
#include "includes.h"
+#include "smbd/globals.h"
static bool setup_write_cache(files_struct *, SMB_OFF_T);
return(ret);
}
-/* how many write cache buffers have been allocated */
-static unsigned int allocated_write_caches;
-
/****************************************************************************
*Really* write to a file.
****************************************************************************/
*/
#include "includes.h"
-
-static int real_max_open_files;
+#include "smbd/globals.h"
#define VALID_FNUM(fnum) (((fnum) >= 0) && ((fnum) < real_max_open_files))
#define FILE_HANDLE_OFFSET 0x1000
-static struct bitmap *file_bmap;
-
-static files_struct *Files;
-
-static int files_used;
-
-/* A singleton cache to speed up searching by dev/inode. */
-static struct fsp_singleton_cache {
- files_struct *fsp;
- struct file_id id;
-} fsp_fi_cache;
-
/****************************************************************************
Return a unique number identifying this fsp over the life of this pid.
****************************************************************************/
static unsigned long get_gen_count(void)
{
- static unsigned long file_gen_counter;
-
if ((++file_gen_counter) == 0)
return ++file_gen_counter;
return file_gen_counter;
files_struct **result)
{
int i;
- static int first_file;
files_struct *fsp;
/* we want to give out file handles differently on each new
--- /dev/null
+/*
+ Unix SMB/Netbios implementation.
+ smbd globals
+ Copyright (C) Stefan Metzmacher 2009
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "smbd/globals.h"
+
+#if defined(WITH_AIO)
+struct aio_extra *aio_list_head = NULL;
+int aio_pending_size = 0;
+sig_atomic_t aio_signals_received = 0;
+int outstanding_aio_calls = 0;
+uint16 *aio_pending_array = NULL;
+#endif
+
+/* dlink list we store pending lock records on. */
+struct blocking_lock_record *blocking_lock_queue = NULL;
+
+/* dlink list we move cancelled lock records onto. */
+struct blocking_lock_record *blocking_lock_cancelled_queue = NULL;
+
+/* The event that makes us process our blocking lock queue */
+struct timed_event *brl_timeout = NULL;
+
+bool blocking_lock_unlock_state = false;
+bool blocking_lock_cancel_state = false;
+
+#ifdef USE_DMAPI
+struct smbd_dmapi_context *dmapi_ctx = NULL;
+#endif
+
+connection_struct *Connections = NULL;
+/* number of open connections */
+struct bitmap *bmap = 0;
+int num_open = 0;
+
+
+bool dfree_broken = false;
+
+struct bitmap *dptr_bmap = NULL;
+struct dptr_struct *dirptrs = NULL;
+int dirhandles_open = 0;
+
+/* how many write cache buffers have been allocated */
+unsigned int allocated_write_caches = 0;
+
+int real_max_open_files = 0;
+struct bitmap *file_bmap = NULL;
+files_struct *Files = NULL;
+int files_used = 0;
+struct fsp_singleton_cache fsp_fi_cache = {
+ .fsp = NULL,
+ .id = {
+ .devid = 0,
+ .inode = 0
+ }
+};
+unsigned long file_gen_counter = 0;
+int first_file = 0;
+
+const struct mangle_fns *mangle_fns = NULL;
+
+unsigned char *chartest = NULL;
+TDB_CONTEXT *tdb_mangled_cache = NULL;
+
+/* these tables are used to provide fast tests for characters */
+unsigned char char_flags[256];
+/*
+ this determines how many characters are used from the original filename
+ in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions.
+ The largest possible value is 6.
+*/
+unsigned mangle_prefix = 0;
+unsigned char base_reverse[256];
+
+char *last_from = NULL;
+char *last_to = NULL;
+
+struct msg_state *smbd_msg_state = NULL;
+
+bool global_encrypted_passwords_negotiated = false;
+bool global_spnego_negotiated = false;
+struct auth_context *negprot_global_auth_context = NULL;
+bool done_negprot = false;
+
+bool logged_ioctl_message = false;
+
+/* users from session setup */
+char *session_userlist = NULL;
+/* workgroup from session setup. */
+char *session_workgroup = NULL;
+/* this holds info on user ids that are already validated for this VC */
+user_struct *validated_users = NULL;
+uint16_t next_vuid = VUID_OFFSET;
+int num_validated_vuids = 0;
+#ifdef HAVE_NETGROUP
+char *my_yp_domain = NULL;
+#endif
+
+bool already_got_session = false;
+
+/*
+ * Size of data we can send to client. Set
+ * by the client for all protocols above CORE.
+ * Set by us for CORE protocol.
+ */
+int max_send = BUFFER_SIZE;
+/*
+ * Size of the data we can receive. Set by us.
+ * Can be modified by the max xmit parameter.
+ */
+int max_recv = BUFFER_SIZE;
+SIG_ATOMIC_T reload_after_sighup = 0;
+SIG_ATOMIC_T got_sig_term = 0;
+uint16 last_session_tag = UID_FIELD_INVALID;
+int trans_num = 0;
+char *orig_inbuf = NULL;
+pid_t mypid = 0;
+time_t last_smb_conf_reload_time = 0;
+time_t last_printer_reload_time = 0;
+/****************************************************************************
+ structure to hold a linked list of queued messages.
+ for processing.
+****************************************************************************/
+struct pending_message_list *deferred_open_queue = NULL;
+uint32_t common_flags2 = FLAGS2_LONG_PATH_COMPONENTS|FLAGS2_32_BIT_ERROR_CODES;
+
+struct smb_srv_trans_enc_ctx *partial_srv_trans_enc_ctx = NULL;
+struct smb_srv_trans_enc_ctx *srv_trans_enc_ctx = NULL;
+
+/* A stack of security contexts. We include the current context as being
+ the first one, so there is room for another MAX_SEC_CTX_DEPTH more. */
+struct sec_ctx sec_ctx_stack[MAX_SEC_CTX_DEPTH + 1];
+int sec_ctx_stack_ndx = 0;
+bool become_uid_done = false;
+bool become_gid_done = false;
+
+connection_struct *last_conn = NULL;
+uint16_t last_flags = 0;
+
+struct db_context *session_db_ctx_ptr = NULL;
+
+uint32_t global_client_caps = 0;
+bool done_sesssetup = false;
+/****************************************************************************
+ List to store partial SPNEGO auth fragments.
+****************************************************************************/
+struct pending_auth_data *pd_list = NULL;
+
+uint16_t fnf_handle = 257;
+
+/* A stack of current_user connection contexts. */
+struct conn_ctx conn_ctx_stack[MAX_SEC_CTX_DEPTH];
+int conn_ctx_stack_ndx = 0;
+
+struct vfs_init_function_entry *backends = NULL;
+char *sparse_buf = NULL;
+char *LastDir = NULL;
+
+#if HAVE_KERNEL_OPLOCKS_LINUX
+SIG_ATOMIC_T oplock_signals_received = 0;
+SIG_ATOMIC_T fd_pending_array[FD_PENDING_SIZE];
+struct kernel_oplocks linux_koplocks;
+#endif
+
+#if HAVE_KERNEL_OPLOCKS_IRIX
+int oplock_pipe_write = -1;
+int oplock_pipe_read = -1;
+struct kernel_oplocks irix_koplocks;
+#endif
+
+/* Current number of oplocks we have outstanding. */
+int32_t exclusive_oplocks_open = 0;
+int32_t level_II_oplocks_open = 0;
+bool global_client_failed_oplock_break = false;
+const struct kernel_oplocks *koplocks = NULL;
+
+struct notify_mid_map *notify_changes_by_mid = NULL;
+
+int am_parent = 1;
+SIG_ATOMIC_T got_sig_cld = 0;
+int server_fd = -1;
+struct event_context *smbd_event_ctx = NULL;
+struct messaging_context *smbd_msg_ctx = NULL;
+struct memcache *smbd_memcache_ctx = NULL;
+bool exit_firsttime = true;
+struct child_pid *children = 0;
+int num_children = 0;
+
+void smbd_init_globals(void)
+{
+ ZERO_STRUCT(char_flags);
+ ZERO_STRUCT(base_reverse);
+
+ ZERO_STRUCT(conn_ctx_stack);
+
+ ZERO_STRUCT(sec_ctx_stack);
+
+#if HAVE_KERNEL_OPLOCKS_LINUX
+ ZERO_STRUCT(fd_pending_array);
+ ZERO_STRUCT(linux_koplocks);
+#endif
+#if HAVE_KERNEL_OPLOCKS_IRIX
+ ZERO_STRUCT(irix_koplocks);
+#endif
+}
--- /dev/null
+/*
+ Unix SMB/Netbios implementation.
+ smbd globals
+ Copyright (C) Stefan Metzmacher 2009
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#if defined(WITH_AIO)
+struct aio_extra;
+extern struct aio_extra *aio_list_head;
+extern int aio_pending_size;
+extern sig_atomic_t aio_signals_received;
+extern int outstanding_aio_calls;
+extern uint16_t *aio_pending_array;
+#endif
+
+/* dlink list we store pending lock records on. */
+extern struct blocking_lock_record *blocking_lock_queue;
+
+/* dlink list we move cancelled lock records onto. */
+extern struct blocking_lock_record *blocking_lock_cancelled_queue;
+
+/* The event that makes us process our blocking lock queue */
+extern struct timed_event *brl_timeout;
+
+extern bool blocking_lock_unlock_state;
+extern bool blocking_lock_cancel_state;
+
+#ifdef USE_DMAPI
+struct smbd_dmapi_context;
+extern struct smbd_dmapi_context *dmapi_ctx;
+#endif
+
+extern connection_struct *Connections;
+/* number of open connections */
+extern struct bitmap *bmap;
+extern int num_open;
+
+extern bool dfree_broken;
+
+extern struct bitmap *dptr_bmap;
+//struct dptr_struct;
+extern struct dptr_struct *dirptrs;
+extern int dirhandles_open;
+
+/* how many write cache buffers have been allocated */
+extern unsigned int allocated_write_caches;
+
+extern int real_max_open_files;
+extern struct bitmap *file_bmap;
+extern files_struct *Files;
+extern int files_used;
+/* A singleton cache to speed up searching by dev/inode. */
+struct fsp_singleton_cache {
+ files_struct *fsp;
+ struct file_id id;
+};
+extern struct fsp_singleton_cache fsp_fi_cache;
+extern unsigned long file_gen_counter;
+extern int first_file;
+
+extern const struct mangle_fns *mangle_fns;
+
+extern unsigned char *chartest;
+extern TDB_CONTEXT *tdb_mangled_cache;
+
+/* these tables are used to provide fast tests for characters */
+extern unsigned char char_flags[256];
+/*
+ this determines how many characters are used from the original filename
+ in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions.
+ The largest possible value is 6.
+*/
+extern unsigned mangle_prefix;
+extern unsigned char base_reverse[256];
+
+extern char *last_from;
+extern char *last_to;
+
+struct msg_state;
+extern struct msg_state *smbd_msg_state;
+
+extern bool global_encrypted_passwords_negotiated;
+extern bool global_spnego_negotiated;
+extern struct auth_context *negprot_global_auth_context;
+extern bool done_negprot;
+
+extern bool logged_ioctl_message;
+
+/* users from session setup */
+extern char *session_userlist;
+/* workgroup from session setup. */
+extern char *session_workgroup;
+/* this holds info on user ids that are already validated for this VC */
+extern user_struct *validated_users;
+extern uint16_t next_vuid;
+extern int num_validated_vuids;
+#ifdef HAVE_NETGROUP
+extern char *my_yp_domain;
+#endif
+
+extern bool already_got_session;
+
+/*
+ * Size of data we can send to client. Set
+ * by the client for all protocols above CORE.
+ * Set by us for CORE protocol.
+ */
+extern int max_send;
+/*
+ * Size of the data we can receive. Set by us.
+ * Can be modified by the max xmit parameter.
+ */
+extern int max_recv;
+extern SIG_ATOMIC_T reload_after_sighup;
+extern SIG_ATOMIC_T got_sig_term;
+extern uint16 last_session_tag;
+extern int trans_num;
+extern char *orig_inbuf;
+
+extern pid_t mypid;
+extern time_t last_smb_conf_reload_time;
+extern time_t last_printer_reload_time;
+/****************************************************************************
+ structure to hold a linked list of queued messages.
+ for processing.
+****************************************************************************/
+struct pending_message_list;
+extern struct pending_message_list *deferred_open_queue;
+extern uint32_t common_flags2;
+
+struct smb_srv_trans_enc_ctx;
+extern struct smb_srv_trans_enc_ctx *partial_srv_trans_enc_ctx;
+extern struct smb_srv_trans_enc_ctx *srv_trans_enc_ctx;
+
+struct sec_ctx {
+ UNIX_USER_TOKEN ut;
+ NT_USER_TOKEN *token;
+};
+/* A stack of security contexts. We include the current context as being
+ the first one, so there is room for another MAX_SEC_CTX_DEPTH more. */
+extern struct sec_ctx sec_ctx_stack[MAX_SEC_CTX_DEPTH + 1];
+extern int sec_ctx_stack_ndx;
+extern bool become_uid_done;
+extern bool become_gid_done;
+
+extern connection_struct *last_conn;
+extern uint16_t last_flags;
+
+extern struct db_context *session_db_ctx_ptr;
+
+extern uint32_t global_client_caps;
+extern bool done_sesssetup;
+/****************************************************************************
+ List to store partial SPNEGO auth fragments.
+****************************************************************************/
+struct pending_auth_data;
+extern struct pending_auth_data *pd_list;
+
+extern uint16_t fnf_handle;
+
+struct conn_ctx {
+ connection_struct *conn;
+ uint16 vuid;
+};
+/* A stack of current_user connection contexts. */
+extern struct conn_ctx conn_ctx_stack[MAX_SEC_CTX_DEPTH];
+extern int conn_ctx_stack_ndx;
+
+struct vfs_init_function_entry;
+extern struct vfs_init_function_entry *backends;
+extern char *sparse_buf;
+extern char *LastDir;
+
+#if HAVE_KERNEL_OPLOCKS_LINUX
+extern SIG_ATOMIC_T oplock_signals_received;
+#define FD_PENDING_SIZE 100
+extern SIG_ATOMIC_T fd_pending_array[FD_PENDING_SIZE];
+extern struct kernel_oplocks linux_koplocks;
+#endif
+
+#if HAVE_KERNEL_OPLOCKS_IRIX
+extern int oplock_pipe_write;
+extern int oplock_pipe_read;
+extern struct kernel_oplocks irix_koplocks;
+#endif
+
+/* Current number of oplocks we have outstanding. */
+extern int32_t exclusive_oplocks_open;
+extern int32_t level_II_oplocks_open;
+extern bool global_client_failed_oplock_break;
+extern const struct kernel_oplocks *koplocks;
+
+extern struct notify_mid_map *notify_changes_by_mid;
+
+extern int am_parent;
+extern SIG_ATOMIC_T got_sig_cld;
+extern int server_fd;
+extern struct event_context *smbd_event_ctx;
+extern struct messaging_context *smbd_msg_ctx;
+extern struct memcache *smbd_memcache_ctx;
+extern bool exit_firsttime;
+struct child_pid;
+extern struct child_pid *children;
+extern int num_children;
+
+void smbd_init_globals(void);
*/
#include "includes.h"
-
-extern int max_send;
+#include "smbd/globals.h"
#define NERR_notsupported 50
*/
#include "includes.h"
-
-static const struct mangle_fns *mangle_fns;
+#include "smbd/globals.h"
/* this allows us to add more mangling backends */
static const struct {
*/
#include "includes.h"
+#include "smbd/globals.h"
/* -------------------------------------------------------------------------- **
* Other stuff...
static const char basechars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_-!@#$%";
#define MANGLE_BASE (sizeof(basechars)/sizeof(char)-1)
-static unsigned char *chartest;
-
#define mangle(V) ((char)(basechars[(V) % MANGLE_BASE]))
#define BASECHAR_MASK 0xf0
#define isbasechar(C) ( (chartest[ ((C) & 0xff) ]) & BASECHAR_MASK )
-static TDB_CONTEXT *tdb_mangled_cache;
-
/* -------------------------------------------------------------------- */
static NTSTATUS has_valid_83_chars(const smb_ucs2_t *s, bool allow_wildcards)
#include "includes.h"
+#include "smbd/globals.h"
#if 1
#define M_DEBUG(level, x) DEBUG(level, x)
/*the following number is a fnv1 of the string: idra@samba.org 2002 */
#define FNV1_INIT 0xa6b93095
-/* these tables are used to provide fast tests for characters */
-static unsigned char char_flags[256];
-
#define FLAG_CHECK(c, flag) (char_flags[(unsigned char)(c)] & (flag))
-/*
- this determines how many characters are used from the original filename
- in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions.
- The largest possible value is 6.
-*/
-static unsigned mangle_prefix;
-
/* these are the characters we use in the 8.3 hash. Must be 36 chars long */
static const char * const basechars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-static unsigned char base_reverse[256];
#define base_forward(v) basechars[v]
/* the list of reserved dos names - all of these are illegal */
*/
#include "includes.h"
+#include "smbd/globals.h"
/*******************************************************************
Map a username from a dos name to a unix name by looking in the username
Returns True if username was changed, false otherwise.
********************************************************************/
-static char *last_from, *last_to;
-
static const char *get_last_from(void)
{
if (!last_from) {
#include "includes.h"
+#include "smbd/globals.h"
extern userdom_struct current_user_info;
char *msg;
};
-static struct msg_state *smbd_msg_state;
-
/****************************************************************************
Deliver the message.
****************************************************************************/
#define DBGC_CLASS DBGC_MSDFS
#include "includes.h"
-
-extern uint32 global_client_caps;
+#include "smbd/globals.h"
/**********************************************************************
Parse a DFS pathname of the form \hostname\service\reqpath
*/
#include "includes.h"
+#include "smbd/globals.h"
extern fstring remote_proto;
extern enum protocol_types Protocol;
-extern int max_recv;
-
-bool global_encrypted_passwords_negotiated = False;
-bool global_spnego_negotiated = False;
-struct auth_context *negprot_global_auth_context = NULL;
static void get_challenge(uint8 buff[8])
{
int i;
size_t converted_size;
- static bool done_negprot = False;
-
START_PROFILE(SMBnegprot);
if (done_negprot) {
*/
#include "includes.h"
+#include "smbd/globals.h"
struct notify_change_request {
struct notify_change_request *prev, *next;
static void notify_fsp(files_struct *fsp, uint32 action, const char *name);
-static struct notify_mid_map *notify_changes_by_mid;
-
/*
* For NTCancel, we need to find the notify_change_request indexed by
* mid. Separate list here.
*/
#include "includes.h"
+#include "smbd/globals.h"
-extern int max_send;
extern enum protocol_types Protocol;
extern const struct generic_mapping file_generic_mapping;
files_struct *fsp;
uint8 isFSctl;
uint8 compfilter;
- static bool logged_message;
char *pdata = *ppdata;
if (setup_count != 8) {
return;
}
default:
- if (!logged_message) {
- logged_message = True; /* Only print this once... */
+ if (!logged_ioctl_message) {
+ logged_ioctl_message = true; /* Only print this once... */
DEBUG(0,("call_nt_transact_ioctl(0x%x): Currently not implemented.\n",
function));
}
*/
#include "includes.h"
+#include "smbd/globals.h"
extern const struct generic_mapping file_generic_mapping;
-extern bool global_client_failed_oplock_break;
-extern uint32 global_client_caps;
struct deferred_open_record {
bool delayed_for_oplocks;
#define DBGC_CLASS DBGC_LOCKING
#include "includes.h"
-
-/* Current number of oplocks we have outstanding. */
-static int32 exclusive_oplocks_open = 0;
-static int32 level_II_oplocks_open = 0;
-bool global_client_failed_oplock_break = False;
-
-extern uint32 global_client_caps;
-
-static struct kernel_oplocks *koplocks;
+#include "smbd/globals.h"
/****************************************************************************
Get the number of current exclusive oplocks.
#define DBGC_CLASS DBGC_LOCKING
#include "includes.h"
+#include "smbd/globals.h"
#if HAVE_KERNEL_OPLOCKS_IRIX
-static int oplock_pipe_write = -1;
-static int oplock_pipe_read = -1;
-
/****************************************************************************
Test to see if IRIX kernel oplocks work.
****************************************************************************/
struct kernel_oplocks *irix_init_kernel_oplocks(void)
{
int pfd[2];
- static struct kernel_oplocks koplocks;
if (!irix_oplocks_available())
return NULL;
oplock_pipe_read = pfd[0];
oplock_pipe_write = pfd[1];
- koplocks.receive_message = irix_oplock_receive_message;
- koplocks.set_oplock = irix_set_kernel_oplock;
- koplocks.release_oplock = irix_release_kernel_oplock;
- koplocks.msg_waiting = irix_oplock_msg_waiting;
- koplocks.notification_fd = oplock_pipe_read;
+ irix_koplocks.receive_message = irix_oplock_receive_message;
+ irix_koplocks.set_oplock = irix_set_kernel_oplock;
+ irix_koplocks.release_oplock = irix_release_kernel_oplock;
+ irix_koplocks.msg_waiting = irix_oplock_msg_waiting;
+ irix_koplocks.notification_fd = oplock_pipe_read;
- return &koplocks;
+ return &irix_koplocks;
}
#else
void oplock_irix_dummy(void);
#define DBGC_CLASS DBGC_LOCKING
#include "includes.h"
+#include "smbd/globals.h"
#if HAVE_KERNEL_OPLOCKS_LINUX
-static SIG_ATOMIC_T signals_received;
-#define FD_PENDING_SIZE 100
-static SIG_ATOMIC_T fd_pending_array[FD_PENDING_SIZE];
-
#ifndef F_SETLEASE
#define F_SETLEASE 1024
#endif
static void signal_handler(int sig, siginfo_t *info, void *unused)
{
- if (signals_received < FD_PENDING_SIZE - 1) {
- fd_pending_array[signals_received] = (SIG_ATOMIC_T)info->si_fd;
- signals_received++;
+ if (oplock_signals_received < FD_PENDING_SIZE - 1) {
+ fd_pending_array[oplock_signals_received] = (SIG_ATOMIC_T)info->si_fd;
+ oplock_signals_received++;
} /* Else signal is lost. */
sys_select_signal(RT_SIGNAL_LEASE);
}
fd = fd_pending_array[0];
fsp = file_find_fd(fd);
fd_pending_array[0] = (SIG_ATOMIC_T)-1;
- if (signals_received > 1)
+ if (oplock_signals_received > 1)
memmove(CONST_DISCARD(void *, &fd_pending_array[0]),
CONST_DISCARD(void *, &fd_pending_array[1]),
- sizeof(SIG_ATOMIC_T)*(signals_received-1));
- signals_received--;
+ sizeof(SIG_ATOMIC_T)*(oplock_signals_received-1));
+ oplock_signals_received--;
/* now we can receive more signals */
BlockSignals(False, RT_SIGNAL_LEASE);
static bool linux_oplock_msg_waiting(fd_set *fds)
{
- return signals_received != 0;
+ return oplock_signals_received != 0;
}
/****************************************************************************
struct kernel_oplocks *linux_init_kernel_oplocks(void)
{
- static struct kernel_oplocks koplocks;
struct sigaction act;
if (!linux_oplocks_available()) {
return NULL;
}
- koplocks.receive_message = linux_oplock_receive_message;
- koplocks.set_oplock = linux_set_kernel_oplock;
- koplocks.release_oplock = linux_release_kernel_oplock;
- koplocks.msg_waiting = linux_oplock_msg_waiting;
- koplocks.notification_fd = -1;
+ linux_koplocks.receive_message = linux_oplock_receive_message;
+ linux_koplocks.set_oplock = linux_set_kernel_oplock;
+ linux_koplocks.release_oplock = linux_release_kernel_oplock;
+ linux_koplocks.msg_waiting = linux_oplock_msg_waiting;
+ linux_koplocks.notification_fd = -1;
/* the signal can start off blocked due to a bug in bash */
BlockSignals(False, RT_SIGNAL_LEASE);
DEBUG(3,("Linux kernel oplocks enabled\n"));
- return &koplocks;
+ return &linux_koplocks;
}
#else
void oplock_linux_dummy(void);
*/
#include "includes.h"
-
-/* users from session setup */
-static char *session_userlist = NULL;
-/* workgroup from session setup. */
-static char *session_workgroup = NULL;
-
-/* this holds info on user ids that are already validated for this VC */
-static user_struct *validated_users;
-static uint16_t next_vuid = VUID_OFFSET;
-static int num_validated_vuids;
+#include "smbd/globals.h"
enum server_allocated_state { SERVER_ALLOCATED_REQUIRED_YES,
SERVER_ALLOCATED_REQUIRED_NO,
bool user_in_netgroup(const char *user, const char *ngname)
{
#ifdef HAVE_NETGROUP
- static char *mydomain = NULL;
fstring lowercase_user;
- if (mydomain == NULL)
- yp_get_default_domain(&mydomain);
+ if (my_yp_domain == NULL)
+ yp_get_default_domain(&my_yp_domain);
- if(mydomain == NULL) {
+ if(my_yp_domain == NULL) {
DEBUG(5,("Unable to get default yp domain, "
"let's try without specifying it\n"));
}
DEBUG(5,("looking for user %s of domain %s in netgroup %s\n",
- user, mydomain?mydomain:"(ANY)", ngname));
+ user, my_yp_domain?my_yp_domain:"(ANY)", ngname));
- if (innetgr(ngname, NULL, user, mydomain)) {
+ if (innetgr(ngname, NULL, user, my_yp_domain)) {
DEBUG(5,("user_in_netgroup: Found\n"));
return (True);
} else {
strlower_m(lowercase_user);
DEBUG(5,("looking for user %s of domain %s in netgroup %s\n",
- lowercase_user, mydomain?mydomain:"(ANY)", ngname));
+ lowercase_user, my_yp_domain?my_yp_domain:"(ANY)", ngname));
- if (innetgr(ngname, NULL, lowercase_user, mydomain)) {
+ if (innetgr(ngname, NULL, lowercase_user, my_yp_domain)) {
DEBUG(5,("user_in_netgroup: Found\n"));
return (True);
}
*/
#include "includes.h"
+#include "smbd/globals.h"
-/*
- * Size of data we can send to client. Set
- * by the client for all protocols above CORE.
- * Set by us for CORE protocol.
- */
-int max_send = BUFFER_SIZE;
-/*
- * Size of the data we can receive. Set by us.
- * Can be modified by the max xmit parameter.
- */
-int max_recv = BUFFER_SIZE;
-
-SIG_ATOMIC_T reload_after_sighup = 0;
-SIG_ATOMIC_T got_sig_term = 0;
extern bool global_machine_password_needs_changing;
-extern int max_send;
static void construct_reply_common(struct smb_request *req, const char *inbuf,
char *outbuf);
req->outbuf = NULL;
}
-/****************************************************************************
- structure to hold a linked list of queued messages.
- for processing.
-****************************************************************************/
-
-static struct pending_message_list *deferred_open_queue;
/****************************************************************************
Function to push a message onto the tail of a linked list of smb messages ready
uint16 session_tag;
connection_struct *conn = NULL;
- static uint16 last_session_tag = UID_FIELD_INVALID;
-
errno = 0;
/* Make sure this is an SMB packet. smb_size contains NetBIOS header
static void process_smb(char *inbuf, size_t nread, size_t unread_bytes, bool encrypted)
{
- static int trans_num;
int msg_type = CVAL(inbuf,0);
DO_PROFILE_INC(smb_count);
Helper functions for contruct_reply.
****************************************************************************/
-static uint32 common_flags2 = FLAGS2_LONG_PATH_COMPONENTS|FLAGS2_32_BIT_ERROR_CODES;
-
void add_to_common_flags2(uint32 v)
{
common_flags2 |= v;
void chain_reply(struct smb_request *req)
{
- static char *orig_inbuf;
-
/*
* Dirty little const_discard: We mess with req->inbuf, which is
* declared as const. If maybe at some point this routine gets
void check_reload(time_t t)
{
- static pid_t mypid = 0;
- static time_t last_smb_conf_reload_time = 0;
- static time_t last_printer_reload_time = 0;
time_t printcap_cache_time = (time_t)lp_printcap_cache_time();
if(last_smb_conf_reload_time == 0) {
*/
#include "includes.h"
+#include "smbd/globals.h"
-/* look in server.c for some explanation of these variables */
extern enum protocol_types Protocol;
-extern int max_recv;
-extern uint32 global_client_caps;
-
-extern bool global_encrypted_passwords_negotiated;
/****************************************************************************
Ensure we check the path in *exactly* the same way as W2K for a findfirst/findnext
*/
char outbuf[smb_size];
- static bool already_got_session = False;
-
*name1 = *name2 = 0;
memset(outbuf, '\0', sizeof(outbuf));
*/
#include "includes.h"
+#include "smbd/globals.h"
/******************************************************************************
Server side encryption.
AUTH_NTLMSSP_STATE *auth_ntlmssp_state; /* Must be kept in sync with pointer in ec->ntlmssp_state. */
};
-static struct smb_srv_trans_enc_ctx *partial_srv_trans_enc_ctx;
-static struct smb_srv_trans_enc_ctx *srv_trans_enc_ctx;
-
/******************************************************************************
Return global enc context - this must change if we ever do multiple contexts.
******************************************************************************/
*/
#include "includes.h"
+#include "smbd/globals.h"
extern struct current_user current_user;
-struct sec_ctx {
- UNIX_USER_TOKEN ut;
- NT_USER_TOKEN *token;
-};
-
-/* A stack of security contexts. We include the current context as being
- the first one, so there is room for another MAX_SEC_CTX_DEPTH more. */
-
-static struct sec_ctx sec_ctx_stack[MAX_SEC_CTX_DEPTH + 1];
-static int sec_ctx_stack_ndx;
-
/****************************************************************************
Are two UNIX tokens equal ?
****************************************************************************/
if (uid == (uid_t)-1 ||
((sizeof(uid_t) == 2) && (uid == (uid_t)65535))) {
- static int done;
-
- if (!done) {
+ if (!become_uid_done) {
DEBUG(1,("WARNING: using uid %d is a security risk\n",
(int)uid));
- done = 1;
+ become_uid_done = true;
}
}
if (gid == (gid_t)-1 || ((sizeof(gid_t) == 2) &&
(gid == (gid_t)65535))) {
- static int done;
-
- if (!done) {
+ if (!become_gid_done) {
DEBUG(1,("WARNING: using gid %d is a security risk\n",
(int)gid));
- done = 1;
+ become_gid_done = true;
}
}
*/
#include "includes.h"
+#include "smbd/globals.h"
static_decl_rpc;
-static int am_parent = 1;
-
-extern struct auth_context *negprot_global_auth_context;
-extern SIG_ATOMIC_T got_sig_term;
-extern SIG_ATOMIC_T reload_after_sighup;
-static SIG_ATOMIC_T got_sig_cld;
-
#ifdef WITH_DFS
extern int dcelogin_atmost_once;
#endif /* WITH_DFS */
-/* really we should have a top level context structure that has the
- client file descriptor as an element. That would require a major rewrite :(
-
- the following 2 functions are an alternative - they make the file
- descriptor private to smbd
- */
-static int server_fd = -1;
-
int smbd_server_fd(void)
{
return server_fd;
struct event_context *smbd_event_context(void)
{
- static struct event_context *ctx;
-
- if (!ctx && !(ctx = event_context_init(talloc_autofree_context()))) {
+ if (!smbd_event_ctx) {
+ smbd_event_ctx = event_context_init(talloc_autofree_context());
+ }
+ if (!smbd_event_ctx) {
smb_panic("Could not init smbd event context");
}
- return ctx;
+ return smbd_event_ctx;
}
struct messaging_context *smbd_messaging_context(void)
{
- static struct messaging_context *ctx;
-
- if (ctx == NULL) {
- ctx = messaging_init(talloc_autofree_context(), server_id_self(),
- smbd_event_context());
+ if (smbd_msg_ctx == NULL) {
+ smbd_msg_ctx = messaging_init(talloc_autofree_context(),
+ server_id_self(),
+ smbd_event_context());
}
- if (ctx == NULL) {
+ if (smbd_msg_ctx == NULL) {
DEBUG(0, ("Could not init smbd messaging context.\n"));
}
- return ctx;
+ return smbd_msg_ctx;
}
struct memcache *smbd_memcache(void)
{
- static struct memcache *cache;
-
- if (!cache
- && !(cache = memcache_init(talloc_autofree_context(),
- lp_max_stat_cache_size()*1024))) {
-
+ if (!smbd_memcache_ctx) {
+ smbd_memcache_ctx = memcache_init(talloc_autofree_context(),
+ lp_max_stat_cache_size()*1024);
+ }
+ if (!smbd_memcache_ctx) {
smb_panic("Could not init smbd memcache");
}
- return cache;
+
+ return smbd_memcache_ctx;
}
/*******************************************************************
pid_t pid;
};
-static struct child_pid *children;
-static int num_children;
-
static void add_child_pid(pid_t pid)
{
struct child_pid *child;
static void exit_server_common(enum server_exit_reason how,
const char *const reason)
{
- static int firsttime=1;
bool had_open_conn;
- if (!firsttime)
+ if (!exit_firsttime)
exit(0);
- firsttime = 0;
+ exit_firsttime = false;
change_to_root_user();
};
TALLOC_CTX *frame = talloc_stackframe(); /* Setup tos. */
+ smbd_init_globals();
+
TimeInit();
#ifdef HAVE_SET_AUTH_PARAMETERS
*/
#include "includes.h"
+#include "smbd/globals.h"
extern userdom_struct current_user_info;
bool set_current_service(connection_struct *conn, uint16 flags, bool do_chdir)
{
- static connection_struct *last_conn;
- static uint16 last_flags;
int snum;
if (!conn) {
*/
#include "includes.h"
+#include "smbd/globals.h"
/********************************************************************
********************************************************************/
static struct db_context *session_db_ctx(void)
{
- static struct db_context *ctx;
+ if (session_db_ctx_ptr)
+ return session_db_ctx_ptr;
- if (ctx)
- return ctx;
-
- ctx = db_open(NULL, lock_path("sessionid.tdb"), 0,
- TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
- O_RDWR | O_CREAT, 0644);
- return ctx;
+ session_db_ctx_ptr = db_open(NULL, lock_path("sessionid.tdb"), 0,
+ TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
+ O_RDWR | O_CREAT, 0644);
+ return session_db_ctx_ptr;
}
bool session_init(void)
*/
#include "includes.h"
+#include "smbd/globals.h"
-extern struct auth_context *negprot_global_auth_context;
-extern bool global_encrypted_passwords_negotiated;
-extern bool global_spnego_negotiated;
extern enum protocol_types Protocol;
-extern int max_send;
-
-uint32 global_client_caps = 0;
/*
on a logon error possibly map the error to success if "map to guest"
return;
}
-/****************************************************************************
- List to store partial SPNEGO auth fragments.
-****************************************************************************/
-
-static struct pending_auth_data *pd_list;
-
/****************************************************************************
Delete an entry on the list.
****************************************************************************/
const char *native_os;
const char *native_lanman;
const char *primary_domain;
- static bool done_sesssetup = False;
auth_usersupplied_info *user_info = NULL;
auth_serversupplied_info *server_info = NULL;
uint16 smb_flag2 = req->flags2;
*/
#include "includes.h"
-extern int max_send;
+#include "smbd/globals.h"
/* Make sure we can't write a string past the end of the buffer */
*/
#include "includes.h"
+#include "smbd/globals.h"
-extern int max_send;
extern enum protocol_types Protocol;
-extern uint32 global_client_caps;
#define get_file_size(sbuf) ((sbuf).st_size)
#define DIR_ENTRY_SAFETY_MARGIN 4096
char **ppdata, int total_data,
unsigned int max_data_bytes)
{
- static uint16 fnf_handle = 257;
char *params = *pparams;
uint16 info_level;
*/
#include "includes.h"
+#include "smbd/globals.h"
/* what user is current? */
extern struct current_user current_user;
Utility functions used by become_xxx/unbecome_xxx.
****************************************************************************/
-struct conn_ctx {
- connection_struct *conn;
- uint16 vuid;
-};
-
-/* A stack of current_user connection contexts. */
-
-static struct conn_ctx conn_ctx_stack[MAX_SEC_CTX_DEPTH];
-static int conn_ctx_stack_ndx;
-
static void push_conn_ctx(void)
{
struct conn_ctx *ctx_p;
*/
#include "includes.h"
+#include "smbd/globals.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_VFS
struct vfs_init_function_entry *prev, *next;
};
-static struct vfs_init_function_entry *backends = NULL;
-
/****************************************************************************
maintain the list of available backends
****************************************************************************/
Returns 0 on success, -1 on failure.
****************************************************************************/
-static char *sparse_buf;
#define SPARSE_BUF_WRITE_SIZE (32*1024)
int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
int vfs_ChDir(connection_struct *conn, const char *path)
{
int res;
- static char *LastDir = NULL;
if (!LastDir) {
LastDir = SMB_STRDUP("");