mirror of
https://github.com/samba-team/samba.git
synced 2025-12-16 00:23:52 +03:00
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 commit is contained in:
committed by
Gerald (Jerry) Carter
parent
d4443807bc
commit
52c82b51ba
@@ -217,7 +217,7 @@ static int do_dskattr(void)
|
|||||||
struct cli_state *targetcli;
|
struct cli_state *targetcli;
|
||||||
pstring targetpath;
|
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));
|
d_printf("Error in dskattr: %s\n", cli_errstr(cli));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +277,7 @@ static int do_cd(char *newdir)
|
|||||||
pstrcat(cur_dir,"\\");
|
pstrcat(cur_dir,"\\");
|
||||||
dos_clean_name(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));
|
d_printf("cd %s: %s\n", dname, cli_errstr(cli));
|
||||||
pstrcpy(cur_dir,saved_dir);
|
pstrcpy(cur_dir,saved_dir);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -582,7 +582,7 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec,
|
|||||||
|
|
||||||
/* check for dfs */
|
/* 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));
|
d_printf("do_list: [%s] %s\n", head, cli_errstr(cli));
|
||||||
remove_do_list_queue_head();
|
remove_do_list_queue_head();
|
||||||
continue;
|
continue;
|
||||||
@@ -609,7 +609,7 @@ void do_list(const char *mask,uint16 attribute,void (*fn)(file_info *),BOOL rec,
|
|||||||
} else {
|
} else {
|
||||||
/* check for dfs */
|
/* 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)
|
if (cli_list(targetcli, targetpath, attribute, do_list_helper, NULL) == -1)
|
||||||
d_printf("%s listing %s\n", cli_errstr(targetcli), targetpath);
|
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);
|
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));
|
d_printf("Failed to open %s: %s\n", rname, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1018,7 +1018,7 @@ static BOOL do_mkdir(char *name)
|
|||||||
struct cli_state *targetcli;
|
struct cli_state *targetcli;
|
||||||
pstring targetname;
|
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));
|
d_printf("mkdir %s: %s\n", name, cli_errstr(cli));
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
@@ -1143,7 +1143,7 @@ static int do_put(char *rname, char *lname, BOOL reput)
|
|||||||
struct cli_state *targetcli;
|
struct cli_state *targetcli;
|
||||||
pstring targetname;
|
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));
|
d_printf("Failed to open %s: %s\n", rname, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1655,7 +1655,7 @@ static int cmd_open(void)
|
|||||||
}
|
}
|
||||||
pstrcat(mask,buf);
|
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));
|
d_printf("open %s: %s\n", mask, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1685,7 +1685,7 @@ static int cmd_rmdir(void)
|
|||||||
}
|
}
|
||||||
pstrcat(mask,buf);
|
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));
|
d_printf("rmdir %s: %s\n", mask, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1721,7 +1721,7 @@ static int cmd_link(void)
|
|||||||
pstrcat(oldname,buf);
|
pstrcat(oldname,buf);
|
||||||
pstrcat(newname,buf2);
|
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));
|
d_printf("link %s: %s\n", oldname, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1796,7 +1796,7 @@ static int cmd_chmod(void)
|
|||||||
mode = (mode_t)strtol(buf, NULL, 8);
|
mode = (mode_t)strtol(buf, NULL, 8);
|
||||||
pstrcat(src,buf2);
|
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));
|
d_printf("chmod %s: %s\n", src, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1944,7 +1944,7 @@ static int cmd_getfacl(void)
|
|||||||
|
|
||||||
pstrcat(src,name);
|
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));
|
d_printf("stat %s: %s\n", src, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -2109,7 +2109,7 @@ static int cmd_stat(void)
|
|||||||
pstrcat(src,name);
|
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));
|
d_printf("stat %s: %s\n", src, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -2185,7 +2185,7 @@ static int cmd_chown(void)
|
|||||||
gid = (gid_t)atoi(buf2);
|
gid = (gid_t)atoi(buf2);
|
||||||
pstrcat(src,buf3);
|
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));
|
d_printf("chown %s: %s\n", src, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -2257,7 +2257,7 @@ static int cmd_hardlink(void)
|
|||||||
pstrcat(src,buf);
|
pstrcat(src,buf);
|
||||||
pstrcat(dest,buf2);
|
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));
|
d_printf("hardlink %s: %s\n", src, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -2669,7 +2669,7 @@ static int cmd_show_connect( void )
|
|||||||
struct cli_state *targetcli;
|
struct cli_state *targetcli;
|
||||||
pstring targetpath;
|
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));
|
d_printf("showconnect %s: %s\n", cur_dir, cli_errstr(cli));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,8 +174,6 @@ static void cli_cm_set_mntpoint( struct cli_state *c, const char *mnt )
|
|||||||
{
|
{
|
||||||
struct client_connection *p;
|
struct client_connection *p;
|
||||||
int i;
|
int i;
|
||||||
pstring path;
|
|
||||||
char *ppath;
|
|
||||||
|
|
||||||
for ( p=connections,i=0; p; p=p->next,i++ ) {
|
for ( p=connections,i=0; p; p=p->next,i++ ) {
|
||||||
if ( strequal(p->cli->desthost, c->desthost) && strequal(p->cli->share, c->share) )
|
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 ) {
|
if ( p ) {
|
||||||
pstrcpy( p->mount, mnt );
|
pstrcpy( p->mount, mnt );
|
||||||
dos_clean_name( p->mount );
|
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 )
|
struct cli_state **targetcli, pstring targetpath )
|
||||||
{
|
{
|
||||||
CLIENT_DFS_REFERRAL *refs = NULL;
|
CLIENT_DFS_REFERRAL *refs = NULL;
|
||||||
@@ -579,6 +569,8 @@ BOOL cli_resolve_path( struct cli_state *rootcli, const char *path,
|
|||||||
fstring server, share;
|
fstring server, share;
|
||||||
struct cli_state *newcli;
|
struct cli_state *newcli;
|
||||||
pstring newpath;
|
pstring newpath;
|
||||||
|
pstring newmount;
|
||||||
|
char *ppath;
|
||||||
|
|
||||||
SMB_STRUCT_STAT sbuf;
|
SMB_STRUCT_STAT sbuf;
|
||||||
uint32 attributes;
|
uint32 attributes;
|
||||||
@@ -637,17 +629,28 @@ BOOL cli_resolve_path( struct cli_state *rootcli, const char *path,
|
|||||||
return False;
|
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 */
|
checking for loops here */
|
||||||
|
|
||||||
if ( !strequal( targetpath, "\\" ) ) {
|
if ( !strequal( targetpath, "\\" ) ) {
|
||||||
if ( cli_resolve_path( *targetcli, targetpath, &newcli, newpath ) ) {
|
if ( cli_resolve_path( newmount, *targetcli, targetpath, &newcli, newpath ) ) {
|
||||||
*targetcli = newcli;
|
*targetcli = newcli;
|
||||||
pstrcpy( targetpath, newpath );
|
pstrcpy( targetpath, newpath );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user