On Sun, Aug 23, 2015 at 07:38:15AM -0400, Ted Unangst wrote:
> Theo Buehler wrote:
> > @@ -401,9 +401,10 @@ checkdot(char **argv)
> > else
> > p = *t;
> >
> > - if (ISDOT(p)) {
> > + if (ISDOT(p) || *p == '\0') {
> > if (!complained++)
> > - warnx("\".\" and \"..\" may not be removed");
> > + warnx("\"/\", \".\" and \"..\" may not be "
> > + "removed");
> > eval = 1;
> > for (save = t; (t[0] = t[1]) != NULL; ++t)
> > continue;
> >
>
> I think separate error messages are appriate. The one about dots should not be
> cluttered with this.
Do I miss something simpler?
Index: bin/rm/rm.1
===================================================================
RCS file: /var/cvs/src/bin/rm/rm.1,v
retrieving revision 1.37
diff -u -p -r1.37 rm.1
--- bin/rm/rm.1 25 May 2014 19:07:36 -0000 1.37
+++ bin/rm/rm.1 22 Aug 2015 21:49:02 -0000
@@ -102,6 +102,7 @@ The
utility removes symbolic links, not the files referenced by the links.
.Pp
It is an error to attempt to remove the files
+.Dq / ,
.Dq \&.
or
.Dq .. .
Index: bin/rm/rm.c
===================================================================
RCS file: /var/cvs/src/bin/rm/rm.c,v
retrieving revision 1.30
diff -u -p -r1.30 rm.c
--- bin/rm/rm.c 16 Jan 2015 06:39:32 -0000 1.30
+++ bin/rm/rm.c 23 Aug 2015 11:52:28 -0000
@@ -54,7 +54,7 @@ extern char *__progname;
int dflag, eval, fflag, iflag, Pflag, stdin_ok;
int check(char *, char *, struct stat *);
-void checkdot(char **);
+void checkdotorslash(char **);
void rm_file(char **);
int rm_overwrite(char *, struct stat *);
int pass(int, off_t, char *, size_t);
@@ -105,7 +105,7 @@ main(int argc, char *argv[])
if (argc < 1 && fflag == 0)
usage();
- checkdot(argv);
+ checkdotorslash(argv);
if (*argv) {
stdin_ok = isatty(STDIN_FILENO);
@@ -383,12 +383,12 @@ check(char *path, char *name, struct sta
*/
#define ISDOT(a) ((a)[0] == '.' && (!(a)[1] || ((a)[1] == '.' &&
!(a)[2])))
void
-checkdot(char **argv)
+checkdotorslash(char **argv)
{
char *p, **save, **t;
- int complained;
+ int dotcomplained, slashcomplained;
- complained = 0;
+ dotcomplained = slashcomplained = 0;
for (t = argv; *t;) {
/* strip trailing slashes */
p = strrchr (*t, '\0');
@@ -402,14 +402,20 @@ checkdot(char **argv)
p = *t;
if (ISDOT(p)) {
- if (!complained++)
+ if (!dotcomplained++)
warnx("\".\" and \"..\" may not be removed");
- eval = 1;
- for (save = t; (t[0] = t[1]) != NULL; ++t)
- continue;
- t = save;
- } else
+ } else if (*p == '\0') {
+ if (!slashcomplained++)
+ warnx("\"/\" may not be removed");
+ } else {
++t;
+ continue;
+ }
+
+ eval = 1;
+ for (save = t; (t[0] = t[1]) != NULL; ++t)
+ continue;
+ t = save;
}
}