(is_empty_dir): Open with O_NDELAY, so we don't hang, e.g., on a named pipe.
[platform/upstream/coreutils.git] / src / remove.c
1 /* remove.c -- core functions for removing files and directories
2    Copyright (C) 88, 90, 91, 1994-2005 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software Foundation,
16    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18 /* Extracted from rm.c and librarified, then rewritten by Jim Meyering.  */
19
20 #include <config.h>
21 #include <stdio.h>
22 #include <sys/types.h>
23 #include <setjmp.h>
24 #include <assert.h>
25
26 #include "system.h"
27 #include "cycle-check.h"
28 #include "dirfd.h"
29 #include "dirname.h"
30 #include "error.h"
31 #include "euidaccess.h"
32 #include "euidaccess-stat.h"
33 #include "file-type.h"
34 #include "hash.h"
35 #include "hash-pjw.h"
36 #include "lstat.h"
37 #include "obstack.h"
38 #include "openat.h"
39 #include "quote.h"
40 #include "remove.h"
41 #include "root-dev-ino.h"
42 #include "unlinkdir.h"
43 #include "yesno.h"
44
45 /* Avoid shadowing warnings because these are functions declared
46    in dirname.h as well as locals used below.  */
47 #define dir_name rm_dir_name
48 #define dir_len rm_dir_len
49
50 #define obstack_chunk_alloc malloc
51 #define obstack_chunk_free free
52
53 /* This is the maximum number of consecutive readdir/unlink calls that
54    can be made (with no intervening rewinddir or closedir/opendir)
55    before triggering a bug that makes readdir return NULL even though
56    some directory entries have not been processed.  The bug afflicts
57    SunOS's readdir when applied to ufs file systems and Darwin 6.5's
58    (and OSX v.10.3.8's) HFS+.  This maximum is conservative in that
59    demonstrating the problem seems to require a directory containing
60    at least 254 deletable entries (which doesn't count . and ..), so
61    we could conceivably increase the maximum value to 254.  */
62 enum
63   {
64     CONSECUTIVE_READDIR_UNLINK_THRESHOLD = 200
65   };
66
67 enum Ternary
68   {
69     T_UNKNOWN = 2,
70     T_NO,
71     T_YES
72   };
73 typedef enum Ternary Ternary;
74
75 /* The prompt function may be called twice for a given directory.
76    The first time, we ask whether to descend into it, and the
77    second time, we ask whether to remove it.  */
78 enum Prompt_action
79   {
80     PA_DESCEND_INTO_DIR = 2,
81     PA_REMOVE_DIR
82   };
83
84 /* Initial capacity of per-directory hash table of entries that have
85    been processed but not been deleted.  */
86 enum { HT_UNREMOVABLE_INITIAL_CAPACITY = 13 };
87
88 /* An entry in the active directory stack.
89    Each entry corresponds to an `active' directory.  */
90 struct AD_ent
91 {
92   /* For a given active directory, this is the set of names of
93      entries in that directory that could/should not be removed.
94      For example, `.' and `..', as well as files/dirs for which
95      unlink/rmdir failed e.g., due to access restrictions.  */
96   Hash_table *unremovable;
97
98   /* Record the status for a given active directory; we need to know
99      whether an entry was not removed, either because of an error or
100      because the user declined.  */
101   enum RM_status status;
102
103   /* The directory's dev/ino.  Used to ensure that a malicious user does
104      not replace a directory we're about to process with a symlink to
105      some other directory.  */
106   struct dev_ino dev_ino;
107 };
108
109 extern char *program_name;
110
111 struct dirstack_state
112 {
113   /* The name of the directory (starting with and relative to a command
114      line argument) being processed.  When a subdirectory is entered, a new
115      component is appended (pushed).  Remove (pop) the top component
116      upon chdir'ing out of a directory.  This is used to form the full
117      name of the current directory or a file therein, when necessary.  */
118   struct obstack dir_stack;
119
120   /* Stack of lengths of directory names (including trailing slash)
121      appended to dir_stack.  We have to have a separate stack of lengths
122      (rather than just popping back to previous slash) because the first
123      element pushed onto the dir stack may contain slashes.  */
124   struct obstack len_stack;
125
126   /* Stack of active directory entries.
127      The first `active' directory is the initial working directory.
128      Additional active dirs are pushed onto the stack as we `chdir'
129      into each directory to be processed.  When finished with the
130      hierarchy under a directory, pop the active dir stack.  */
131   struct obstack Active_dir;
132
133   /* Used to detect cycles.  */
134   struct cycle_check_state cycle_check_state;
135
136   /* Target of a longjmp in case rm has to stop processing the current
137      command-line argument.  This happens 1) when rm detects a directory
138      cycle or 2) when it has processed one or more directories, but then
139      is unable to return to the initial working directory to process
140      additional `.'-relative command-line arguments.  */
141   jmp_buf current_arg_jumpbuf;
142 };
143 typedef struct dirstack_state Dirstack_state;
144
145 static void
146 hash_freer (void *x)
147 {
148   free (x);
149 }
150
151 static bool
152 hash_compare_strings (void const *x, void const *y)
153 {
154   return STREQ (x, y) ? true : false;
155 }
156
157 static inline void
158 push_dir (Dirstack_state *ds, const char *dir_name)
159 {
160   size_t len = strlen (dir_name);
161
162   /* Append the string onto the stack.  */
163   obstack_grow (&ds->dir_stack, dir_name, len);
164
165   /* Append a trailing slash.  */
166   obstack_1grow (&ds->dir_stack, '/');
167
168   /* Add one for the slash.  */
169   ++len;
170
171   /* Push the length (including slash) onto its stack.  */
172   obstack_grow (&ds->len_stack, &len, sizeof (len));
173 }
174
175 /* Return the entry name of the directory on the top of the stack
176    in malloc'd storage.  */
177 static inline char *
178 top_dir (Dirstack_state const *ds)
179 {
180   size_t n_lengths = obstack_object_size (&ds->len_stack) / sizeof (size_t);
181   size_t *length = obstack_base (&ds->len_stack);
182   size_t top_len = length[n_lengths - 1];
183   char const *p = obstack_next_free (&ds->dir_stack) - top_len;
184   char *q = xmalloc (top_len);
185   memcpy (q, p, top_len - 1);
186   q[top_len - 1] = 0;
187   return q;
188 }
189
190 static inline void
191 pop_dir (Dirstack_state *ds)
192 {
193   size_t n_lengths = obstack_object_size (&ds->len_stack) / sizeof (size_t);
194   size_t *length = obstack_base (&ds->len_stack);
195
196   assert (n_lengths > 0);
197   size_t top_len = length[n_lengths - 1];
198   assert (top_len >= 2);
199
200   /* Pop the specified length of file name.  */
201   assert (obstack_object_size (&ds->dir_stack) >= top_len);
202   obstack_blank (&ds->dir_stack, -top_len);
203
204   /* Pop the length stack, too.  */
205   assert (obstack_object_size (&ds->len_stack) >= sizeof (size_t));
206   obstack_blank (&ds->len_stack, -(int) sizeof (size_t));
207 }
208
209 /* Copy the SRC_LEN bytes of data beginning at SRC into the DST_LEN-byte
210    buffer, DST, so that the last source byte is at the end of the destination
211    buffer.  If SRC_LEN is longer than DST_LEN, then set *TRUNCATED.
212    Set *RESULT to point to the beginning of (the portion of) the source data
213    in DST.  Return the number of bytes remaining in the destination buffer.  */
214
215 static size_t
216 right_justify (char *dst, size_t dst_len, const char *src, size_t src_len,
217                char **result, bool *truncated)
218 {
219   const char *sp;
220   char *dp;
221
222   if (src_len <= dst_len)
223     {
224       sp = src;
225       dp = dst + (dst_len - src_len);
226       *truncated = false;
227     }
228   else
229     {
230       sp = src + (src_len - dst_len);
231       dp = dst;
232       src_len = dst_len;
233       *truncated = true;
234     }
235
236   *result = memcpy (dp, sp, src_len);
237   return dst_len - src_len;
238 }
239
240 /* Using the global directory name obstack, create the full name FILENAME.
241    Return it in sometimes-realloc'd space that should not be freed by the
242    caller.  Realloc as necessary.  If realloc fails, use a static buffer
243    and put as long a suffix in that buffer as possible.  */
244
245 #define full_filename(Filename) full_filename_ (ds, Filename)
246 static char *
247 full_filename_ (Dirstack_state const *ds, const char *filename)
248 {
249   static char *buf = NULL;
250   static size_t n_allocated = 0;
251
252   size_t dir_len = obstack_object_size (&ds->dir_stack);
253   char *dir_name = obstack_base (&ds->dir_stack);
254   size_t n_bytes_needed;
255   size_t filename_len;
256
257   filename_len = strlen (filename);
258   n_bytes_needed = dir_len + filename_len + 1;
259
260   if (n_allocated < n_bytes_needed)
261     {
262       /* This code requires that realloc accept NULL as the first arg.
263          This function must not use xrealloc.  Otherwise, an out-of-memory
264          error involving a file name to be expanded here wouldn't ever
265          be issued.  Use realloc and fall back on using a static buffer
266          if memory allocation fails.  */
267       char *new_buf = realloc (buf, n_bytes_needed);
268       n_allocated = n_bytes_needed;
269
270       if (new_buf == NULL)
271         {
272 #define SBUF_SIZE 512
273 #define ELLIPSES_PREFIX "[...]"
274           static char static_buf[SBUF_SIZE];
275           bool truncated;
276           size_t len;
277           char *p;
278
279           free (buf);
280           len = right_justify (static_buf, SBUF_SIZE, filename,
281                                filename_len + 1, &p, &truncated);
282           right_justify (static_buf, len, dir_name, dir_len, &p, &truncated);
283           if (truncated)
284             {
285               memcpy (static_buf, ELLIPSES_PREFIX,
286                       sizeof (ELLIPSES_PREFIX) - 1);
287             }
288           return p;
289         }
290
291       buf = new_buf;
292     }
293
294   if (filename_len == 1 && *filename == '.' && dir_len)
295     {
296       /* FILENAME is just `.' and dir_len is nonzero.
297          Copy the directory part, omitting the trailing slash,
298          and append a trailing zero byte.  */
299       char *p = mempcpy (buf, dir_name, dir_len - 1);
300       *p = 0;
301     }
302   else
303     {
304       /* Copy the directory part, including trailing slash, and then
305          append the filename part, including a trailing zero byte.  */
306       memcpy (mempcpy (buf, dir_name, dir_len), filename, filename_len + 1);
307       assert (strlen (buf) + 1 == n_bytes_needed);
308     }
309
310   return buf;
311 }
312
313 static size_t
314 AD_stack_height (Dirstack_state const *ds)
315 {
316   return obstack_object_size (&ds->Active_dir) / sizeof (struct AD_ent);
317 }
318
319 static struct AD_ent *
320 AD_stack_top (Dirstack_state const *ds)
321 {
322   return (struct AD_ent *)
323     ((char *) obstack_next_free (&ds->Active_dir) - sizeof (struct AD_ent));
324 }
325
326 static void
327 AD_stack_pop (Dirstack_state *ds)
328 {
329   assert (0 < AD_stack_height (ds));
330
331   /* operate on Active_dir.  pop and free top entry */
332   struct AD_ent *top = AD_stack_top (ds);
333   if (top->unremovable)
334     hash_free (top->unremovable);
335   obstack_blank (&ds->Active_dir, -(int) sizeof (struct AD_ent));
336 }
337
338 static Dirstack_state *
339 ds_init (void)
340 {
341   Dirstack_state *ds = xmalloc (sizeof *ds);
342   obstack_init (&ds->dir_stack);
343   obstack_init (&ds->len_stack);
344   obstack_init (&ds->Active_dir);
345   return ds;
346 }
347
348 static void
349 ds_clear (Dirstack_state *ds)
350 {
351   obstack_free (&ds->dir_stack, obstack_finish (&ds->dir_stack));
352   obstack_free (&ds->len_stack, obstack_finish (&ds->len_stack));
353   while (0 < AD_stack_height (ds))
354     AD_stack_pop (ds);
355   obstack_free (&ds->Active_dir, obstack_finish (&ds->Active_dir));
356 }
357
358 static void
359 ds_free (Dirstack_state *ds)
360 {
361   obstack_free (&ds->dir_stack, NULL);
362   obstack_free (&ds->len_stack, NULL);
363   obstack_free (&ds->Active_dir, NULL);
364   free (ds);
365 }
366
367 /* Pop the active directory (AD) stack and move *DIRP `up' one level,
368    safely.  Moving `up' usually means opening `..', but when we've just
369    finished recursively processing a command-line directory argument,
370    there's nothing left on the stack, so set *DIRP to NULL in that case.
371    The idea is to return with *DIRP opened on the parent directory,
372    assuming there are entries in that directory that we need to remove.
373
374    Whenever using chdir '..' (virtually, now, via openat), verify
375    that the post-chdir dev/ino numbers for `.' match the saved ones.
376    If any system call fails or if dev/ino don't match then give a
377    diagnostic and longjump out.
378    Set *PREV_DIR to the name (in malloc'd storage) of the
379    directory (usually now empty) from which we're coming, and which
380    corresponds to the input value of *DIRP.  */
381 static void
382 AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
383 {
384   enum RM_status old_status = AD_stack_top(ds)->status;
385   struct AD_ent *top;
386
387   /* Get the name of the current (but soon to be `previous') directory
388      from the top of the stack.  */
389   *prev_dir = top_dir (ds);
390
391   AD_stack_pop (ds);
392   pop_dir (ds);
393   top = AD_stack_top (ds);
394
395   /* Propagate any failure to parent.  */
396   UPDATE_STATUS (top->status, old_status);
397
398   assert (AD_stack_height (ds));
399
400   if (1 < AD_stack_height (ds))
401     {
402       struct stat sb;
403       int fd = openat (dirfd (*dirp), "..", O_RDONLY);
404       if (CLOSEDIR (*dirp) != 0)
405         {
406           error (0, errno, _("FATAL: failed to close directory %s"),
407                  quote (full_filename (*prev_dir)));
408           longjmp (ds->current_arg_jumpbuf, 1);
409         }
410
411       /* The above fails with EACCES when *DIRP is readable but not
412          searchable, when using Solaris' openat.  Without this openat
413          call, tests/rm2 would fail to remove directories a/2 and a/3.  */
414       if (fd < 0)
415         fd = openat (AT_FDCWD, full_filename ("."), O_RDONLY);
416
417       if (fd < 0)
418         {
419           error (0, errno, _("FATAL: cannot open .. from %s"),
420                  quote (full_filename (*prev_dir)));
421           longjmp (ds->current_arg_jumpbuf, 1);
422         }
423
424       if (fstat (fd, &sb))
425         {
426           error (0, errno,
427                  _("FATAL: cannot ensure %s (returned to via ..) is safe"),
428                  quote (full_filename (".")));
429           close (fd);
430           longjmp (ds->current_arg_jumpbuf, 1);
431         }
432
433       /*  Ensure that post-chdir dev/ino match the stored ones.  */
434       if ( ! SAME_INODE (sb, top->dev_ino))
435         {
436           error (0, 0, _("FATAL: directory %s changed dev/ino"),
437                  quote (full_filename (".")));
438           close (fd);
439           longjmp (ds->current_arg_jumpbuf, 1);
440         }
441
442       *dirp = fdopendir (fd);
443       if (*dirp == NULL)
444         {
445           error (0, errno, _("FATAL: cannot return to .. from %s"),
446                  quote (full_filename (".")));
447           close (fd);
448           longjmp (ds->current_arg_jumpbuf, 1);
449         }
450     }
451   else
452     {
453       if (CLOSEDIR (*dirp) != 0)
454         {
455           error (0, errno, _("FATAL: failed to close directory %s"),
456                  quote (full_filename (*prev_dir)));
457           longjmp (ds->current_arg_jumpbuf, 1);
458         }
459       *dirp = NULL;
460     }
461 }
462
463 /* Initialize *HT if it is NULL.
464    Insert FILENAME into HT.  */
465 static void
466 AD_mark_helper (Hash_table **ht, char const *filename)
467 {
468   if (*ht == NULL)
469     {
470       *ht = hash_initialize (HT_UNREMOVABLE_INITIAL_CAPACITY, NULL, hash_pjw,
471                              hash_compare_strings, hash_freer);
472       if (*ht == NULL)
473         xalloc_die ();
474     }
475   if (! hash_insert (*ht, filename))
476     xalloc_die ();
477 }
478
479 /* Mark FILENAME (in current directory) as unremovable.  */
480 static void
481 AD_mark_as_unremovable (Dirstack_state *ds, char const *filename)
482 {
483   AD_mark_helper (&AD_stack_top(ds)->unremovable, xstrdup (filename));
484 }
485
486 /* Mark the current directory as unremovable.  I.e., mark the entry
487    in the parent directory corresponding to `.'.
488    This happens e.g., when an opendir fails and the only name
489    the caller has conveniently at hand is `.'.  */
490 static void
491 AD_mark_current_as_unremovable (Dirstack_state *ds)
492 {
493   struct AD_ent *top = AD_stack_top (ds);
494   char const *curr = top_dir (ds);
495
496   assert (1 < AD_stack_height (ds));
497
498   --top;
499   AD_mark_helper (&top->unremovable, curr);
500 }
501
502 /* Push an initial dummy entry onto the stack.
503    This will always be the bottommost entry on the stack.  */
504 static void
505 AD_push_initial (Dirstack_state *ds)
506 {
507   struct AD_ent *top;
508
509   /* Extend the stack.  */
510   obstack_blank (&ds->Active_dir, sizeof (struct AD_ent));
511
512   /* Fill in the new values.  */
513   top = AD_stack_top (ds);
514   top->unremovable = NULL;
515
516   /* These should never be used.
517      Give them values that might look suspicious
518      in a debugger or in a diagnostic.  */
519   top->dev_ino.st_dev = TYPE_MAXIMUM (dev_t);
520   top->dev_ino.st_ino = TYPE_MAXIMUM (ino_t);
521 }
522
523 /* Push info about the current working directory (".") onto the
524    active directory stack.  DIR is the ./-relative name through
525    which we've just `chdir'd to this directory.  DIR_SB_FROM_PARENT
526    is the result of calling lstat on DIR from the parent of DIR.
527    Longjump out (skipping the entire command line argument we're
528    dealing with) if `fstat (FD_CWD, ...' fails or if someone has
529    replaced DIR with e.g., a symlink to some other directory.  */
530 static void
531 AD_push (int fd_cwd, Dirstack_state *ds, char const *dir,
532          struct stat const *dir_sb_from_parent)
533 {
534   struct AD_ent *top;
535
536   push_dir (ds, dir);
537
538   /* If our uses of openat are guaranteed not to
539      follow a symlink, then we can skip this check.  */
540   if ( ! O_NOFOLLOW)
541     {
542       struct stat sb;
543       if (fstat (fd_cwd, &sb) != 0)
544         {
545           error (0, errno, _("FATAL: cannot enter directory %s"),
546                  quote (full_filename (".")));
547           longjmp (ds->current_arg_jumpbuf, 1);
548         }
549
550       if ( ! SAME_INODE (sb, *dir_sb_from_parent))
551         {
552           error (0, 0,
553                  _("FATAL: just-changed-to directory %s changed dev/ino"),
554                  quote (full_filename (".")));
555           longjmp (ds->current_arg_jumpbuf, 1);
556         }
557     }
558
559   /* Extend the stack.  */
560   obstack_blank (&ds->Active_dir, sizeof (struct AD_ent));
561
562   {
563     size_t n_lengths = obstack_object_size (&ds->len_stack) / sizeof (size_t);
564     assert (AD_stack_height (ds) == n_lengths + 1);
565   }
566
567   /* Fill in the new values.  */
568   top = AD_stack_top (ds);
569   top->dev_ino.st_dev = dir_sb_from_parent->st_dev;
570   top->dev_ino.st_ino = dir_sb_from_parent->st_ino;
571   top->unremovable = NULL;
572 }
573
574 static bool
575 AD_is_removable (Dirstack_state const *ds, char const *file)
576 {
577   struct AD_ent *top = AD_stack_top (ds);
578   return ! (top->unremovable && hash_lookup (top->unremovable, file));
579 }
580
581 /* Return true if DIR is determined to be an empty directory
582    or if fdopendir or readdir fails.  */
583 static bool
584 is_empty_dir (int fd_cwd, char const *dir)
585 {
586   DIR *dirp;
587   struct dirent const *dp;
588   int saved_errno;
589   int fd = openat (fd_cwd, dir, O_RDONLY | O_NDELAY);
590
591   if (fd < 0)
592     return false;
593
594   dirp = fdopendir (fd);
595   if (dirp == NULL)
596     {
597       close (fd);
598       return false;
599     }
600
601   errno = 0;
602   dp = readdir_ignoring_dot_and_dotdot (dirp);
603   saved_errno = errno;
604   closedir (dirp);
605   if (dp != NULL)
606     return false;
607   return saved_errno == 0 ? true : false;
608 }
609
610 /* Return true if FILE is determined to be an unwritable non-symlink.
611    Otherwise, return false (including when lstat'ing it fails).
612    If lstat (aka fstatat) succeeds, set *BUF_P to BUF.
613    This is to avoid calling euidaccess when FILE is a symlink.  */
614 static bool
615 write_protected_non_symlink (int fd_cwd,
616                              char const *file,
617                              Dirstack_state const *ds,
618                              struct stat **buf_p,
619                              struct stat *buf)
620 {
621   if (fstatat (fd_cwd, file, buf, AT_SYMLINK_NOFOLLOW) != 0)
622     return false;
623   *buf_p = buf;
624   if (S_ISLNK (buf->st_mode))
625     return false;
626   /* Here, we know FILE is not a symbolic link.  */
627
628   /* In order to be reentrant -- i.e., to avoid changing the working
629      directory, and at the same time to be able to deal with alternate
630      access control mechanisms (ACLs, xattr-style attributes) and
631      arbitrarily deep trees -- we need a function like eaccessat, i.e.,
632      like Solaris' eaccess, but fd-relative, in the spirit of openat.  */
633
634   /* In the absence of a native eaccessat function, here are some of
635      the implementation choices [#4 and #5 were suggested by Paul Eggert]:
636      1) call openat with O_WRONLY|O_NOCTTY
637         Disadvantage: may create the file and doesn't work for directory,
638         may mistakenly report `unwritable' for EROFS or ACLs even though
639         perm bits say the file is writable.
640
641      2) fake eaccessat (save_cwd, fchdir, call euidaccess, restore_cwd)
642         Disadvantage: changes working directory (not reentrant) and can't
643         work if save_cwd fails.
644
645      3) if (euidaccess (full_filename (file), W_OK) == 0)
646         Disadvantage: doesn't work if full_filename is too long.
647         Inefficient for very deep trees (O(Depth^2)).
648
649      4) If the full pathname is sufficiently short (say, less than
650         PATH_MAX or 8192 bytes, whichever is shorter):
651         use method (3) (i.e., euidaccess (full_filename (file), W_OK));
652         Otherwise: vfork, fchdir in the child, run euidaccess in the
653         child, then the child exits with a status that tells the parent
654         whether euidaccess succeeded.
655
656         This avoids the O(N**2) algorithm of method (3), and it also avoids
657         the failure-due-to-too-long-file-names of method (3), but it's fast
658         in the normal shallow case.  It also avoids the lack-of-reentrancy
659         and the save_cwd problems.
660         Disadvantage; it uses a process slot for very-long file names,
661         and would be very slow for hierarchies with many such files.
662
663      5) If the full file name is sufficiently short (say, less than
664         PATH_MAX or 8192 bytes, whichever is shorter):
665         use method (3) (i.e., euidaccess (full_filename (file), W_OK));
666         Otherwise: look just at the file bits.  Perhaps issue a warning
667         the first time this occurs.
668
669         This is like (4), except for the "Otherwise" case where it isn't as
670         "perfect" as (4) but is considerably faster.  It conforms to current
671         POSIX, and is uniformly better than what Solaris and FreeBSD do (they
672         mess up with long file names). */
673
674   {
675     /* This implements #5: */
676     size_t file_name_len
677       = obstack_object_size (&ds->dir_stack) + strlen (file);
678
679     return (file_name_len < MIN (PATH_MAX, 8192)
680             ? euidaccess (full_filename (file), W_OK) != 0 && errno == EACCES
681             : euidaccess_stat (buf, W_OK) != 0);
682   }
683 }
684
685 /* Prompt whether to remove FILENAME, if required via a combination of
686    the options specified by X and/or file attributes.  If the file may
687    be removed, return RM_OK.  If the user declines to remove the file,
688    return RM_USER_DECLINED.  If not ignoring missing files and we
689    cannot lstat FILENAME, then return RM_ERROR.
690
691    Depending on MODE, ask whether to `descend into' or to `remove' the
692    directory FILENAME.  MODE is ignored when FILENAME is not a directory.
693    Set *IS_EMPTY to T_YES if FILENAME is an empty directory, and it is
694    appropriate to try to remove it with rmdir (e.g. recursive mode).
695    Don't even try to set *IS_EMPTY when MODE == PA_REMOVE_DIR.
696    Set *IS_DIR to T_YES or T_NO if we happen to determine whether
697    FILENAME is a directory.  */
698 static enum RM_status
699 prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
700         struct rm_options const *x, enum Prompt_action mode,
701         Ternary *is_dir, Ternary *is_empty)
702 {
703   bool write_protected = false;
704   struct stat *sbuf = NULL;
705   struct stat buf;
706
707   *is_empty = T_UNKNOWN;
708   *is_dir = T_UNKNOWN;
709
710   if (((!x->ignore_missing_files & (x->interactive | x->stdin_tty))
711        && (write_protected = write_protected_non_symlink (fd_cwd, filename,
712                                                           ds, &sbuf, &buf)))
713       || x->interactive)
714     {
715       if (sbuf == NULL)
716         {
717           sbuf = &buf;
718           if (fstatat (fd_cwd, filename, sbuf, AT_SYMLINK_NOFOLLOW))
719             {
720               /* lstat failed.  This happens e.g., with `rm '''.  */
721               error (0, errno, _("cannot remove %s"),
722                      quote (full_filename (filename)));
723               return RM_ERROR;
724             }
725         }
726
727       if (S_ISDIR (sbuf->st_mode) && !x->recursive)
728         {
729           error (0, EISDIR, _("cannot remove directory %s"),
730                  quote (full_filename (filename)));
731           return RM_ERROR;
732         }
733
734       /* Using permissions doesn't make sense for symlinks.  */
735       if (S_ISLNK (sbuf->st_mode))
736         {
737           if ( ! x->interactive)
738             return RM_OK;
739           write_protected = false;
740         }
741
742       /* Issue the prompt.  */
743       {
744         char const *quoted_name = quote (full_filename (filename));
745
746         *is_dir = (S_ISDIR (sbuf->st_mode) ? T_YES : T_NO);
747
748         /* FIXME: use a variant of error (instead of fprintf) that doesn't
749            append a newline.  Then we won't have to declare program_name in
750            this file.  */
751         if (S_ISDIR (sbuf->st_mode)
752             && x->recursive
753             && mode == PA_DESCEND_INTO_DIR
754             && ((*is_empty = (is_empty_dir (fd_cwd, filename) ? T_YES : T_NO))
755                 == T_NO))
756           fprintf (stderr,
757                    (write_protected
758                     ? _("%s: descend into write-protected directory %s? ")
759                     : _("%s: descend into directory %s? ")),
760                    program_name, quoted_name);
761         else
762           {
763             /* TRANSLATORS: You may find it more convenient to translate
764                the equivalent of _("%s: remove %s (write-protected) %s? ").
765                It should avoid grammatical problems with the output
766                of file_type.  */
767             fprintf (stderr,
768                      (write_protected
769                       ? _("%s: remove write-protected %s %s? ")
770                       : _("%s: remove %s %s? ")),
771                      program_name, file_type (sbuf), quoted_name);
772           }
773
774         if (!yesno ())
775           return RM_USER_DECLINED;
776       }
777     }
778   return RM_OK;
779 }
780
781 /* Return true if FILENAME is a directory (and not a symlink to a directory).
782    Otherwise, including the case in which lstat fails, return false.
783    Do not modify errno.  */
784 static inline bool
785 is_dir_lstat (char const *filename)
786 {
787   struct stat sbuf;
788   int saved_errno = errno;
789   bool is_dir = lstat (filename, &sbuf) == 0 && S_ISDIR (sbuf.st_mode);
790   errno = saved_errno;
791   return is_dir;
792 }
793
794 #if HAVE_STRUCT_DIRENT_D_TYPE
795
796 /* True if the type of the directory entry D is known.  */
797 # define DT_IS_KNOWN(d) ((d)->d_type != DT_UNKNOWN)
798
799 /* True if the type of the directory entry D must be T.  */
800 # define DT_MUST_BE(d, t) ((d)->d_type == (t))
801
802 #else
803 # define DT_IS_KNOWN(d) false
804 # define DT_MUST_BE(d, t) false
805 #endif
806
807 #define DO_UNLINK(Fd_cwd, Filename, X)                                  \
808   do                                                                    \
809     {                                                                   \
810       if (unlinkat (Fd_cwd, Filename, 0) == 0)                          \
811         {                                                               \
812           if ((X)->verbose)                                             \
813             printf (_("removed %s\n"), quote (full_filename (Filename))); \
814           return RM_OK;                                                 \
815         }                                                               \
816                                                                         \
817       if (errno == ENOENT && (X)->ignore_missing_files)                 \
818         return RM_OK;                                                   \
819     }                                                                   \
820   while (0)
821
822 #define DO_RMDIR(Fd_cwd, Filename, X)                   \
823   do                                                    \
824     {                                                   \
825       if (unlinkat (Fd_cwd, Filename, AT_REMOVEDIR) == 0) /* rmdir */ \
826         {                                               \
827           if ((X)->verbose)                             \
828             printf (_("removed directory: %s\n"),       \
829                     quote (full_filename (Filename)));  \
830           return RM_OK;                                 \
831         }                                               \
832                                                         \
833       if (errno == ENOENT && (X)->ignore_missing_files) \
834         return RM_OK;                                   \
835                                                         \
836       if (errno == ENOTEMPTY || errno == EEXIST)        \
837         return RM_NONEMPTY_DIR;                         \
838     }                                                   \
839   while (0)
840
841 /* Remove the file or directory specified by FILENAME.
842    Return RM_OK if it is removed, and RM_ERROR or RM_USER_DECLINED if not.
843    But if FILENAME specifies a non-empty directory, return RM_NONEMPTY_DIR. */
844
845 static enum RM_status
846 remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
847               struct rm_options const *x, struct dirent const *dp)
848 {
849   Ternary is_dir;
850   Ternary is_empty_directory;
851   enum RM_status s = prompt (fd_cwd, ds, filename, x, PA_DESCEND_INTO_DIR,
852                              &is_dir, &is_empty_directory);
853
854   if (s != RM_OK)
855     return s;
856
857   /* Why bother with the following if/else block?  Because on systems with
858      an unlink function that *can* unlink directories, we must determine the
859      type of each entry before removing it.  Otherwise, we'd risk unlinking
860      an entire directory tree simply by unlinking a single directory;  then
861      all the storage associated with that hierarchy would not be freed until
862      the next fsck.  Not nice.  To avoid that, on such slightly losing
863      systems, we need to call lstat to determine the type of each entry,
864      and that represents extra overhead that -- it turns out -- we can
865      avoid on non-losing systems, since there, unlink will never remove
866      a directory.  Also, on systems where unlink may unlink directories,
867      we're forced to allow a race condition: we lstat a non-directory, then
868      go to unlink it, but in the mean time, a malicious someone could have
869      replaced it with a directory.  */
870
871   if (cannot_unlink_dir ())
872     {
873       if (is_dir == T_YES && ! x->recursive)
874         {
875           error (0, EISDIR, _("cannot remove directory %s"),
876                  quote (full_filename (filename)));
877           return RM_ERROR;
878         }
879
880       /* is_empty_directory is set iff it's ok to use rmdir.
881          Note that it's set only in interactive mode -- in which case it's
882          an optimization that arranges so that the user is asked just
883          once whether to remove the directory.  */
884       if (is_empty_directory == T_YES)
885         DO_RMDIR (fd_cwd, filename, x);
886
887       /* If we happen to know that FILENAME is a directory, return now
888          and let the caller remove it -- this saves the overhead of a failed
889          unlink call.  If FILENAME is a command-line argument, then dp is NULL,
890          so we'll first try to unlink it.  Using unlink here is ok, because it
891          cannot remove a directory.  */
892       if ((dp && DT_MUST_BE (dp, DT_DIR)) || is_dir == T_YES)
893         return RM_NONEMPTY_DIR;
894
895       DO_UNLINK (fd_cwd, filename, x);
896
897       /* Upon a failed attempt to unlink a directory, most non-Linux systems
898          set errno to the POSIX-required value EPERM.  In that case, change
899          errno to EISDIR so that we emit a better diagnostic.  */
900       if (! x->recursive && errno == EPERM && is_dir_lstat (filename))
901         errno = EISDIR;
902
903       if (! x->recursive
904           || errno == ENOENT || errno == ENOTDIR
905           || errno == ELOOP || errno == ENAMETOOLONG)
906         {
907           /* Either --recursive is not in effect, or the file cannot be a
908              directory.  Report the unlink problem and fail.  */
909           error (0, errno, _("cannot remove %s"),
910                  quote (full_filename (filename)));
911           return RM_ERROR;
912         }
913     }
914   else
915     {
916       /* If we don't already know whether FILENAME is a directory, find out now.
917          Then, if it's a non-directory, we can use unlink on it.  */
918       if (is_dir == T_UNKNOWN)
919         {
920           if (dp && DT_IS_KNOWN (dp))
921             is_dir = DT_MUST_BE (dp, DT_DIR) ? T_YES : T_NO;
922           else
923             {
924               struct stat sbuf;
925               if (fstatat (fd_cwd, filename, &sbuf, AT_SYMLINK_NOFOLLOW))
926                 {
927                   if (errno == ENOENT && x->ignore_missing_files)
928                     return RM_OK;
929
930                   error (0, errno, _("cannot remove %s"),
931                          quote (full_filename (filename)));
932                   return RM_ERROR;
933                 }
934
935               is_dir = S_ISDIR (sbuf.st_mode) ? T_YES : T_NO;
936             }
937         }
938
939       if (is_dir == T_NO)
940         {
941           /* At this point, barring race conditions, FILENAME is known
942              to be a non-directory, so it's ok to try to unlink it.  */
943           DO_UNLINK (fd_cwd, filename, x);
944
945           /* unlink failed with some other error code.  report it.  */
946           error (0, errno, _("cannot remove %s"),
947                  quote (full_filename (filename)));
948           return RM_ERROR;
949         }
950
951       if (! x->recursive)
952         {
953           error (0, EISDIR, _("cannot remove directory %s"),
954                  quote (full_filename (filename)));
955           return RM_ERROR;
956         }
957
958       if (is_empty_directory == T_YES)
959         {
960           DO_RMDIR (fd_cwd, filename, x);
961           /* Don't diagnose any failure here.
962              It'll be detected when the caller tries another way.  */
963         }
964     }
965
966   return RM_NONEMPTY_DIR;
967 }
968
969 /* Given FD_CWD, the file descriptor for an open directory,
970    open its subdirectory F (F is already `known' to be a directory,
971    so if it is no longer one, someone is playing games), return a DIR*
972    pointer for F, and put F's `stat' data in *SUBDIR_SB.
973    Upon failure give a diagnostic and return NULL.
974    If PREV_ERRNO is nonzero, it is the errno value from a preceding failed
975    unlink- or rmdir-like system call -- use that value instead of ENOTDIR
976    if an opened file turns out not to be a directory.  This is important
977    when the preceding non-dir-unlink failed due to e.g., EPERM or EACCES.
978    The caller must use a nonnnull CWD_ERRNO the first
979    time this function is called for each command-line-specified directory.
980    If CWD_ERRNO is not null, set *CWD_ERRNO to the appropriate error number
981    if this function fails to restore the initial working directory.
982    If it is null, report an error and exit if the working directory
983    isn't restored.  */
984 static DIR *
985 fd_to_subdirp (int fd_cwd, char const *f,
986                struct rm_options const *x, int prev_errno,
987                struct stat *subdir_sb, Dirstack_state *ds,
988                int *cwd_errno ATTRIBUTE_UNUSED)
989 {
990   int fd_sub = openat_permissive (fd_cwd, f, O_RDONLY | O_NOFOLLOW,
991                                   0, cwd_errno);
992
993   /* Record dev/ino of F.  We may compare them against saved values
994      to thwart any attempt to subvert the traversal.  They are also used
995      to detect directory cycles.  */
996   if (fd_sub < 0 || fstat (fd_sub, subdir_sb) != 0)
997     {
998       if (errno != ENOENT || !x->ignore_missing_files)
999         error (0, errno,
1000                _("cannot remove %s"), quote (full_filename (f)));
1001       if (0 <= fd_sub)
1002         close (fd_sub);
1003       return NULL;
1004     }
1005
1006   if (! S_ISDIR (subdir_sb->st_mode))
1007     {
1008       error (0, prev_errno ? prev_errno : ENOTDIR, _("cannot remove %s"),
1009              quote (full_filename (f)));
1010       close (fd_sub);
1011       return NULL;
1012     }
1013
1014   DIR *subdir_dirp = fdopendir (fd_sub);
1015   if (subdir_dirp == NULL)
1016     {
1017       if (errno != ENOENT || !x->ignore_missing_files)
1018         error (0, errno, _("cannot open directory %s"),
1019                quote (full_filename (f)));
1020       close (fd_sub);
1021       return NULL;
1022     }
1023
1024   return subdir_dirp;
1025 }
1026
1027 /* Remove entries in the directory open on DIRP
1028    Upon finding a directory that is both non-empty and that can be chdir'd
1029    into, return RM_OK and set *SUBDIR and fill in SUBDIR_SB, where
1030    SUBDIR is the malloc'd name of the subdirectory if the chdir succeeded,
1031    NULL otherwise (e.g., if opendir failed or if there was no subdirectory).
1032    Likewise, SUBDIR_SB is the result of calling lstat on SUBDIR.
1033    Return RM_OK if all entries are removed.  Return RM_ERROR if any
1034    entry cannot be removed.  Otherwise, return RM_USER_DECLINED if
1035    the user declines to remove at least one entry.  Remove as much as
1036    possible, continuing even if we fail to remove some entries.  */
1037 static enum RM_status
1038 remove_cwd_entries (DIR **dirp,
1039                     Dirstack_state *ds, char **subdir, struct stat *subdir_sb,
1040                     struct rm_options const *x)
1041 {
1042   struct AD_ent *top = AD_stack_top (ds);
1043   enum RM_status status = top->status;
1044   size_t n_unlinked_since_opendir_or_last_rewind = 0;
1045
1046   assert (VALID_STATUS (status));
1047   *subdir = NULL;
1048
1049   while (1)
1050     {
1051       struct dirent const *dp;
1052       enum RM_status tmp_status;
1053       const char *f;
1054
1055       /* Set errno to zero so we can distinguish between a readdir failure
1056          and when readdir simply finds that there are no more entries.  */
1057       errno = 0;
1058       dp = readdir_ignoring_dot_and_dotdot (*dirp);
1059       if (dp == NULL)
1060         {
1061           if (errno)
1062             {
1063               /* fall through */
1064             }
1065           else if (CONSECUTIVE_READDIR_UNLINK_THRESHOLD
1066                    < n_unlinked_since_opendir_or_last_rewind)
1067             {
1068               /* Call rewinddir if we've called unlink or rmdir so many times
1069                  (since the opendir or the previous rewinddir) that this
1070                  NULL-return may be the symptom of a buggy readdir.  */
1071               rewinddir (*dirp);
1072               n_unlinked_since_opendir_or_last_rewind = 0;
1073               continue;
1074             }
1075           break;
1076         }
1077
1078       f = dp->d_name;
1079
1080       /* Skip files we've already tried/failed to remove.  */
1081       if ( ! AD_is_removable (ds, f))
1082         continue;
1083
1084       /* Pass dp->d_type info to remove_entry so the non-glibc
1085          case can decide whether to use unlink or chdir.
1086          Systems without the d_type member will have to endure
1087          the performance hit of first calling lstat F. */
1088       tmp_status = remove_entry (dirfd (*dirp), ds, f, x, dp);
1089       switch (tmp_status)
1090         {
1091         case RM_OK:
1092           /* Count how many files we've unlinked since the initial
1093              opendir or the last rewinddir.  On buggy systems, if you
1094              remove too many, readdir returns NULL even though there
1095              remain unprocessed directory entries.  */
1096           ++n_unlinked_since_opendir_or_last_rewind;
1097           break;
1098
1099         case RM_ERROR:
1100         case RM_USER_DECLINED:
1101           AD_mark_as_unremovable (ds, f);
1102           UPDATE_STATUS (status, tmp_status);
1103           break;
1104
1105         case RM_NONEMPTY_DIR:
1106           {
1107             DIR *subdir_dirp = fd_to_subdirp (dirfd (*dirp), f,
1108                                               x, errno, subdir_sb, ds, NULL);
1109             if (subdir_dirp == NULL)
1110               {
1111                 AD_mark_as_unremovable (ds, f);
1112                 status = RM_ERROR;
1113                 break;
1114               }
1115
1116             if (cycle_check (&ds->cycle_check_state, subdir_sb))
1117               {
1118                 error (0, 0, _("\
1119 WARNING: Circular directory structure.\n\
1120 This almost certainly means that you have a corrupted file system.\n\
1121 NOTIFY YOUR SYSTEM MANAGER.\n\
1122 The following directory is part of the cycle:\n  %s\n"),
1123                        quote (full_filename (".")));
1124                 longjmp (ds->current_arg_jumpbuf, 1);
1125               }
1126
1127             *subdir = xstrdup (f);
1128             if (CLOSEDIR (*dirp) != 0)
1129               {
1130                 error (0, 0, _("failed to close directory %s"),
1131                        quote (full_filename (".")));
1132                 status = RM_ERROR;
1133               }
1134             *dirp = subdir_dirp;
1135
1136             break;
1137           }
1138         }
1139
1140       /* Record status for this directory.  */
1141       UPDATE_STATUS (top->status, status);
1142
1143       if (*subdir)
1144         break;
1145     }
1146
1147   /* Ensure that *dirp is not NULL and that its file descriptor is valid.  */
1148   assert (*dirp != NULL);
1149   assert (0 <= fcntl (dirfd (*dirp), F_GETFD));
1150
1151   return status;
1152 }
1153
1154 /* Do this after each call to AD_push or AD_push_initial.
1155    Because the status = RM_OK bit is too remove-specific to
1156    go into the general-purpose AD_* package.  */
1157 #define AD_INIT_OTHER_MEMBERS()                 \
1158   do                                            \
1159     {                                           \
1160       AD_stack_top(ds)->status = RM_OK;         \
1161     }                                           \
1162   while (0)
1163
1164 /*  Remove the hierarchy rooted at DIR.
1165     Do that by changing into DIR, then removing its contents, then
1166     returning to the original working directory and removing DIR itself.
1167     Don't use recursion.  Be careful when using chdir ".." that we
1168     return to the same directory from which we came, if necessary.
1169     Return an RM_status value to indicate success or failure.  */
1170
1171 static enum RM_status
1172 remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
1173             struct rm_options const *x, int *cwd_errno)
1174 {
1175   enum RM_status status;
1176   struct stat dir_sb;
1177
1178   /* There is a race condition in that an attacker could replace the nonempty
1179      directory, DIR, with a symlink between the preceding call to rmdir
1180      (unlinkat, in our caller) and fd_to_subdirp's openat call.  But on most
1181      systems, even those without openat, this isn't a problem, since we ensure
1182      that opening a symlink will fail, when that is possible.  Otherwise,
1183      fd_to_subdirp's fstat, along with the `fstat' and the dev/ino
1184      comparison in AD_push ensure that we detect it and fail.  */
1185
1186   DIR *dirp = fd_to_subdirp (fd_cwd, dir, x, 0, &dir_sb, ds, cwd_errno);
1187
1188   if (dirp == NULL)
1189     return RM_ERROR;
1190
1191   if (ROOT_DEV_INO_CHECK (x->root_dev_ino, &dir_sb))
1192     {
1193       ROOT_DEV_INO_WARN (full_filename (dir));
1194       status = RM_ERROR;
1195       goto closedir_and_return;
1196     }
1197
1198   AD_push (dirfd (dirp), ds, dir, &dir_sb);
1199   AD_INIT_OTHER_MEMBERS ();
1200
1201   status = RM_OK;
1202
1203   while (1)
1204     {
1205       char *subdir = NULL;
1206       struct stat subdir_sb;
1207       enum RM_status tmp_status;
1208
1209       tmp_status = remove_cwd_entries (&dirp, ds, &subdir, &subdir_sb, x);
1210
1211       if (tmp_status != RM_OK)
1212         {
1213           UPDATE_STATUS (status, tmp_status);
1214           AD_mark_current_as_unremovable (ds);
1215         }
1216       if (subdir)
1217         {
1218           AD_push (dirfd (dirp), ds, subdir, &subdir_sb);
1219           AD_INIT_OTHER_MEMBERS ();
1220
1221           free (subdir);
1222           continue;
1223         }
1224
1225       /* Execution reaches this point when we've removed the last
1226          removable entry from the current directory.  */
1227       {
1228         /* The name of the directory that we have just processed,
1229            nominally removing all of its contents.  */
1230         char *empty_dir;
1231
1232         AD_pop_and_chdir (&dirp, ds, &empty_dir);
1233         int fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
1234         assert (dirp != NULL || AD_stack_height (ds) == 1);
1235
1236         /* Try to remove EMPTY_DIR only if remove_cwd_entries succeeded.  */
1237         if (tmp_status == RM_OK)
1238           {
1239             /* This does a little more work than necessary when it actually
1240                prompts the user.  E.g., we already know that D is a directory
1241                and that it's almost certainly empty, yet we lstat it.
1242                But that's no big deal since we're interactive.  */
1243             Ternary is_dir;
1244             Ternary is_empty;
1245             enum RM_status s = prompt (fd, ds, empty_dir, x,
1246                                        PA_REMOVE_DIR, &is_dir, &is_empty);
1247
1248             if (s != RM_OK)
1249               {
1250                 free (empty_dir);
1251                 status = s;
1252                 goto closedir_and_return;
1253               }
1254
1255             if (unlinkat (fd, empty_dir, AT_REMOVEDIR) == 0)
1256               {
1257                 if (x->verbose)
1258                   printf (_("removed directory: %s\n"),
1259                           quote (full_filename (empty_dir)));
1260               }
1261             else
1262               {
1263                 error (0, errno, _("cannot remove directory %s"),
1264                        quote (full_filename (empty_dir)));
1265                 AD_mark_as_unremovable (ds, empty_dir);
1266                 status = RM_ERROR;
1267                 UPDATE_STATUS (AD_stack_top(ds)->status, status);
1268               }
1269           }
1270
1271         free (empty_dir);
1272
1273         if (AD_stack_height (ds) == 1)
1274           break;
1275       }
1276     }
1277
1278   /* If the first/final hash table of unremovable entries was used,
1279      free it here.  */
1280   AD_stack_pop (ds);
1281
1282  closedir_and_return:;
1283   if (dirp != NULL && CLOSEDIR (dirp) != 0)
1284     {
1285       error (0, 0, _("failed to close directory %s"),
1286              quote (full_filename (".")));
1287       status = RM_ERROR;
1288     }
1289
1290   return status;
1291 }
1292
1293 /* Remove the file or directory specified by FILENAME.
1294    Return RM_OK if it is removed, and RM_ERROR or RM_USER_DECLINED if not.  */
1295
1296 static enum RM_status
1297 rm_1 (Dirstack_state *ds, char const *filename,
1298       struct rm_options const *x, int *cwd_errno)
1299 {
1300   char const *base = base_name (filename);
1301   if (DOT_OR_DOTDOT (base))
1302     {
1303       error (0, 0, _("cannot remove `.' or `..'"));
1304       return RM_ERROR;
1305     }
1306
1307   AD_push_initial (ds);
1308   AD_INIT_OTHER_MEMBERS ();
1309
1310   /* Put `status' in static storage, so it can't be clobbered
1311      by the potential longjmp into this function.  */
1312   static enum RM_status status;
1313   int fd_cwd = AT_FDCWD;
1314   status = remove_entry (fd_cwd, ds, filename, x, NULL);
1315   if (status == RM_NONEMPTY_DIR)
1316     {
1317       /* In the event that remove_dir->remove_cwd_entries detects
1318          a directory cycle, arrange to fail, give up on this FILE, but
1319          continue on with any other arguments.  */
1320       if (setjmp (ds->current_arg_jumpbuf))
1321         status = RM_ERROR;
1322       else
1323         status = remove_dir (fd_cwd, ds, filename, x, cwd_errno);
1324     }
1325
1326   ds_clear (ds);
1327
1328   return status;
1329 }
1330
1331 /* Remove all files and/or directories specified by N_FILES and FILE.
1332    Apply the options in X.  */
1333 extern enum RM_status
1334 rm (size_t n_files, char const *const *file, struct rm_options const *x)
1335 {
1336   enum RM_status status = RM_OK;
1337   Dirstack_state *ds = ds_init ();
1338   int cwd_errno = 0;
1339   size_t i;
1340
1341   for (i = 0; i < n_files; i++)
1342     {
1343       if (cwd_errno && IS_RELATIVE_FILE_NAME (file[i]))
1344         {
1345           error (0, 0, _("cannot remove relative-named %s"), quote (file[i]));
1346           status = RM_ERROR;
1347           continue;
1348         }
1349
1350       cycle_check_init (&ds->cycle_check_state);
1351       enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
1352       assert (VALID_STATUS (s));
1353       UPDATE_STATUS (status, s);
1354     }
1355
1356   if (x->require_restore_cwd && cwd_errno)
1357     {
1358       error (0, cwd_errno,
1359              _("cannot restore current working directory"));
1360       status = RM_ERROR;
1361     }
1362
1363   ds_free (ds);
1364
1365   return status;
1366 }