]> git.samba.org - metze/samba/wip.git/commitdiff
r21133: - Apply patch from ages ago, which should allow following \\server\share...
authorDerrell Lipman <derrell@samba.org>
Sat, 3 Feb 2007 17:20:53 +0000 (17:20 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:17:42 +0000 (12:17 -0500)
  DFS referrals.  This doesn't appear to break anything in the non-DFS case,
  but I don't have an environment to test DFS referrals.  Need confirmation
  from OP that this solves the problem.
(This used to be commit e479a9c094fa42354aad7aa76a712bf67d3d4d45)

source3/libsmb/clidfs.c

index 916e4cefc6ec1aa1403a74b305de0e90c1352ba2..93ac2ae58b92349e26f5bff5141cc7600278b689 100644 (file)
@@ -354,13 +354,13 @@ void cli_cm_set_dest_ip(struct in_addr ip )
        have_ip = True;
 }
 
-/********************************************************************
- split a dfs path into the server and share name components
-********************************************************************/
+/**********************************************************************
+ split a dfs path into the server, share name, and extrapath components
+**********************************************************************/
 
-static void split_dfs_path( const char *nodepath, fstring server, fstring share )
+static void split_dfs_path( const char *nodepath, fstring server, fstring share, fstring extrapath )
 {
-       char *p;
+       char *p, *q;
        pstring path;
 
        pstrcpy( path, nodepath );
@@ -368,7 +368,7 @@ static void split_dfs_path( const char *nodepath, fstring server, fstring share
        if ( path[0] != '\\' )
                return;
 
-       p = strrchr_m( path, '\\' );
+       p = strchr_m( path + 1, '\\' );
 
        if ( !p )
                return;
@@ -376,6 +376,16 @@ static void split_dfs_path( const char *nodepath, fstring server, fstring share
        *p = '\0';
        p++;
 
+       /* Look for any extra/deep path */
+       q = strchr_m(p, '\\');
+       if (q != NULL) {
+               *q = '\0';
+               q++;
+               fstrcpy( extrapath, q );
+       } else {
+               fstrcpy( extrapath, '\0' );
+       }
+       
        fstrcpy( share, p );
        fstrcpy( server, &path[1] );
 }
@@ -576,13 +586,13 @@ BOOL cli_resolve_path( const char *mountpt, struct cli_state *rootcli, const cha
        size_t num_refs;
        uint16 consumed;
        struct cli_state *cli_ipc;
-       pstring fullpath, cleanpath;
+       pstring fullpath, cleanpath, extrapath;
        int pathlen;
        fstring server, share;
        struct cli_state *newcli;
        pstring newpath;
        pstring newmount;
-       char *ppath;
+       char *ppath, *temppath = NULL;
        
        SMB_STRUCT_STAT sbuf;
        uint32 attributes;
@@ -637,8 +647,14 @@ BOOL cli_resolve_path( const char *mountpt, struct cli_state *rootcli, const cha
        consumed = MIN(pathlen, consumed );
        pstrcpy( targetpath, &fullpath[consumed/2] );
 
-       split_dfs_path( refs[0].dfspath, server, share );
+       split_dfs_path( refs[0].dfspath, server, share, extrapath );
        SAFE_FREE( refs );
+
+       if (strlen(extrapath) > 0) {
+               string_append(&temppath, extrapath);
+               string_append(&temppath, targetpath);
+               pstrcpy( targetpath, temppath );
+       }
        
        /* open the connection to the target path */
        
@@ -690,6 +706,7 @@ BOOL cli_check_msdfs_proxy( struct cli_state *cli, const char *sharename,
        pstring fullpath;
        BOOL res;
        uint16 cnum;
+       fstring newextrapath;
        
        if ( !cli || !sharename )
                return False;
@@ -725,7 +742,7 @@ BOOL cli_check_msdfs_proxy( struct cli_state *cli, const char *sharename,
                return False;
        }
        
-       split_dfs_path( refs[0].dfspath, newserver, newshare );
+       split_dfs_path( refs[0].dfspath, newserver, newshare, newextrapath );
 
        /* check that this is not a self-referral */