Some improvements to rm(1)
Brooks Davis
brooks at freebsd.org
Fri Apr 26 02:50:48 UTC 2013
On Thu, Apr 25, 2013 at 10:16:32PM -0400, Eitan Adler wrote:
> Anyone have thoughts on the following?
>
> commit 82c78ba923d8ce4a1bfbb309658c49021c8bb384
> Author: Eitan Adler <lists at 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
The no-op changes look more correct to me.
I think the -x option seems a bit odd. What is the use case? At a
first thought, it seems to raise more questions than it resolves.
-- Brooks
> 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 at 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
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 188 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20130425/b4f5544f/attachment.sig>
More information about the freebsd-hackers
mailing list