Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Apr 2013 22:16:32 -0400
From:      Eitan Adler <lists@eitanadler.com>
To:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Some improvements to rm(1)
Message-ID:  <CAF6rxg=5aAyk88KcbuGhG1Nwn5HdYqMiaT7umX2EOLApDwOk4Q@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Anyone have thoughts on the following?

commit 82c78ba923d8ce4a1bfbb309658c49021c8bb384
Author: Eitan Adler <lists@eitanadler.com>
Date:   Thu Apr 25 22:14:49 2013 -0400

    Take some improvements from DragonFlyBSD:
    	- add const where appropriate
    	- add static where appropriate
    	- fix a whitespace issues

    Obtained from:	DragonFlyBSD

diff --git a/bin/rm/rm.c b/bin/rm/rm.c
index 1014921..660042b 100644
--- a/bin/rm/rm.c
+++ b/bin/rm/rm.c
@@ -63,15 +63,15 @@ static int rflag, Iflag, xflag;
 static uid_t uid;
 static volatile sig_atomic_t info;

-int	check(char *, char *, struct stat *);
-int	check2(char **);
-void	checkdot(char **);
-void	checkslash(char **);
-void	rm_file(char **);
-int	rm_overwrite(char *, struct stat *);
-void	rm_tree(char **);
+static int	check(const char *, const char *, struct stat *);
+static int	check2(char **);
+static void	checkdot(char **);
+static void	checkslash(char **);
+static void	rm_file(char **);
+static int	rm_overwrite(const char *, struct stat *);
+static void	rm_tree(char **);
 static void siginfo(int __unused);
-void	usage(void);
+static void	usage(void);

 /*
  * rm --
@@ -173,7 +173,7 @@ main(int argc, char *argv[])
 	exit (eval);
 }

-void
+static void
 rm_tree(char **argv)
 {
 	FTS *fts;
@@ -418,7 +418,7 @@ rm_file(char **argv)
  * have kernel support.
  */
 int
-rm_overwrite(char *file, struct stat *sbp)
+rm_overwrite(const char *file, struct stat *sbp)
 {
 	struct stat sb, sb2;
 	struct statfs fsb;
@@ -484,8 +484,8 @@ err:	eval = 1;
 }


-int
-check(char *path, char *name, struct stat *sp)
+static int
+check(const char *path, const char *name, struct stat *sp)
 {
 	int ch, first;
 	char modep[15], *flagsp;
@@ -496,7 +496,7 @@ check(char *path, char *name, struct stat *sp)
 	else {
 		/*
 		 * If it's not a symbolic link and it's unwritable and we're
-		 * talking to a terminal, ask.	Symbolic links are excluded
+		 * talking to a terminal, ask.  Symbolic links are excluded
 		 * because their permissions are meaningless.  Check stdin_ok
 		 * first because we may not have stat'ed the file.
 		 */
@@ -529,7 +529,7 @@ check(char *path, char *name, struct stat *sp)
 }

 #define ISSLASH(a)	((a)[0] == '/' && (a)[1] == '\0')
-void
+static void
 checkslash(char **argv)
 {
 	char **t, **u;
@@ -549,7 +549,7 @@ checkslash(char **argv)
 	}
 }

-int
+static int
 check2(char **argv)
 {
 	struct stat st;
@@ -600,7 +600,7 @@ check2(char **argv)
 }

 #define ISDOT(a)	((a)[0] == '.' && (!(a)[1] || ((a)[1] == '.' && !(a)[2])))
-void
+static void
 checkdot(char **argv)
 {
 	char *p, **save, **t;
@@ -624,7 +624,7 @@ checkdot(char **argv)
 	}
 }

-void
+static void
 usage(void)
 {


commit 4799c480694b379f73483998e11341bffd3ffa3e
Author: Eitan Adler <lists@eitanadler.com>
Date:   Thu Apr 25 22:03:28 2013 -0400

    Add -x option to avoid crossing mount points when removing a hierarchy.

    Inspired by:	DragonflyBSD

diff --git a/bin/rm/rm.1 b/bin/rm/rm.1
index 3588f38..824b627 100644
--- a/bin/rm/rm.1
+++ b/bin/rm/rm.1
@@ -32,7 +32,7 @@
 .\"	@(#)rm.1	8.5 (Berkeley) 12/5/94
 .\" $FreeBSD$
 .\"
-.Dd March 15, 2013
+.Dd April 25, 2013
 .Dt RM 1
 .Os
 .Sh NAME
@@ -42,7 +42,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl f | i
-.Op Fl dIPRrvW
+.Op Fl dIPRrvWx
 .Ar
 .Nm unlink
 .Ar file
@@ -132,6 +132,8 @@ Attempt to undelete the named files.
 Currently, this option can only be used to recover
 files covered by whiteouts in a union file system (see
 .Xr undelete 2 ) .
+.It Fl x
+When removing a hierarchy, do not cross mount points.
 .El
 .Pp
 The
diff --git a/bin/rm/rm.c b/bin/rm/rm.c
index a450057..1014921 100644
--- a/bin/rm/rm.c
+++ b/bin/rm/rm.c
@@ -59,7 +59,7 @@ __FBSDID("$FreeBSD$");
 #include <unistd.h>

 static int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok;
-static int rflag, Iflag;
+static int rflag, Iflag, xflag;
 static uid_t uid;
 static volatile sig_atomic_t info;

@@ -106,8 +106,8 @@ main(int argc, char *argv[])
 		exit(eval);
 	}

-	Pflag = rflag = 0;
-	while ((ch = getopt(argc, argv, "dfiIPRrvW")) != -1)
+	Pflag = rflag = xflag = 0;
+	while ((ch = getopt(argc, argv, "dfiIPRrvWx")) != -1)
 		switch(ch) {
 		case 'd':
 			dflag = 1;
@@ -136,6 +136,9 @@ main(int argc, char *argv[])
 		case 'W':
 			Wflag = 1;
 			break;
+		case 'x':
+			xflag = 1;
+			break;
 		default:
 			usage();
 		}
@@ -196,6 +199,8 @@ rm_tree(char **argv)
 		flags |= FTS_NOSTAT;
 	if (Wflag)
 		flags |= FTS_WHITEOUT;
+	if (xflag)
+		flags |= FTS_XDEV;
 	if (!(fts = fts_open(argv, flags, NULL))) {
 		if (fflag && errno == ENOENT)
 			return;
@@ -624,7 +629,7 @@ usage(void)
 {

 	(void)fprintf(stderr, "%s\n%s\n",
-	    "usage: rm [-f | -i] [-dIPRrvW] file ...",
+	    "usage: rm [-f | -i] [-dIPRrvWx] file ...",
 	    "       unlink file");
 	exit(EX_USAGE);
 }


-- 
Eitan Adler



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAF6rxg=5aAyk88KcbuGhG1Nwn5HdYqMiaT7umX2EOLApDwOk4Q>