summaryrefslogtreecommitdiff
path: root/packages/busybox/files/install-should-unlink-dest-if-it-exists.patch
blob: 4bec313f0e200cdf2d2da14e639100367024810c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
---
 coreutils/install.c |    2 +-
 include/libbb.h     |    3 ++-
 libbb/copy_file.c   |    9 +++++++++
 3 files changed, 12 insertions(+), 2 deletions(-)

Index: busybox-1.2.1/coreutils/install.c
===================================================================
--- busybox-1.2.1.orig/coreutils/install.c	2006-10-19 16:33:48.000000000 +0200
+++ busybox-1.2.1/coreutils/install.c	2006-10-19 16:35:58.000000000 +0200
@@ -59,7 +59,7 @@ int install_main(int argc, char **argv)
 	char *gid_str = "-1";
 	char *uid_str = "-1";
 	char *mode_str = "0755";
-	int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE;
+	int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE | FILEUTILS_NO_TRUNC;
 	int ret = EXIT_SUCCESS, flags, i, isdir;
 
 #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS
Index: busybox-1.2.1/include/libbb.h
===================================================================
--- busybox-1.2.1.orig/include/libbb.h	2006-10-19 16:24:50.000000000 +0200
+++ busybox-1.2.1/include/libbb.h	2006-10-19 16:32:40.000000000 +0200
@@ -345,7 +345,8 @@ enum {	/* DO NOT CHANGE THESE VALUES!  c
 	FILEUTILS_DEREFERENCE = 2,
 	FILEUTILS_RECUR = 4,
 	FILEUTILS_FORCE = 8,
-	FILEUTILS_INTERACTIVE = 16
+	FILEUTILS_INTERACTIVE = 16,
+	FILEUTILS_NO_TRUNC = 32
 };
 
 extern const char *bb_applet_name;
Index: busybox-1.2.1/libbb/copy_file.c
===================================================================
--- busybox-1.2.1.orig/libbb/copy_file.c	2006-10-19 16:26:53.000000000 +0200
+++ busybox-1.2.1/libbb/copy_file.c	2006-10-19 16:32:28.000000000 +0200
@@ -136,6 +136,15 @@ int copy_file(const char *source, const 
 				}
 			}
 
+			if (flags & FILEUTILS_NO_TRUNC) {
+				if (unlink(dest) < 0) {
+					bb_perror_msg("unable to remove `%s'", dest);
+					close(src_fd);
+					return -1;
+				}
+				goto dest_removed;
+			}
+
 			dst_fd = open(dest, O_WRONLY|O_TRUNC);
 			if (dst_fd == -1) {
 				if (!(flags & FILEUTILS_FORCE)) {