summaryrefslogtreecommitdiff
path: root/source3/client/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/client/client.c')
-rw-r--r--source3/client/client.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/source3/client/client.c b/source3/client/client.c
index ef942c9867..d58644e09b 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -80,7 +80,7 @@ extern BOOL have_ip;
extern int max_xmit;
static int interpret_long_filename(int level,char *p,file_info *finfo);
-static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,BOOL recurse_dir,void (*fn)(),BOOL longdir);
+static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,BOOL recurse_dir,void (*fn)(),BOOL longdir, BOOL dirstoo);
static int interpret_short_filename(char *p,file_info *finfo);
static BOOL do_this_one(file_info *finfo);
@@ -478,7 +478,7 @@ static void display_finfo(file_info *finfo)
do a directory listing, calling fn on each file found. Use the TRANSACT2
call for long filenames
****************************************************************************/
-static int do_long_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir)
+static int do_long_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir, BOOL dirstoo)
{
int max_matches = 512;
int info_level = Protocol<PROTOCOL_NT1?1:260; /* NT uses 260, OS/2 uses 2. Both accept 1. */
@@ -638,7 +638,7 @@ static int do_long_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*
for (p=dirlist,i=0;i<total_received;i++)
{
p += interpret_long_filename(info_level,p,&finfo);
- dir_action(inbuf,outbuf,attribute,&finfo,recurse_dir,fn,True);
+ dir_action(inbuf,outbuf,attribute,&finfo,recurse_dir,fn,True, dirstoo);
}
/* free up the dirlist buffer */
@@ -650,7 +650,7 @@ static int do_long_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*
/****************************************************************************
do a directory listing, calling fn on each file found
****************************************************************************/
-static int do_short_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir)
+static int do_short_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir, BOOL dirstoo)
{
char *p;
int received = 0;
@@ -777,7 +777,7 @@ static int do_short_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (
for (p=dirlist,i=0;i<num_received;i++)
{
p += interpret_short_filename(p,&finfo);
- dir_action(inbuf,outbuf,attribute,&finfo,recurse_dir,fn,False);
+ dir_action(inbuf,outbuf,attribute,&finfo,recurse_dir,fn,False,dirstoo);
}
if (dirlist) free(dirlist);
@@ -789,17 +789,17 @@ static int do_short_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (
/****************************************************************************
do a directory listing, calling fn on each file found
****************************************************************************/
-void do_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir)
+void do_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir, BOOL dirstoo)
{
DEBUG(5,("do_dir(%s,%x,%s)\n",Mask,attribute,BOOLSTR(recurse_dir)));
if (Protocol >= PROTOCOL_LANMAN2)
{
- if (do_long_dir(inbuf,outbuf,Mask,attribute,fn,recurse_dir) > 0)
+ if (do_long_dir(inbuf,outbuf,Mask,attribute,fn,recurse_dir,dirstoo) > 0)
return;
}
expand_mask(Mask,False);
- do_short_dir(inbuf,outbuf,Mask,attribute,fn,recurse_dir);
+ do_short_dir(inbuf,outbuf,Mask,attribute,fn,recurse_dir,dirstoo);
return;
}
@@ -973,8 +973,11 @@ static int interpret_long_filename(int level,char *p,file_info *finfo)
/****************************************************************************
act on the files in a dir listing
+
+ RJS, 4-Apr-1998, dirstoo added to allow caller to indicate that directories
+ should be processed as well.
****************************************************************************/
-static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,BOOL recurse_dir,void (*fn)(),BOOL longdir)
+static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,BOOL recurse_dir,void (*fn)(),BOOL longdir, BOOL dirstoo)
{
if (!((finfo->mode & aDIR) == 0 && *fileselection &&
@@ -986,6 +989,11 @@ static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,B
{
pstring mask2;
pstring sav_dir;
+
+ if (fn && dirstoo && do_this_one(finfo)) { /* Do dirs, RJS */
+ fn(finfo);
+ }
+
strcpy(sav_dir,cur_dir);
strcat(cur_dir,finfo->name);
strcat(cur_dir,"\\");
@@ -997,9 +1005,9 @@ static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,B
strcat(mask2,"*");
if (longdir)
- do_long_dir(inbuf,outbuf,mask2,attribute,fn,True);
+ do_long_dir(inbuf,outbuf,mask2,attribute,fn,True, dirstoo);
else
- do_dir(inbuf,outbuf,mask2,attribute,fn,True);
+ do_dir(inbuf,outbuf,mask2,attribute,fn,True, dirstoo);
strcpy(cur_dir,sav_dir);
}
@@ -1038,7 +1046,7 @@ static void cmd_dir(char *inbuf,char *outbuf)
strcat(mask,"*");
}
- do_dir(inbuf,outbuf,mask,attribute,NULL,recurse);
+ do_dir(inbuf,outbuf,mask,attribute,NULL,recurse,False);
do_dskattr();
@@ -1541,7 +1549,7 @@ static void do_mget(file_info *finfo)
strcat(mget_mask,"*");
do_dir((char *)inbuf,(char *)outbuf,
- mget_mask,aSYSTEM | aHIDDEN | aDIR,do_mget,False);
+ mget_mask,aSYSTEM | aHIDDEN | aDIR,do_mget,False, False);
chdir("..");
strcpy(cur_dir,saved_curdir);
free(inbuf);free(outbuf);
@@ -1610,7 +1618,7 @@ static void cmd_mget(char *inbuf,char *outbuf)
strcpy(mget_mask,p);
else
strcat(mget_mask,p);
- do_dir((char *)inbuf,(char *)outbuf,mget_mask,attribute,do_mget,False);
+ do_dir((char *)inbuf,(char *)outbuf,mget_mask,attribute,do_mget,False,False);
}
if (! *mget_mask)
@@ -1619,7 +1627,7 @@ static void cmd_mget(char *inbuf,char *outbuf)
if(mget_mask[strlen(mget_mask)-1]!='\\')
strcat(mget_mask,"\\");
strcat(mget_mask,"*");
- do_dir((char *)inbuf,(char *)outbuf,mget_mask,attribute,do_mget,False);
+ do_dir((char *)inbuf,(char *)outbuf,mget_mask,attribute,do_mget,False,False);
}
}
@@ -2674,7 +2682,7 @@ static void cmd_del(char *inbuf,char *outbuf )
}
strcat(mask,buf);
- do_dir((char *)inbuf,(char *)outbuf,mask,attribute,do_del,False);
+ do_dir((char *)inbuf,(char *)outbuf,mask,attribute,do_del,False,False);
}