On Thu, Aug 30, 2018 at 09:02:22PM +0200, Martijn van Duren wrote:
> Hello tech@,
>
> Don't know if this is too much magic numbers for copy_file, but this
> "fixes" the case where we print the verbose line, even if we don't copy
> it. This doesn't not happen in mv or rm.
>
> Note that the current implementation also doesn't show a successful
> copy of a fifo or special if a prior copy failed:
> $ touch /tmp/test1
> $ mkfifo /tmp/test2
> $ chmod 0 /tmp/test1
> $ cp -Rv /tmp/test* /tmp/tmp/
> cp: /tmp/test1: Permission denied
> $ ls /tmp/tmp
> test2
> $ ./obj/cp -Rv /tmp/test* /tmp/tmp/
> cp: /tmp/test1: Permission denied
> /tmp/test2 -> /tmp/tmp/test2
>
> OK?
ok stsp@
>
> martijn@
>
> Index: cp.c
> ===================================================================
> RCS file: /cvs/src/bin/cp/cp.c,v
> retrieving revision 1.46
> diff -u -p -r1.46 cp.c
> --- cp.c 27 Jun 2017 21:49:47 -0000 1.46
> +++ cp.c 30 Aug 2018 18:43:26 -0000
> @@ -264,7 +264,7 @@ copy(char *argv[], enum op type, int fts
> struct stat to_stat;
> FTS *ftsp;
> FTSENT *curr;
> - int base, nlen, rval;
> + int base, cval, nlen, rval;
> char *p, *target_mid;
> base = 0;
>
> @@ -434,32 +434,35 @@ copy(char *argv[], enum op type, int fts
> !fts_dne(curr)))
> rval = 1;
> } else
> - if (copy_file(curr, fts_dne(curr)))
> + if ((cval = copy_file(curr, fts_dne(curr))) ==
> 1)
> rval = 1;
> - if (!rval && vflag)
> + if (!cval && vflag)
> (void)fprintf(stdout, "%s -> %s\n",
> curr->fts_path, to.p_path);
> + cval = 0;
> break;
> case S_IFIFO:
> if (Rflag) {
> if (copy_fifo(curr->fts_statp, !fts_dne(curr)))
> rval = 1;
> } else
> - if (copy_file(curr, fts_dne(curr)))
> + if ((cval = copy_file(curr, fts_dne(curr))) ==
> 1)
> rval = 1;
> - if (!rval && vflag)
> + if (!cval && vflag)
> (void)fprintf(stdout, "%s -> %s\n",
> curr->fts_path, to.p_path);
> + cval = 0;
> break;
> case S_IFSOCK:
> warnc(EOPNOTSUPP, "%s", curr->fts_path);
> break;
> default:
> - if (copy_file(curr, fts_dne(curr)))
> + if ((cval = copy_file(curr, fts_dne(curr))) == 1)
> rval = 1;
> - else if (vflag)
> + if (!cval && vflag)
> (void)fprintf(stdout, "%s -> %s\n",
> curr->fts_path, to.p_path);
> + cval = 0;
> break;
> }
> }
> Index: utils.c
> ===================================================================
> RCS file: /cvs/src/bin/cp/utils.c,v
> retrieving revision 1.40
> diff -u -p -r1.40 utils.c
> --- utils.c 27 Jun 2017 21:43:46 -0000 1.40
> +++ utils.c 30 Aug 2018 18:43:26 -0000
> @@ -99,7 +99,7 @@ copy_file(FTSENT *entp, int dne)
> ch = getchar();
> if (checkch != 'y' && checkch != 'Y') {
> (void)close(from_fd);
> - return (0);
> + return (2);
> }
> }
> to_fd = open(to.p_path, O_WRONLY | O_TRUNC, 0);
>