franck.eyraud | 5 Dec 2011 15:16
Picon

Re: Follow local symlinks when mirroring

On 05/12/2011 13:47, franck.eyraud <at> jrc.ec.europa.eu wrote:
> (I could try to contribute, if you think it would require few changes, 
> but I didn't work with c/c++ for a long time)
I anyway had a curious look at the source code; I noticed at line 349 of 
MirrorJob.cc the following code :

          if(target_is_local && !script_only)
          {
             if(lstat(target_name,&st)!=-1)
             {
                if(S_ISDIR(st.st_mode))
                {
                   chmod(target_name,st.st_mode|0700);
                   create_target_dir=false;
                }
                else
                {
                   Report(_("Removing old local file `%s'"),
                            dir_file(target_relative_dir,file->name));
                   if(remove(target_name)==-1)
                   {
                      eprintf("mirror: remove(%s): 
%s\n",target_name,strerror(errno));
                      goto skip;
                   }
                   create_target_dir=true;
                }
             }
          }

The S_ISDIR at line 353 test doesn't take into acount the case where the 
target file is a link and the links points to a directory, which would 
suits more my case. In fact, since the whole code above is executed only 
when !script_only, I realized that running mirror --script=script.lft 
and then lftp -c script.lftp, it mirrors correctly (but I'm loosing the 
possibility of parallel downloads). So lftp is able to follow the links, 
it is just that is decides a priori to delete them.
However, I'm not quite sure yet how to handle the "target is link and 
link points to a directory" test in C++, and don't have time now.

How that helps,

Franck
_______________________________________________
lftp mailing list
lftp <at> uniyar.ac.ru
http://univ.uniyar.ac.ru/mailman/listinfo/lftp


Gmane