summaryrefslogtreecommitdiff
path: root/source3/libsmb
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-02-26 15:03:16 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:55:48 -0500
commitfb84318c34418d6f11344b5497efde3a37b5446a (patch)
treec38cb69843f46722e35fc8f020d895fa3fcaedbc /source3/libsmb
parent96572957fc3df956ec0fad242fc7d04ab6a6961f (diff)
downloadsamba-fb84318c34418d6f11344b5497efde3a37b5446a.tar.gz
samba-fb84318c34418d6f11344b5497efde3a37b5446a.tar.bz2
samba-fb84318c34418d6f11344b5497efde3a37b5446a.zip
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 * (This used to be commit 52c82b51ba9729cc53a049d8e9fbb7365d652c51)
Diffstat (limited to 'source3/libsmb')
-rw-r--r--source3/libsmb/clidfs.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
index 62b682a748..867e8e9ba0 100644
--- a/source3/libsmb/clidfs.c
+++ b/source3/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;
}