On Wed, Apr 07, 2021 at 12:50:15PM +0200, Claudio Jeker wrote:
> In some cases unlink reports 'no such file or directory' when the RRDP
> repository is merged at the end of a RRDP sync.
> The problem is that some deleted files are in the temporary location and
> not part of the real repo. Because of this if unlink return ENOENT then
> try the alternate location.
> 
> While there cleanup the code a bit more and make the rename() and unlink()
> case similar when it comes to the path generation bits.
> 
> With this I no longer see the unlink errors.
> OK?

ok tb

> -- 
> :wq Claudio
> 
> Index: repo.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/repo.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 repo.c
> --- repo.c    2 Apr 2021 05:16:29 -0000       1.3
> +++ repo.c    7 Apr 2021 09:01:59 -0000
> @@ -838,22 +838,37 @@ rrdp_merge_repo(struct rrdprepo *rr)
>  
>       /* XXX should delay deletes */
>       RB_FOREACH_SAFE(fp, filepath_tree, &rr->deleted, nfp) {
> -             if ((fn = rrdp_filename(rr, fp->file, 0)) != NULL) {
> -                     if (unlink(fn) == -1)
> -                             warn("%s: unlink", fn);
> -                     free(fn);
> +             fn = rrdp_filename(rr, fp->file, 1);
> +             rfn = rrdp_filename(rr, fp->file, 0);
> +
> +             if (fn == NULL || rfn == NULL)
> +                     errx(1, "bad filepath");        /* should not happen */
> +
> +             if (unlink(rfn) == -1) {
> +                     if (errno == ENOENT) {
> +                             if (unlink(fn) == -1)
> +                                     warn("%s: unlink", fn);
> +                     } else
> +                             warn("%s: unlink", rfn);
>               }
> +
> +             free(rfn);
> +             free(fn);
>               filepath_put(&rr->deleted, fp);
>       }
>  
>       RB_FOREACH_SAFE(fp, filepath_tree, &rr->added, nfp) {
> -             if ((fn = rrdp_filename(rr, fp->file, 1)) != NULL &&
> -                 (rfn = rrdp_filename(rr, fp->file, 0)) != NULL) {
> -                     repo_mkpath(rfn);
> -                     if (rename(fn, rfn) == -1)
> -                             warn("%s: link", rfn);
> -                     free(rfn);
> -             }
> +             fn = rrdp_filename(rr, fp->file, 1);
> +             rfn = rrdp_filename(rr, fp->file, 0);
> +
> +             if (fn == NULL || rfn == NULL)
> +                     errx(1, "bad filepath");        /* should not happen */
> +
> +             repo_mkpath(rfn);
> +             if (rename(fn, rfn) == -1)
> +                     warn("%s: rename", rfn);
> +
> +             free(rfn);
>               free(fn);
>               filepath_put(&rr->added, fp);
>       }
> 

Reply via email to