[BusyBox-cvs] svn commit: trunk/busybox/coreutils

landley at busybox.net landley at busybox.net
Fri Apr 29 22:13:04 UTC 2005


Author: landley
Date: 2005-04-29 16:13:04 -0600 (Fri, 29 Apr 2005)
New Revision: 10202

Log:
Patch from Matthew S. Wood:
> The following patch adds support for the -S and -b flags to `ln'.  These
> flags [especially -b] are used extensively in Debian pre and post
> installation scripts.

Comments from Vladimir Oleynik influenced the final patch, and I also ripped
out the in-file changelog since it belongs here.  At the time, it said:

/* Apr 15, 2004      Matthew S. Wood    (mwood at realmsys.com)
 *
 * Implement '-b' (backup) flag.
 * Implement '-S' (backup suffix) flag.
 *
 *
 * Mar 16, 2003      Manuel Novoa III   (mjn3 at codepoet.org)
 *
 * Fixed bug involving -n option.  Essentially, -n was always in effect.
 */




Modified:
   trunk/busybox/coreutils/ln.c


Changeset:
Modified: trunk/busybox/coreutils/ln.c
===================================================================
--- trunk/busybox/coreutils/ln.c	2005-04-29 19:48:29 UTC (rev 10201)
+++ trunk/busybox/coreutils/ln.c	2005-04-29 22:13:04 UTC (rev 10202)
@@ -21,21 +21,20 @@
  */
 
 /* BB_AUDIT SUSv3 compliant */
-/* BB_AUDIT GNU options missing: -b, -d, -F, -i, -S, and -v. */
+/* BB_AUDIT GNU options missing: -d, -F, -i, and -v. */
 /* http://www.opengroup.org/onlinepubs/007904975/utilities/ln.html */
 
-/* Mar 16, 2003      Manuel Novoa III   (mjn3 at codepoet.org)
- *
- * Fixed bug involving -n option.  Essentially, -n was always in effect.
- */
-
+#include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <errno.h>
 #include "busybox.h"
 
 #define LN_SYMLINK          1
 #define LN_FORCE            2
 #define LN_NODEREFERENCE    4
+#define LN_BACKUP           8
+#define LN_SUFFIX           16
 
 extern int ln_main(int argc, char **argv)
 {
@@ -44,10 +43,11 @@
 	char *last;
 	char *src_name;
 	char *src;
+	char *suffix = "~";
 	struct stat statbuf;
 	int (*link_func)(const char *, const char *);
 
-	flag = bb_getopt_ulflags(argc, argv, "sfn");
+	flag = bb_getopt_ulflags(argc, argv, "sfnbS:", &suffix);
 
 	if (argc == optind) {
 		bb_show_usage();
@@ -80,7 +80,23 @@
 			continue;
 		}
 
-		if (flag & LN_FORCE) {
+		if (flag & LN_BACKUP) {
+				char *backup = NULL;
+				bb_xasprintf(&backup, "%s%s", src, suffix);
+				if (rename(src, backup) < 0 && errno != ENOENT) {
+						bb_perror_msg(src);
+						status = EXIT_FAILURE;
+						free(backup);
+						continue;
+				}
+				free(backup);
+				/*
+				 * When the source and dest are both hard links to the same
+				 * inode, a rename may succeed even though nothing happened.
+				 * Therefore, always unlink().
+				 */
+				unlink(src);
+		} else if (flag & LN_FORCE) {
 			unlink(src);
 		}
 




More information about the busybox-cvs mailing list