source: rtems/cpukit/libcsupport/src/rmdir.c @ c17d0b3

4.11
Last change on this file since c17d0b3 was c17d0b3, checked in by Sebastian Huber <sebastian.huber@…>, on Oct 2, 2012 at 1:44:59 PM

Filesystem: Reject removal of root nodes

Reject the removal of file system instance root nodes in rmdir() and
unlink() and return the EBUSY error status. File system instances can
be removed with unmount(). Remove root node special cases in IMFS,
DOSFS, and RFS.

  • Property mode set to 100644
File size: 1.4 KB
Line 
1/*
2 *  rmdir() - POSIX 1003.1b - 5.2.2 - Remove a Directory
3 *
4 *  COPYRIGHT (c) 1989-1999.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.rtems.com/license/LICENSE.
10 */
11
12#if HAVE_CONFIG_H
13  #include "config.h"
14#endif
15
16#include <unistd.h>
17
18#include <rtems/libio_.h>
19
20int rmdir( const char *path )
21{
22  int rv = 0;
23  rtems_filesystem_eval_path_context_t ctx;
24  int eval_flags = RTEMS_FS_REJECT_TERMINAL_DOT;
25  rtems_filesystem_location_info_t parentloc;
26  int parent_eval_flags = RTEMS_FS_PERMS_WRITE
27    | RTEMS_FS_PERMS_EXEC
28    | RTEMS_FS_FOLLOW_LINK;
29  const rtems_filesystem_location_info_t *currentloc =
30    rtems_filesystem_eval_path_start_with_parent(
31      &ctx,
32      path,
33      eval_flags,
34      &parentloc,
35      parent_eval_flags
36    );
37  const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
38  rtems_filesystem_node_types_t type = (*ops->node_type_h)( currentloc );
39
40  if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
41    if ( !rtems_filesystem_location_is_root( currentloc ) ) {
42      rv = (*ops->rmnod_h)( &parentloc, currentloc );
43    } else {
44      rtems_filesystem_eval_path_error( &ctx, EBUSY );
45      rv = -1;
46    }
47  } else {
48    rtems_filesystem_eval_path_error( &ctx, ENOTDIR );
49    rv = -1;
50  }
51
52  rtems_filesystem_eval_path_cleanup_with_parent( &ctx, &parentloc );
53
54  return rv;
55}
Note: See TracBrowser for help on using the repository browser.