r8963: Clean up the horrid "fake conn struct" part of MSDFS.
authorJeremy Allison <jra@samba.org>
Tue, 2 Aug 2005 23:55:38 +0000 (23:55 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:00:23 +0000 (11:00 -0500)
Jeremy.
(This used to be commit 14dd5ab632ff9abb9582e6484187c6ee1573cdd6)

source3/smbd/conn.c
source3/smbd/msdfs.c

index 534a3367d48781a18a3dc01c3ea67bae33ccb63b..b69868ecec10af5cd073d8e03fb34509569cef40 100644 (file)
@@ -225,10 +225,10 @@ void conn_clear_vuid_cache(uint16 vuid)
 }
 
 /****************************************************************************
- Free a conn structure.
+ Free a conn structure - internal part.
 ****************************************************************************/
 
-void conn_free(connection_struct *conn)
+void conn_free_internal(connection_struct *conn)
 {
        vfs_handle_struct *handle = NULL, *thandle = NULL;
        TALLOC_CTX *mem_ctx = NULL;
@@ -243,8 +243,6 @@ void conn_free(connection_struct *conn)
                handle = thandle;
        }
 
-       DLIST_REMOVE(Connections, conn);
-
        if (conn->ngroups && conn->groups) {
                SAFE_FREE(conn->groups);
                conn->ngroups = 0;
@@ -264,15 +262,25 @@ void conn_free(connection_struct *conn)
        string_free(&conn->connectpath);
        string_free(&conn->origpath);
 
-       bitmap_clear(bmap, conn->cnum);
-       num_open--;
-
        mem_ctx = conn->mem_ctx;
        ZERO_STRUCTP(conn);
        talloc_destroy(mem_ctx);
 }
 
+/****************************************************************************
+ Free a conn structure.
+****************************************************************************/
+
+void conn_free(connection_struct *conn)
+{
+       DLIST_REMOVE(Connections, conn);
 
+       bitmap_clear(bmap, conn->cnum);
+       num_open--;
+
+       conn_free_internal(conn);
+}
 /****************************************************************************
 receive a smbcontrol message to forcibly unmount a share
 the message contains just a share name and all instances of that
index ade167f3c56bac147a164d2496e0a11f3cbb7b44..2b13e2a4b5a4fb3394809be72f1b5966d8d7a9f6 100644 (file)
@@ -133,12 +133,11 @@ static BOOL create_conn_struct(connection_struct *conn, int snum, char *path)
        pstring connpath;
 
        ZERO_STRUCTP(conn);
+
        conn->service = snum;
        pstrcpy(connpath, path);
        pstring_sub(connpath , "%S", lp_servicename(snum));
 
-       string_set(&conn->connectpath, connpath);
-
        /* needed for smbd_vfs_init() */
        
         if ( (conn->mem_ctx=talloc_init("connection_struct")) == NULL ) {
@@ -146,9 +145,11 @@ static BOOL create_conn_struct(connection_struct *conn, int snum, char *path)
                 return False;
         }
        
+       string_set(&conn->connectpath, connpath);
+
        if (!smbd_vfs_init(conn)) {
                DEBUG(0,("create_conn_struct: smbd_vfs_init failed.\n"));
-               talloc_destroy( conn->mem_ctx );
+               conn_free_internal(conn);
                return False;
        }
 
@@ -161,9 +162,10 @@ static BOOL create_conn_struct(connection_struct *conn, int snum, char *path)
        if (vfs_ChDir(conn,conn->connectpath) != 0) {
                DEBUG(3,("create_conn_struct: Can't ChDir to new conn path %s. Error was %s\n",
                                        conn->connectpath, strerror(errno) ));
-               talloc_destroy( conn->mem_ctx );
+               conn_free_internal(conn);
                return False;
        }
+
        return True;
 }
 
@@ -477,7 +479,7 @@ BOOL get_referred_path(TALLOC_CTX *ctx, char *pathname, struct junction_map *juc
        struct dfs_path dp;
 
        struct connection_struct conns;
-       struct connection_structconn = &conns;
+       struct connection_struct *conn = &conns;
        pstring conn_path;
        int snum;
        BOOL ret = False;
@@ -585,10 +587,7 @@ BOOL get_referred_path(TALLOC_CTX *ctx, char *pathname, struct junction_map *juc
 
 out:
 
-       if (conn->mem_ctx) {
-               talloc_destroy( conn->mem_ctx );
-       }
-       
+       conn_free_internal(conn);
        return ret;
 }
 
@@ -937,6 +936,8 @@ BOOL create_msdfs_link(struct junction_map *jucn, BOOL exists)
        BOOL insert_comma = False;
        BOOL ret = False;
 
+       ZERO_STRUCT(conns);
+
        if(!junction_to_local_path(jucn, path, sizeof(path), conn)) {
                return False;
        }
@@ -981,7 +982,8 @@ BOOL create_msdfs_link(struct junction_map *jucn, BOOL exists)
        ret = True;
        
 out:
-       talloc_destroy( conn->mem_ctx );
+
+       conn_free_internal(conn);
        return ret;
 }
 
@@ -992,6 +994,8 @@ BOOL remove_msdfs_link(struct junction_map *jucn)
        connection_struct *conn = &conns;
        BOOL ret = False;
 
+       ZERO_STRUCT(conns);
+
        if( junction_to_local_path(jucn, path, sizeof(path), conn) ) {
                if( SMB_VFS_UNLINK(conn, path) == 0 ) {
                        ret = True;
@@ -999,6 +1003,7 @@ BOOL remove_msdfs_link(struct junction_map *jucn)
                talloc_destroy( conn->mem_ctx );
        }
 
+       conn_free_internal(conn);
        return ret;
 }
 
@@ -1012,6 +1017,8 @@ static int form_junctions(TALLOC_CTX *ctx, int snum, struct junction_map *jucn,
        connection_struct conn;
        struct referral *ref = NULL;
  
+       ZERO_STRUCT(conn);
+
        if (jn_remain <= 0) {
                return 0;
        }
@@ -1078,7 +1085,8 @@ static int form_junctions(TALLOC_CTX *ctx, int snum, struct junction_map *jucn,
        SMB_VFS_CLOSEDIR(&conn,dirp);
 
 out:
-       conn_free(&conn);
+
+       conn_free_internal(&conn);
        return cnt;
 }