|
Packit Service |
a2489d |
/*
|
|
Packit Service |
a2489d |
* lftp - file transfer program
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
a2489d |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
a2489d |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit Service |
a2489d |
* (at your option) any later version.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
a2489d |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
a2489d |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
a2489d |
* GNU General Public License for more details.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
a2489d |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
a2489d |
*/
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include <config.h>
|
|
Packit Service |
a2489d |
#include <assert.h>
|
|
Packit Service |
a2489d |
#include <fnmatch.h>
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include "FindJob.h"
|
|
Packit Service |
a2489d |
#include "CmdExec.h"
|
|
Packit Service |
a2489d |
#include "misc.h"
|
|
Packit Service |
a2489d |
#include "GetFileInfo.h"
|
|
Packit Service |
a2489d |
#include "url.h"
|
|
Packit Service |
a2489d |
#include "PatternSet.h"
|
|
Packit Service |
a2489d |
#include "buffer_std.h"
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#define top (*stack.last())
|
|
Packit Service |
a2489d |
#define stack_ptr (stack.count()-1)
|
|
Packit Service |
a2489d |
#define super SessionJob
|
|
Packit Service |
a2489d |
#define orig_session super::session
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int FinderJob::Do()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
int m=STALL;
|
|
Packit Service |
a2489d |
prf_res pres;
|
|
Packit Service |
a2489d |
Job *j;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
switch(state)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
case START_INFO:
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(stack_ptr==-1)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
ParsedURL u(dir,true);
|
|
Packit Service |
a2489d |
if(u.proto)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
session=my_session=FileAccess::New(&u);
|
|
Packit Service |
a2489d |
session->SetPriority(fg?1:0);
|
|
Packit Service |
a2489d |
init_dir=session->GetCwd();
|
|
Packit Service |
a2489d |
Down(u.path?u.path.get():init_dir.path.get());
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* If we're not validating, and this is an argument (first-level path),
|
|
Packit Service |
a2489d |
* pretend the file exists. */
|
|
Packit Service |
a2489d |
if((file_info_need|FileInfo::NAME) == FileInfo::NAME &&
|
|
Packit Service |
a2489d |
!validate_args && stack_ptr == -1)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
FileSet *fs = new FileSet();
|
|
Packit Service |
a2489d |
fs->Add(new FileInfo(dir));
|
|
Packit Service |
a2489d |
Push(fs);
|
|
Packit Service |
a2489d |
state=LOOP;
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* The first time we get here (stack_ptr == -1), dir is an actual
|
|
Packit Service |
a2489d |
* argument, so it might be a file. (Every other time, it's guaranteed
|
|
Packit Service |
a2489d |
* to be a directory.) Set show_dirs to true, so it'll end up actually
|
|
Packit Service |
a2489d |
* being on the stack, with type information. */
|
|
Packit Service |
a2489d |
li=new GetFileInfo(session, dir, stack_ptr == -1);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* Prepend for the argument level entry only: */
|
|
Packit Service |
a2489d |
if(stack_ptr != -1)
|
|
Packit Service |
a2489d |
li->DontPrependPath();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int need = file_info_need|FileInfo::NAME;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* We only explicitely need the type if we're recursing further. */
|
|
Packit Service |
a2489d |
if(stack_ptr+1 < maxdepth)
|
|
Packit Service |
a2489d |
need |= FileInfo::TYPE;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
li->Need(need);
|
|
Packit Service |
a2489d |
if(use_cache)
|
|
Packit Service |
a2489d |
li->UseCache();
|
|
Packit Service |
a2489d |
state=INFO;
|
|
Packit Service |
a2489d |
m=MOVED;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
case INFO:
|
|
Packit Service |
a2489d |
if(!li->Done())
|
|
Packit Service |
a2489d |
return m;
|
|
Packit Service |
a2489d |
if(li->Error())
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(!quiet)
|
|
Packit Service |
a2489d |
eprintf("%s: %s\n",op,li->ErrorText());
|
|
Packit Service |
a2489d |
li=0;
|
|
Packit Service |
a2489d |
errors++;
|
|
Packit Service |
a2489d |
depth_done=true;
|
|
Packit Service |
a2489d |
state=LOOP;
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(stack_ptr != -1 && li->WasDirectory())
|
|
Packit Service |
a2489d |
Enter(dir);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Push(li->GetResult());
|
|
Packit Service |
a2489d |
top.fset->rewind();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
li=0;
|
|
Packit Service |
a2489d |
state=LOOP;
|
|
Packit Service |
a2489d |
m=MOVED;
|
|
Packit Service |
a2489d |
case LOOP:
|
|
Packit Service |
a2489d |
if(stack_ptr==-1 || top.fset->curr()==0)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
Up();
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
session->SetCwd(init_dir);
|
|
Packit Service |
a2489d |
session->Chdir(top.path,false);
|
|
Packit Service |
a2489d |
// at this point either is true:
|
|
Packit Service |
a2489d |
// 1. we just process another file (!depth_done)
|
|
Packit Service |
a2489d |
// 2. we just returned from a subdir (depth_done)
|
|
Packit Service |
a2489d |
if(depth_first && !depth_done && (maxdepth == -1 || stack_ptr+1 < maxdepth))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
FileInfo *f=top.fset->curr();
|
|
Packit Service |
a2489d |
if((f->defined&f->TYPE) && f->filetype==f->DIRECTORY)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
Down(f->name);
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
state=PROCESSING;
|
|
Packit Service |
a2489d |
m=MOVED;
|
|
Packit Service |
a2489d |
case PROCESSING:
|
|
Packit Service |
a2489d |
pres=ProcessFile(top.path,top.fset->curr());
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(pres==PRF_LATER)
|
|
Packit Service |
a2489d |
return m;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
depth_done=false;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
switch(pres)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
case(PRF_FATAL):
|
|
Packit Service |
a2489d |
errors++;
|
|
Packit Service |
a2489d |
state=DONE;
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
case(PRF_ERR):
|
|
Packit Service |
a2489d |
errors++;
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
case(PRF_WAIT):
|
|
Packit Service |
a2489d |
state=WAIT;
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
case(PRF_OK):
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
case(PRF_LATER):
|
|
Packit Service |
a2489d |
abort();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
post_WAIT:
|
|
Packit Service |
a2489d |
state=LOOP;
|
|
Packit Service |
a2489d |
m=MOVED;
|
|
Packit Service |
a2489d |
if(stack_ptr==-1)
|
|
Packit Service |
a2489d |
return m;
|
|
Packit Service |
a2489d |
if(!depth_first && (maxdepth == -1 || stack_ptr+1 < maxdepth))
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
FileInfo *f=top.fset->curr();
|
|
Packit Service |
a2489d |
if((f->defined&f->TYPE) && f->filetype==f->DIRECTORY)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
top.fset->next();
|
|
Packit Service |
a2489d |
Down(f->name);
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
top.fset->next();
|
|
Packit Service |
a2489d |
return MOVED;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
case WAIT:
|
|
Packit Service |
a2489d |
j=FindDoneAwaitedJob();
|
|
Packit Service |
a2489d |
if(!j)
|
|
Packit Service |
a2489d |
return m;
|
|
Packit Service |
a2489d |
RemoveWaiting(j);
|
|
Packit Service |
a2489d |
Delete(j);
|
|
Packit Service |
a2489d |
goto post_WAIT;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
case DONE:
|
|
Packit Service |
a2489d |
return m;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return m;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::Up()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(stack_ptr==-1)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
done:
|
|
Packit Service |
a2489d |
state=DONE;
|
|
Packit Service |
a2489d |
Finish();
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
/* stack[0] is the dir entry for the argument (ie. ls -d dir), and
|
|
Packit Service |
a2489d |
* stack[1] is the contents (ls dir); don't exit for the first. */
|
|
Packit Service |
a2489d |
if(stack_ptr)
|
|
Packit Service |
a2489d |
Exit();
|
|
Packit Service |
a2489d |
stack.chop();
|
|
Packit Service |
a2489d |
if(stack_ptr==-1)
|
|
Packit Service |
a2489d |
goto done;
|
|
Packit Service |
a2489d |
depth_done=true;
|
|
Packit Service |
a2489d |
state=LOOP;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::Push(FileSet *fset)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
const char *old_path=0;
|
|
Packit Service |
a2489d |
if(stack_ptr>=0)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
old_path=top.path;
|
|
Packit Service |
a2489d |
fset->ExcludeDots(); /* don't need . and .. (except for stack[0]) */
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *new_path="";
|
|
Packit Service |
a2489d |
if(old_path) // the first path will be empty
|
|
Packit Service |
a2489d |
new_path=alloca_strdup(dir_file(old_path,dir));
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* matching exclusions don't include the path, so they operate
|
|
Packit Service |
a2489d |
* on the filename portion only */
|
|
Packit Service |
a2489d |
if(exclude)
|
|
Packit Service |
a2489d |
fset->Exclude(0, exclude);
|
|
Packit Service |
a2489d |
stack.append(new place(new_path,fset));
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* give a chance to operate on the list as a whole, and
|
|
Packit Service |
a2489d |
* possibly sort it */
|
|
Packit Service |
a2489d |
ProcessList(fset);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::Down(const char *p)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
#ifdef FIND_DEBUG
|
|
Packit Service |
a2489d |
printf("Down(%s)\n",p.get());
|
|
Packit Service |
a2489d |
#endif
|
|
Packit Service |
a2489d |
dir.set(p);
|
|
Packit Service |
a2489d |
state=START_INFO;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FinderJob::prf_res FinderJob::ProcessFile(const char *d,const FileInfo *f)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
return PRF_OK;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::Init()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
op="find";
|
|
Packit Service |
a2489d |
errors=0;
|
|
Packit Service |
a2489d |
li=0;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
show_sl=true;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
depth_first=false; // useful for rm -r
|
|
Packit Service |
a2489d |
depth_done=false;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
file_info_need=0;
|
|
Packit Service |
a2489d |
use_cache=true;
|
|
Packit Service |
a2489d |
validate_args=false;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
quiet=false;
|
|
Packit Service |
a2489d |
maxdepth=-1;
|
|
Packit Service |
a2489d |
exclude=0;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
state=START_INFO;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FinderJob::FinderJob(FileAccess *s)
|
|
Packit Service |
a2489d |
: SessionJob(s), orig_init_dir(orig_session->GetCwd()),
|
|
Packit Service |
a2489d |
session(orig_session), init_dir(session->GetCwd())
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
Init();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::NextDir(const char *d)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(session!=orig_session)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
session=orig_session;
|
|
Packit Service |
a2489d |
init_dir=orig_init_dir;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
session->SetCwd(init_dir);
|
|
Packit Service |
a2489d |
Down(d);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FinderJob::~FinderJob()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::ShowRunStatus(const SMTaskRef<StatusLine>& sl)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(!show_sl)
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
switch(state)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
case INFO:
|
|
Packit Service |
a2489d |
sl->Show("%s: %s",dir_file(stack_ptr>=0?top.path.get():0,dir),li->Status());
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
case WAIT:
|
|
Packit Service |
a2489d |
Job::ShowRunStatus(sl);
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
default:
|
|
Packit Service |
a2489d |
sl->Clear();
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring& FinderJob::FormatStatus(xstring& s,int v,const char *prefix)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
SessionJob::FormatStatus(s,v,prefix);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
switch(state)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
case INFO:
|
|
Packit Service |
a2489d |
s.appendf("\t%s: %s\n",dir_file(stack_ptr>=0?top.path.get():0,dir),li->Status());
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
case WAIT:
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
default:
|
|
Packit Service |
a2489d |
break;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
return s;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob::Fg()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
super::Fg();
|
|
Packit Service |
a2489d |
if(orig_session!=session)
|
|
Packit Service |
a2489d |
session->SetPriority(1);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void FinderJob::Bg()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(orig_session!=session)
|
|
Packit Service |
a2489d |
session->SetPriority(0);
|
|
Packit Service |
a2489d |
super::Bg();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
// FinderJob_List implementation
|
|
Packit Service |
a2489d |
// find files and write list to a stream
|
|
Packit Service |
a2489d |
FinderJob::prf_res FinderJob_List::ProcessFile(const char *d,const FileInfo *fi)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(buf->Broken())
|
|
Packit Service |
a2489d |
return PRF_FATAL;
|
|
Packit Service |
a2489d |
if(buf->Error())
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
eprintf("%s: %s\n",op,buf->ErrorText());
|
|
Packit Service |
a2489d |
return PRF_FATAL;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
if(fg_data==0)
|
|
Packit Service |
a2489d |
fg_data=buf->GetFgData(fg);
|
|
Packit Service |
a2489d |
if(buf->Size()>0x10000)
|
|
Packit Service |
a2489d |
return PRF_LATER;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring path_to_show;
|
|
Packit Service |
a2489d |
if(ProcessingURL())
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
FileAccess::Path old_cwd=session->GetCwd();
|
|
Packit Service |
a2489d |
session->SetCwd(init_dir);
|
|
Packit Service |
a2489d |
path_to_show.set(session->GetFileURL(dir_file(d,fi->name)));
|
|
Packit Service |
a2489d |
session->SetCwd(old_cwd);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
path_to_show.set(dir_file(d,fi->name));
|
|
Packit Service |
a2489d |
if((fi->defined&fi->TYPE) && fi->filetype==fi->DIRECTORY && strcmp(fi->name,"/"))
|
|
Packit Service |
a2489d |
path_to_show.append('/');
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
if(long_listing) {
|
|
Packit Service |
a2489d |
FileInfo n(*fi);
|
|
Packit Service |
a2489d |
n.SetName(path_to_show);
|
|
Packit Service |
a2489d |
n.MakeLongName();
|
|
Packit Service |
a2489d |
buf->Put(n.longname);
|
|
Packit Service |
a2489d |
} else {
|
|
Packit Service |
a2489d |
buf->Put(path_to_show);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
buf->Put("\n");
|
|
Packit Service |
a2489d |
return FinderJob::ProcessFile(d,fi);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FinderJob_List::FinderJob_List(FileAccess *s,ArgV *a,FDStream *o)
|
|
Packit Service |
a2489d |
: FinderJob(s), args(a), long_listing(false)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(o)
|
|
Packit Service |
a2489d |
buf=new IOBufferFDStream(o,IOBuffer::PUT);
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
buf=new IOBuffer_STDOUT(this);
|
|
Packit Service |
a2489d |
show_sl = !o || !o->usesfd(1);
|
|
Packit Service |
a2489d |
NextDir(a->getcurr());
|
|
Packit Service |
a2489d |
ValidateArgs();
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void FinderJob_List::Finish()
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
const char *d=args->getnext();
|
|
Packit Service |
a2489d |
if(!d) {
|
|
Packit Service |
a2489d |
buf->PutEOF();
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
NextDir(d);
|
|
Packit Service |
a2489d |
}
|