smbd: Add conn_using_smb2()
[samba.git] / source3 / smbd / conn.c
index 003926c97f6fb4a396ee3c62f680de6b517dd140..b7a745a951e85f2731ba25373ae4b915714b5df8 100644 (file)
 #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.
 ****************************************************************************/
@@ -51,9 +70,29 @@ bool conn_snum_used(struct smbd_server_connection *sconn,
        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.
 ****************************************************************************/
 
@@ -115,6 +154,11 @@ connection_struct *conn_new(struct smbd_server_connection *sconn)
        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;
 }
 
@@ -212,7 +256,6 @@ static void conn_free_internal(connection_struct *conn)
        free_namearray(conn->aio_write_behind_list);
 
        ZERO_STRUCTP(conn);
-       talloc_destroy(conn);
 }
 
 /****************************************************************************
@@ -221,14 +264,24 @@ static void conn_free_internal(connection_struct *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);
 }