From 4375a4637574c4b8b2411bb623ca3384241be672 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Sat, 26 Feb 2005 15:03:16 +0000 Subject: [PATCH] r5578: get 'recurse; dir' working across multiple levels of dfs referrals 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 * --- source/client/client.c | 32 ++++++++++++++++---------------- source/libsmb/clidfs.c | 33 ++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/source/client/client.c b/source/client/client.c index 515a2335adc..b00e7f2273f 100644 --- a/source/client/client.c +++ b/source/client/client.c @@ -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; } diff --git a/source/libsmb/clidfs.c b/source/libsmb/clidfs.c index 62b682a748d..867e8e9ba0a 100644 --- a/source/libsmb/clidfs.c +++ b/source/libsmb/clidfs.c @@ -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; } -- 2.11.4.GIT