#include "smbd/globals.h"
#include "lib/util/bitmap.h"
+static void conn_free_internal(connection_struct *conn);
+
+/****************************************************************************
+ * Remove a conn struct from conn->sconn->connections
+ * if not already done.
+****************************************************************************/
+
+static int conn_struct_destructor(connection_struct *conn)
+{
+ if (conn->sconn != NULL) {
+ DLIST_REMOVE(conn->sconn->connections, conn);
+ SMB_ASSERT(conn->sconn->num_connections > 0);
+ conn->sconn->num_connections--;
+ conn->sconn = NULL;
+ }
+ conn_free_internal(conn);
+ return 0;
+}
+
/****************************************************************************
Return the number of open connections.
****************************************************************************/
return false;
}
+enum protocol_types conn_protocol(struct smbd_server_connection *sconn)
+{
+ if ((sconn != NULL) &&
+ (sconn->client != NULL) &&
+ (sconn->client->connections != NULL)) {
+ return sconn->client->connections->protocol;
+ }
+ /*
+ * Default to what source3/lib/util.c has as default for the
+ * static Protocol variable to not change behaviour.
+ */
+ return PROTOCOL_COREPLUS;
+}
+
+bool conn_using_smb2(struct smbd_server_connection *sconn)
+{
+ enum protocol_types proto = conn_protocol(sconn);
+ return (proto >= PROTOCOL_SMB2_02);
+}
+
/****************************************************************************
Find first available connection slot, starting from a random position.
- The randomisation stops problems with the server dieing and clients
+ The randomisation stops problems with the server dying and clients
thinking the server is still available.
****************************************************************************/
DLIST_ADD(sconn->connections, conn);
sconn->num_connections++;
+ /*
+ * Catches the case where someone forgets to call
+ * conn_free().
+ */
+ talloc_set_destructor(conn, conn_struct_destructor);
return conn;
}
free_namearray(conn->aio_write_behind_list);
ZERO_STRUCTP(conn);
- talloc_destroy(conn);
}
/****************************************************************************
void conn_free(connection_struct *conn)
{
- if (conn->sconn == NULL) {
- conn_free_internal(conn);
- return;
- }
+ TALLOC_FREE(conn);
+}
- DLIST_REMOVE(conn->sconn->connections, conn);
- SMB_ASSERT(conn->sconn->num_connections > 0);
- conn->sconn->num_connections--;
+/*
+ * Correctly initialize a share with case options.
+ */
+void conn_setup_case_options(connection_struct *conn)
+{
+ int snum = conn->params->service;
+
+ if (lp_case_sensitive(snum) == Auto) {
+ /* We will be setting this per packet. Set to be case
+ * insensitive for now. */
+ conn->case_sensitive = false;
+ } else {
+ conn->case_sensitive = (bool)lp_case_sensitive(snum);
+ }
- conn_free_internal(conn);
+ conn->case_preserve = lp_preserve_case(snum);
+ conn->short_case_preserve = lp_short_preserve_case(snum);
}