tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Adding -l option to cp
Am 22.01.11 23:44, schrieb D'Arcy J.M. Cain:
> I find the -l option in FreeBSD extremely usefule and find myself
> installing coreutils on NetBSD just to get the GNU cp. It would be
> nice to add this to NetBSD. Would anyone object if I applied the
> following patch?
I object indeed if the same can be done with pax.
>
> Index: cp.1
> ===================================================================
> RCS file: /cvsroot/src/bin/cp/cp.1,v
> retrieving revision 1.33
> diff -u -r1.33 cp.1
> --- cp.1 22 Dec 2010 09:02:32 -0000 1.33
> +++ cp.1 22 Jan 2011 22:38:21 -0000
> @@ -111,6 +111,9 @@
> .It Fl P
> No symbolic links are followed.
> This is the default.
> +.It Fl l
> +Create hard links to regular files in a hierarchy instead of copying.
> +.It Fl n
> .It Fl p
> Causes
> .Nm
> Index: cp.c
> ===================================================================
> RCS file: /cvsroot/src/bin/cp/cp.c,v
> retrieving revision 1.54
> diff -u -r1.54 cp.c
> --- cp.c 21 Dec 2010 20:56:01 -0000 1.54
> +++ cp.c 22 Jan 2011 22:38:22 -0000
> @@ -86,7 +86,7 @@
> PATH_T to = { .p_end = to.p_path, .target_end = empty };
>
> uid_t myuid;
> -int Hflag, Lflag, Rflag, Pflag, fflag, iflag, pflag, rflag, vflag, Nflag;
> +int Hflag, Lflag, Rflag, Pflag, fflag, iflag, lflag, pflag, rflag, vflag,
> Nflag;
> mode_t myumask;
>
> enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE };
> @@ -106,7 +106,7 @@
> (void)setlocale(LC_ALL, "");
>
> Hflag = Lflag = Pflag = Rflag = 0;
> - while ((ch = getopt(argc, argv, "HLNPRfaiprv")) != -1)
> + while ((ch = getopt(argc, argv, "HLNPRfailprv")) != -1)
> switch (ch) {
> case 'H':
> Hflag = 1;
> @@ -140,6 +140,9 @@
> iflag = isatty(fileno(stdin));
> fflag = 0;
> break;
> + case 'l':
> + lflag = 1;
> + break;
> case 'p':
> pflag = 1;
> break;
> Index: extern.h
> ===================================================================
> RCS file: /cvsroot/src/bin/cp/extern.h,v
> retrieving revision 1.15
> diff -u -r1.15 extern.h
> --- extern.h 16 Jul 2006 16:22:24 -0000 1.15
> +++ extern.h 22 Jan 2011 22:38:22 -0000
> @@ -42,7 +42,7 @@
>
> extern PATH_T to;
> extern uid_t myuid;
> -extern int Rflag, rflag, Hflag, Lflag, Pflag, fflag, iflag, pflag, Nflag;
> +extern int Rflag, rflag, Hflag, Lflag, Pflag, fflag, iflag, lflag, pflag,
> Nflag;
> extern mode_t myumask;
>
> #include <sys/cdefs.h>
> Index: utils.c
> ===================================================================
> RCS file: /cvsroot/src/bin/cp/utils.c,v
> retrieving revision 1.38
> diff -u -r1.38 utils.c
> --- utils.c 4 Jan 2011 10:35:10 -0000 1.38
> +++ utils.c 22 Jan 2011 22:38:22 -0000
> @@ -145,11 +145,23 @@
>
> rval = 0;
>
> + /* if hard linking then simply close the open fds, link and return */
> + if (lflag) {
> + (void)close(from_fd);
> + (void)close(to_fd);
> + (void)unlink(to.p_path);
> + if (link(entp->fts_path, to.p_path)) {
> + warn("%s", to.p_path);
> + return (1);
> + }
> + return (0);
> + }
> + /* NOTREACHED */
> +
> /*
> * There's no reason to do anything other than close the file
> * now if it's empty, so let's not bother.
> */
> -
> if (fs->st_size > 0) {
> /*
> * Mmap and write if less than 8M (the limit is so
> @@ -192,6 +204,7 @@
> remainder -= chunk;
> } while (remainder > 0);
>
> + /* Some systems don't unmap on close(2). */
> if (munmap(p, fsize) < 0) {
> warn("%s", entp->fts_path);
> rval = 1;
> @@ -215,8 +228,9 @@
> }
> }
>
> + (void)close(from_fd);
> +
> if (rval == 1) {
> - (void)close(from_fd);
> (void)close(to_fd);
> return (1);
> }
> @@ -240,7 +254,6 @@
> rval = 1;
> }
> }
> - (void)close(from_fd);
> if (close(to_fd)) {
> warn("%s", to.p_path);
> rval = 1;
> @@ -368,8 +381,8 @@
> usage(void)
> {
> (void)fprintf(stderr,
> - "usage: %s [-R [-H | -L | -P]] [-f | -i] [-aNpv] src target\n"
> - " %s [-R [-H | -L | -P]] [-f | -i] [-aNpv] src1 ... srcN
> directory\n",
> + "usage: %s [-R [-H | -L | -P]] [-f | -i] [-aNlpv] src target\n"
> + " %s [-R [-H | -L | -P]] [-f | -i] [-aNlpv] src1 ... srcN
> directory\n",
> getprogname(), getprogname());
> exit(1);
> /* NOTREACHED */
>
Home |
Main Index |
Thread Index |
Old Index