summaryrefslogtreecommitdiff
path: root/source4/include/context.h
diff options
context:
space:
mode:
Diffstat (limited to 'source4/include/context.h')
-rw-r--r--source4/include/context.h346
1 files changed, 346 insertions, 0 deletions
diff --git a/source4/include/context.h b/source4/include/context.h
new file mode 100644
index 0000000000..102403d009
--- /dev/null
+++ b/source4/include/context.h
@@ -0,0 +1,346 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Copyright (C) Andrew Tridgell 2003
+ Copyright (C) James J Myers 2003 <myersjj@samba.org>
+
+ 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.
+*/
+
+/*
+ this header declares the core context structures associated with smb
+ sockets, tree connects, requests etc
+
+ the idea is that we will eventually get rid of all our global
+ variables and instead store our stang from structures hanging off
+ these basic elements
+*/
+
+/* the current user context for a request */
+struct user_context {
+ /* the vuid is used to specify the security context for this
+ request. Note that this may not be the same vuid as we
+ received on the wire (for example, for share mode or guest
+ access) */
+ uint16 vuid;
+
+ /* the domain name, user name etc - mostly used in % substitutions */
+ struct userdom_struct *user;
+
+ struct user_struct *vuser;
+};
+
+/* the context for a single SMB request. This is passed to any request-context
+ functions */
+struct request_context {
+ /* the server_context contains all context specific to this SMB socket */
+ struct server_context *smb;
+
+ /* conn is only set for operations that have a valid TID */
+ struct tcon_context *conn;
+
+ /* the user context is derived from the vuid plus smb.conf options */
+ struct user_context *user_ctx;
+
+ /* a talloc context for the lifetime of this request */
+ TALLOC_CTX *mem_ctx;
+
+ /* a set of flags to control usage of the request. See REQ_CONTROL_* */
+ unsigned control_flags;
+
+ /* the smb pid is needed for locking contexts */
+ uint16 smbpid;
+
+ /* the flags from the SMB request, in raw form (host byte order) */
+ uint16 flags, flags2;
+
+ /* the system time when the request arrived */
+ struct timeval request_time;
+
+ /* this can contain a fnum from an earlier part of a chained
+ * message (such as an SMBOpenX), or -1 */
+ int chained_fnum;
+
+ /* how far through the chain of SMB commands have we gone? */
+ unsigned chain_count;
+
+ /* the async structure allows backend functions to delay
+ replying to requests. To use this, the front end must set
+ async.send_fn to a function to be called by the backend
+ when the reply is finally ready to be sent. The backend
+ must set async.status to the status it wants in the
+ reply. The backend must set the REQ_CONTROL_ASYNC
+ control_flag on the request to indicate that it wishes to
+ delay the reply
+
+ If async.send_fn is NULL then the backend cannot ask for a
+ delayed reply for this request
+
+ note that the async.private pointer is private to the front
+ end not the backend. The backend must not change it.
+ */
+ struct {
+ void (*send_fn)(struct request_context *);
+ void *private;
+ NTSTATUS status;
+ } async;
+
+ struct {
+ /* the raw SMB buffer, including the 4 byte length header */
+ char *buffer;
+
+ /* the size of the raw buffer, including 4 byte header */
+ unsigned size;
+
+ /* how much has been allocated - on reply the buffer is over-allocated to
+ prevent too many realloc() calls
+ */
+ unsigned allocated;
+
+ /* the start of the SMB header - this is always buffer+4 */
+ char *hdr;
+
+ /* the command words and command word count. vwv points
+ into the raw buffer */
+ char *vwv;
+ unsigned wct;
+
+ /* the data buffer and size. data points into the raw buffer */
+ char *data;
+ unsigned data_size;
+
+ /* ptr is used as a moving pointer into the data area
+ * of the packet. The reason its here and not a local
+ * variable in each function is that when a realloc of
+ * a reply packet is done we need to move this
+ * pointer */
+ char *ptr;
+ } in, out;
+};
+
+
+
+/* the context associated with open files on an smb socket */
+struct files_context {
+ struct files_struct *files; /* open files */
+ struct bitmap *file_bmap; /* bitmap used to allocate file handles */
+
+ /* a fsp to use when chaining */
+ struct files_struct *chain_fsp;
+
+ /* a fsp to use to save when breaking an oplock. */
+ struct files_struct *oplock_save_chain_fsp;
+
+ /* how many files are open */
+ int files_used;
+
+ /* limit for maximum open files */
+ int real_max_open_files;
+};
+
+
+/* the context associated with open tree connects on a smb socket */
+struct tree_context {
+ struct tcon_context *connections;
+
+ /* number of open connections */
+ struct bitmap *bmap;
+ int num_open;
+};
+
+/* context associated with currently valid session setups */
+struct users_context {
+ /* users from session setup */
+ char *session_users; /* was a pstring */
+
+ /* this holds info on user ids that are already validated for this VC */
+ struct user_struct *validated_users;
+ int next_vuid; /* initialise to VUID_OFFSET */
+ int num_validated_vuids;
+};
+
+
+/* this contains variables that should be used in % substitutions for
+ * smb.conf parameters */
+struct substitute_context {
+ char *remote_arch;
+
+ /* our local netbios name, as give to us by the client */
+ char *local_machine;
+
+ /* the remote netbios name, as give to us by the client */
+ char *remote_machine;
+
+ /* the select remote protocol */
+ char *remote_proto;
+
+ /* the name of the client as should be displayed in
+ * smbstatus. Can be an IP or a netbios name */
+ char *client_name;
+
+ /* the username for %U */
+ char *user_name;
+};
+
+/* context that has been negotiated between the client and server */
+struct negotiate_context {
+ /* have we already done the NBT session establishment? */
+ BOOL done_nbt_session;
+
+ /* only one negprot per connection is allowed */
+ BOOL done_negprot;
+
+ /* multiple session setups are allowed, but some parameters are
+ ignored in any but the first */
+ BOOL done_sesssetup;
+
+ /*
+ * Size of data we can send to client. Set
+ * by the client for all protocols above CORE.
+ * Set by us for CORE protocol.
+ */
+ unsigned max_send; /* init to BUFFER_SIZE */
+
+ /*
+ * Size of the data we can receive. Set by us.
+ * Can be modified by the max xmit parameter.
+ */
+ unsigned max_recv; /* init to BUFFER_SIZE */
+
+ /* a guess at the remote architecture. Try not to rely on this - in almost
+ all cases using these values is the wrong thing to do */
+ enum remote_arch_types ra_type;
+
+ /* the negotiatiated protocol */
+ enum protocol_types protocol;
+
+ /* authentication context for multi-part negprot */
+ struct auth_context *auth_context;
+
+ /* state of NTLMSSP auth */
+ struct auth_ntlmssp_state *ntlmssp_state;
+
+ /* did we tell the client we support encrypted passwords? */
+ BOOL encrypted_passwords;
+
+ /* did we send an extended security negprot reply? */
+ BOOL spnego_negotiated;
+
+ /* client capabilities */
+ uint32 client_caps;
+};
+
+/* this is the context for a SMB socket associated with the socket itself */
+struct socket_context {
+ /* the open file descriptor */
+ int fd;
+
+ /* the last read error on the socket, if any (replaces smb_read_error global) */
+ int read_error;
+
+ /* a count of the number of packets we have received. We
+ * actually only care about zero/non-zero at this stage */
+ unsigned pkt_count;
+
+ /* the network address of the client */
+ char *client_addr;
+};
+
+
+/* this holds long term state specific to the printing subsystem */
+struct printing_context {
+ struct notify_queue *notify_queue_head;
+};
+
+
+/* the server_context holds a linked list of pending requests,
+ * this is used for blocking locks and requests blocked due to oplock
+ * break requests */
+struct pending_request {
+ struct pending_request *next, *prev;
+
+ /* the request itself - needs to be freed */
+ struct request_context *request;
+};
+
+/* the timers context contains info on when we last did various
+ * functions */
+struct timers_context {
+ /* when did we last do timeout processing? */
+ time_t last_timeout_processing;
+
+ /* when did we last sent a keepalive */
+ time_t last_keepalive_sent;
+
+ /* when we last checked the smb.conf for auto-reload */
+ time_t last_smb_conf_reload;
+};
+
+
+/* the process model operations structure - contains function pointers to
+ the model-specific implementations of each operation */
+struct model_ops {
+ /* called at startup when the model is selected */
+ void (*model_startup)(void);
+
+ /* function to accept new connection */
+ void (*accept_connection)(struct event_context *, struct fd_event *, time_t, uint16);
+
+ /* function to terminate a connection */
+ void (*terminate_connection)(struct server_context *smb, const char *reason);
+
+ /* function to exit server */
+ void (*exit_server)(struct server_context *smb, const char *reason);
+
+ /* returns process or thread id */
+ int (*get_id)(struct request_context *req);
+};
+
+
+/* smb context structure. This should contain all the state
+ * information associated with a SMB server */
+struct server_context {
+ /* a talloc context for all data in this structure */
+ TALLOC_CTX *mem_ctx;
+
+ struct negotiate_context negotiate;
+
+ struct substitute_context substitute;
+
+ struct socket_context socket;
+
+ struct files_context file;
+
+ struct tree_context tree;
+
+ struct users_context users;
+
+ struct printing_context print;
+
+ struct timers_context timers;
+
+ /* the pid of the process handling this session */
+ pid_t pid;
+
+ /* pointer make to smbd daemon context */
+ struct smbd_context *smbd;
+
+ /* pointer to list of events that we are waiting on */
+ struct event_context *events;
+
+ /* process model specific operations */
+ struct model_ops *model_ops;
+};
+