Sync our rm -P option with OpenBSD - if the file has a hardlink count
authorMatthew Dillon <dillon@dragonflybsd.org>
Sun, 5 Nov 2006 02:26:39 +0000 (02:26 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sun, 5 Nov 2006 02:26:39 +0000 (02:26 +0000)
greater then one do not overwrite it or remove it, and issue a warning.

bin/rm/rm.1
bin/rm/rm.c

index 449bf78..adc1b52 100644 (file)
@@ -34,7 +34,7 @@
 .\"
 .\"    @(#)rm.1        8.5 (Berkeley) 12/5/94
 .\" $FreeBSD: src/bin/rm/rm.1,v 1.19.2.6 2003/02/04 22:10:42 trhodes Exp $
-.\" $DragonFly: src/bin/rm/rm.1,v 1.7 2006/02/17 19:33:31 swildner Exp $
+.\" $DragonFly: src/bin/rm/rm.1,v 1.8 2006/11/05 02:26:39 dillon Exp $
 .\"
 .Dd January 28, 1999
 .Dt RM 1
@@ -92,7 +92,10 @@ yet provides almost the same level of protection against mistakes.
 .It Fl P
 Overwrite regular files before deleting them.
 Files are overwritten three times, first with the byte pattern 0xff,
-then 0x00, and then 0xff again, before they are deleted.
+then 0x00, and then 0xff again, before they are deleted. 
+.Pp
+A file with a link count greater then one will neither be overwritten or
+removed, and a warning will be issued.
 .It Fl R
 Attempt to remove the file hierarchy rooted in each file argument.
 The
@@ -211,4 +214,6 @@ option assumes that the underlying file system is a fixed-block file
 system.
 UFS is a fixed-block file system, LFS is not.
 In addition, only regular files are overwritten, other types of files
-are not.
+are not.  Hardlinked regular files will not be overwritten or removed,
+possibly leading to unintended behavior.  It is arguable which is the MORE
+unintended behavior.
index c88a6ab..6c95358 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1990, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)rm.c    8.5 (Berkeley) 4/18/94
  * $FreeBSD: src/bin/rm/rm.c,v 1.29.2.5 2002/07/12 07:25:48 tjr Exp $
- * $DragonFly: src/bin/rm/rm.c,v 1.16 2006/06/19 12:08:25 corecode Exp $
+ * $DragonFly: src/bin/rm/rm.c,v 1.17 2006/11/05 02:26:39 dillon Exp $
  */
 
 #include <sys/stat.h>
@@ -403,6 +403,11 @@ rm_overwrite(const char *file, struct stat *sbp)
                warnx("%s: cannot overwrite a non-regular file", file);
                return (1);
        }
+       if (sbp->st_nlink > 1) {
+               warnx("%s (inode %u): not overwritten due to multiple links",
+                     file, sbp->st_ino);
+               return (0);
+       }
        if ((fd = open(file, O_WRONLY, 0)) == -1)
                goto err;
        if (fstatfs(fd, &fsb) == -1)