r5578: get 'recurse; dir' working across multiple levels of dfs referrals
authorGerald Carter <jerry@samba.org>
Sat, 26 Feb 2005 15:03:16 +0000 (15:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:55:48 +0000 (10:55 -0500)
note that this does not handle the situation where the same \\server\share
is mounted mutliple times in the dfs tree since I store a single mount
path per struct cli_state *
(This used to be commit 52c82b51ba9729cc53a049d8e9fbb7365d652c51)

source3/client/client.c
source3/libsmb/clidfs.c

index 515a2335adcbbf6975740bb28046f577f4ffd632..b00e7f2273f29230a558af446d05709f191f9725 100644 (file)
@@ -217,7 +217,7 @@ static int do_dskattr(void)
        struct cli_state *targetcli;
        pstring targetpath;
 
-       if ( !cli_resolve_path( cli, cur_dir, &targetcli, targetpath ) ) {
+       if ( !cli_resolve_path( "", cli, cur_dir, &targetcli, targetpath ) ) {
                d_printf("Error in dskattr: %s\n", cli_errstr(cli));
        }
 
@@ -277,7 +277,7 @@ static int do_cd(char *newdir)
        pstrcat(cur_dir,"\\");
        dos_clean_name(cur_dir);
        
-       if ( !cli_resolve_path( cli, dname, &targetcli, targetpath ) ) {
+       if ( !cli_resolve_path( "", cli, dname, &targetcli, targetpath ) ) {
                d_printf("cd %s: %s\n", dname, cli_errstr(cli));
                pstrcpy(cur_dir,saved_dir);
                goto out;
@@ -582,7 +582,7 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec,
                        
                        /* check for dfs */
                        
-                       if ( !cli_resolve_path( cli, head, &targetcli, targetpath ) ) {
+                       if ( !cli_resolve_path( "", cli, head, &targetcli, targetpath ) ) {
                                d_printf("do_list: [%s] %s\n", head, cli_errstr(cli));
                                remove_do_list_queue_head();
                                continue;
@@ -609,7 +609,7 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec,
        } else {
                /* check for dfs */
                        
-               if ( cli_resolve_path( cli, mask, &targetcli, targetpath ) ) {
+               if ( cli_resolve_path( "", cli, mask, &targetcli, targetpath ) ) {
                        if (cli_list(targetcli, targetpath, attribute, do_list_helper, NULL) == -1) 
                                d_printf("%s listing %s\n", cli_errstr(targetcli), targetpath);
                }
@@ -722,7 +722,7 @@ static int do_get(char *rname, char *lname, BOOL reget)
                strlower_m(lname);
        }
 
-       if ( !cli_resolve_path( cli, rname, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, rname, &targetcli, targetname ) ) {
                d_printf("Failed to open %s: %s\n", rname, cli_errstr(cli));
                return 1;
        }
@@ -1018,7 +1018,7 @@ static BOOL do_mkdir(char *name)
        struct cli_state *targetcli;
        pstring targetname;
        
-       if ( !cli_resolve_path( cli, name, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, name, &targetcli, targetname ) ) {
                d_printf("mkdir %s: %s\n", name, cli_errstr(cli));
                return False;
        }
@@ -1143,7 +1143,7 @@ static int do_put(char *rname, char *lname, BOOL reput)
        struct cli_state *targetcli;
        pstring targetname;
        
-       if ( !cli_resolve_path( cli, rname, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, rname, &targetcli, targetname ) ) {
                d_printf("Failed to open %s: %s\n", rname, cli_errstr(cli));
                return 1;
        }
@@ -1655,7 +1655,7 @@ static int cmd_open(void)
        }
        pstrcat(mask,buf);
 
-       if ( !cli_resolve_path( cli, mask, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, mask, &targetcli, targetname ) ) {
                d_printf("open %s: %s\n", mask, cli_errstr(cli));
                return 1;
        }
@@ -1685,7 +1685,7 @@ static int cmd_rmdir(void)
        }
        pstrcat(mask,buf);
 
-       if ( !cli_resolve_path( cli, mask, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, mask, &targetcli, targetname ) ) {
                d_printf("rmdir %s: %s\n", mask, cli_errstr(cli));
                return 1;
        }
@@ -1721,7 +1721,7 @@ static int cmd_link(void)
        pstrcat(oldname,buf);
        pstrcat(newname,buf2);
 
-       if ( !cli_resolve_path( cli, oldname, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, oldname, &targetcli, targetname ) ) {
                d_printf("link %s: %s\n", oldname, cli_errstr(cli));
                return 1;
        }
@@ -1796,7 +1796,7 @@ static int cmd_chmod(void)
        mode = (mode_t)strtol(buf, NULL, 8);
        pstrcat(src,buf2);
 
-       if ( !cli_resolve_path( cli, src, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {
                d_printf("chmod %s: %s\n", src, cli_errstr(cli));
                return 1;
        }
@@ -1944,7 +1944,7 @@ static int cmd_getfacl(void)
 
        pstrcat(src,name);
        
-       if ( !cli_resolve_path( cli, src, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {
                d_printf("stat %s: %s\n", src, cli_errstr(cli));
                return 1;
        }
@@ -2109,7 +2109,7 @@ static int cmd_stat(void)
        pstrcat(src,name);
 
        
-       if ( !cli_resolve_path( cli, src, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {
                d_printf("stat %s: %s\n", src, cli_errstr(cli));
                return 1;
        }
@@ -2185,7 +2185,7 @@ static int cmd_chown(void)
        gid = (gid_t)atoi(buf2);
        pstrcat(src,buf3);
 
-       if ( !cli_resolve_path( cli, src, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {
                d_printf("chown %s: %s\n", src, cli_errstr(cli));
                return 1;
        }
@@ -2257,7 +2257,7 @@ static int cmd_hardlink(void)
        pstrcat(src,buf);
        pstrcat(dest,buf2);
 
-       if ( !cli_resolve_path( cli, src, &targetcli, targetname ) ) {
+       if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {
                d_printf("hardlink %s: %s\n", src, cli_errstr(cli));
                return 1;
        }
@@ -2669,7 +2669,7 @@ static int cmd_show_connect( void )
        struct cli_state *targetcli;
        pstring targetpath;
        
-       if ( !cli_resolve_path( cli, cur_dir, &targetcli, targetpath ) ) {
+       if ( !cli_resolve_path( "", cli, cur_dir, &targetcli, targetpath ) ) {
                d_printf("showconnect %s: %s\n", cur_dir, cli_errstr(cli));
                return 1;
        }
index 62b682a748da28c1e6a55d2edd2ace40ae2c458f..867e8e9ba0a8ccaf604289800da5ed599501fe73 100644 (file)
@@ -174,8 +174,6 @@ static void cli_cm_set_mntpoint( struct cli_state *c, const char *mnt )
 {
        struct client_connection *p;
        int i;
-       pstring path;
-       char *ppath;
 
        for ( p=connections,i=0; p; p=p->next,i++ ) {
                if ( strequal(p->cli->desthost, c->desthost) && strequal(p->cli->share, c->share) )
@@ -185,14 +183,6 @@ static void cli_cm_set_mntpoint( struct cli_state *c, const char *mnt )
        if ( p ) {
                pstrcpy( p->mount, mnt );
                dos_clean_name( p->mount );
-
-#if 0 
-               /* strip any leading '\\' */
-               ppath = path;
-               if ( *ppath == '\\' )
-                       ppath++;
-               pstrcpy( p->mount, ppath );             
-#endif
        }
 }
 
@@ -567,7 +557,7 @@ BOOL cli_dfs_get_referral( struct cli_state *cli, const char *path,
 /********************************************************************
 ********************************************************************/
 
-BOOL cli_resolve_path( struct cli_state *rootcli, const char *path,
+BOOL cli_resolve_path( const char *mountpt, struct cli_state *rootcli, const char *path,
                        struct cli_state **targetcli, pstring targetpath )
 {
        CLIENT_DFS_REFERRAL *refs = NULL;
@@ -579,6 +569,8 @@ BOOL cli_resolve_path( struct cli_state *rootcli, const char *path,
        fstring server, share;
        struct cli_state *newcli;
        pstring newpath;
+       pstring newmount;
+       char *ppath;
        
        SMB_STRUCT_STAT sbuf;
        uint32 attributes;
@@ -637,17 +629,28 @@ BOOL cli_resolve_path( struct cli_state *rootcli, const char *path,
                return False;
        }
        
-       cli_cm_set_mntpoint( *targetcli, cleanpath );
+       /* parse out the consumed mount path */
+       /* trim off the \server\share\ */
 
-       /* check for another dfs refeerrali, note that we are not 
+       fullpath[consumed/2] = '\0';
+       dos_clean_name( fullpath );
+       ppath = strchr_m( fullpath, '\\' );
+       ppath = strchr_m( ppath+1, '\\' );
+       ppath = strchr_m( ppath+1, '\\' );
+       ppath++;
+       
+       pstr_sprintf( newmount, "%s\\%s", mountpt, ppath );
+       cli_cm_set_mntpoint( *targetcli, newmount );
+
+       /* check for another dfs referral, note that we are not 
           checking for loops here */
 
        if ( !strequal( targetpath, "\\" ) ) {
-               if ( cli_resolve_path( *targetcli, targetpath, &newcli, newpath ) ) {
+               if ( cli_resolve_path( newmount, *targetcli, targetpath, &newcli, newpath ) ) {
                        *targetcli = newcli;
                        pstrcpy( targetpath, newpath );
                }
        }
-       
+
        return True;
 }