Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Dec 2002 00:35:34 +0900
From:      "Akinori MUSHA" <knu@iDaemons.org>
To:        audit@FreeBSD.org
Subject:   cp -l
Message-ID:  <86lm2jjsft.wl@archon.local.idaemons.org>

next in thread | raw e-mail | index | archive | help
Hi,

What about cp -l a la GNU cp?

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"I believe in what I see, I believe in what I hear,
   I believe that what I'm feeling changes how the world appears."

Index: cp.1
===================================================================
RCS file: /home/ncvs/src/bin/cp/cp.1,v
retrieving revision 1.25
diff -u -r1.25 cp.1
--- cp.1	16 Aug 2002 03:13:59 -0000	1.25
+++ cp.1	16 Nov 2002 22:37:38 -0000
@@ -48,7 +48,7 @@
 .Op Fl H | Fl L | Fl P
 .Oc
 .Op Fl f | i | n
-.Op Fl pv
+.Op Fl lpv
 .Ar source_file target_file
 .Nm
 .Oo
@@ -56,7 +56,7 @@
 .Op Fl H | Fl L | Fl P
 .Oc
 .Op Fl f | i | n
-.Op Fl pv
+.Op Fl lpv
 .Ar source_file ... target_directory
 .Sh DESCRIPTION
 In the first synopsis form, the
@@ -141,6 +141,8 @@
 or
 .Fl n
 options.)
+.It Fl l
+Link files instead of copying.
 .It Fl n
 Do not overwrite an existing file.
 (The
@@ -238,7 +240,8 @@
 or fifo's.
 .Pp
 The
-.Fl v
+.Fl v ,
+.Fl l
 and
 .Fl n
 options are non-standard and their use in scripts is not recommended.
Index: cp.c
===================================================================
RCS file: /home/ncvs/src/bin/cp/cp.c,v
retrieving revision 1.43
diff -u -r1.43 cp.c
--- cp.c	18 Oct 2002 14:44:59 -0000	1.43
+++ cp.c	16 Nov 2002 22:20:46 -0000
@@ -86,7 +86,7 @@
 
 PATH_T to = { to.p_path, emptystring, "" };
 
-int fflag, iflag, nflag, pflag, vflag;
+int fflag, iflag, lflag, nflag, pflag, vflag;
 static int Rflag, rflag;
 
 enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE };
@@ -103,7 +103,7 @@
 	char *target;
 
 	Hflag = Lflag = Pflag = 0;
-	while ((ch = getopt(argc, argv, "HLPRfinprv")) != -1)
+	while ((ch = getopt(argc, argv, "HLPRfilnprv")) != -1)
 		switch (ch) {
 		case 'H':
 			Hflag = 1;
@@ -127,6 +127,9 @@
 		case 'i':
 			iflag = 1;
 			fflag = nflag = 0;
+			break;
+		case 'l':
+			lflag = 1;
 			break;
 		case 'n':
 			nflag = 1;
Index: extern.h
===================================================================
RCS file: /home/ncvs/src/bin/cp/extern.h,v
retrieving revision 1.16
diff -u -r1.16 extern.h
--- extern.h	18 Oct 2002 14:44:59 -0000	1.16
+++ extern.h	16 Nov 2002 22:20:39 -0000
@@ -41,7 +41,7 @@
 } PATH_T;
 
 extern PATH_T to;
-extern int fflag, iflag, nflag, pflag, vflag;
+extern int fflag, iflag, lflag, nflag, pflag, vflag;
 
 __BEGIN_DECLS
 int	copy_fifo(struct stat *, int);
Index: utils.c
===================================================================
RCS file: /home/ncvs/src/bin/cp/utils.c,v
retrieving revision 1.39
diff -u -r1.39 utils.c
--- utils.c	18 Oct 2002 14:45:00 -0000	1.39
+++ utils.c	17 Nov 2002 05:32:26 -0000
@@ -70,7 +70,9 @@
 	char *p;
 #endif
 
-	if ((from_fd = open(entp->fts_path, O_RDONLY, 0)) == -1) {
+	if (lflag)
+		from_fd = -1;
+	else if ((from_fd = open(entp->fts_path, O_RDONLY, 0)) == -1) {
 		warn("%s", entp->fts_path);
 		return (1);
 	}
@@ -104,24 +106,35 @@
 			}
 		}
 		
-		if (fflag) {
+		if (fflag || lflag) {
 		    /* remove existing destination file name, 
 		     * create a new file  */
 		    (void)unlink(to.p_path);
-		    to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
-				 fs->st_mode & ~(S_ISUID | S_ISGID));
+		    if (lflag)
+			to_fd = link(entp->fts_path, to.p_path);
+		    else
+			to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
+				     fs->st_mode & ~(S_ISUID | S_ISGID));
 		} else 
 		    /* overwrite existing destination file name */
 		    to_fd = open(to.p_path, O_WRONLY | O_TRUNC, 0);
-	} else
-		to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
-		    fs->st_mode & ~(S_ISUID | S_ISGID));
+	} else {
+		if (lflag)
+		    to_fd = link(entp->fts_path, to.p_path);
+		else
+		    to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
+			fs->st_mode & ~(S_ISUID | S_ISGID));
+	}
 
 	if (to_fd == -1) {
 		warn("%s", to.p_path);
-		(void)close(from_fd);
+		if (from_fd != -1)
+		    (void)close(from_fd);
 		return (1);
 	}
+
+	if (lflag)
+	    return 0;
 
 	rval = 0;
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86lm2jjsft.wl>