summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/rfs/rtems-rfs-link.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libfs/src/rfs/rtems-rfs-link.c')
-rw-r--r--cpukit/libfs/src/rfs/rtems-rfs-link.c59
1 files changed, 36 insertions, 23 deletions
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-link.c b/cpukit/libfs/src/rfs/rtems-rfs-link.c
index bfbcae66e7..5346eabae3 100644
--- a/cpukit/libfs/src/rfs/rtems-rfs-link.c
+++ b/cpukit/libfs/src/rfs/rtems-rfs-link.c
@@ -24,13 +24,15 @@
#include <rtems/rfs/rtems-rfs-trace.h>
#include <rtems/rfs/rtems-rfs-dir.h>
#include <rtems/rfs/rtems-rfs-dir-hash.h>
+#include <rtems/rfs/rtems-rfs-link.h>
int
rtems_rfs_link (rtems_rfs_file_system* fs,
const char* name,
int length,
rtems_rfs_ino parent,
- rtems_rfs_ino target)
+ rtems_rfs_ino target,
+ bool link_dir)
{
rtems_rfs_inode_handle parent_inode;
rtems_rfs_inode_handle target_inode;
@@ -50,7 +52,11 @@ rtems_rfs_link (rtems_rfs_file_system* fs,
if (rc)
return rc;
- if (S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
+ /*
+ * If the target inode is a directory and we cannot link directories
+ * return a not supported error code.
+ */
+ if (!link_dir && S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
{
rtems_rfs_inode_close (fs, &target_inode);
return ENOTSUP;
@@ -99,11 +105,12 @@ rtems_rfs_unlink (rtems_rfs_file_system* fs,
rtems_rfs_ino parent,
rtems_rfs_ino target,
uint32_t doff,
- bool dir)
+ rtems_rfs_unlink_dir dir_mode)
{
rtems_rfs_inode_handle parent_inode;
rtems_rfs_inode_handle target_inode;
uint16_t links;
+ bool dir;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
@@ -112,29 +119,35 @@ rtems_rfs_unlink (rtems_rfs_file_system* fs,
rc = rtems_rfs_inode_open (fs, target, &target_inode, true);
if (rc)
return rc;
-
+
+ /*
+ * If a directory process the unlink mode.
+ */
+
+ dir = RTEMS_RFS_S_ISDIR (rtems_rfs_inode_get_mode (&target_inode));
if (dir)
{
- rc = rtems_rfs_dir_empty (fs, &target_inode);
- if (rc > 0)
- {
- if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
- printf ("rtems-rfs: dir-empty: %d: %s\n", rc, strerror (rc));
- rtems_rfs_inode_close (fs, &target_inode);
- return rc;
- }
- }
- else
- {
- /*
- * Directories not allowed and the target is a directory.
- */
- if (RTEMS_RFS_S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
+ switch (dir_mode)
{
- if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
- printf ("rtems-rfs: link is a directory\n");
- rtems_rfs_inode_close (fs, &target_inode);
- return EISDIR;
+ case rtems_rfs_unlink_dir_denied:
+ if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
+ printf ("rtems-rfs: link is a directory\n");
+ rtems_rfs_inode_close (fs, &target_inode);
+ return EISDIR;
+
+ case rtems_rfs_unlink_dir_if_empty:
+ rc = rtems_rfs_dir_empty (fs, &target_inode);
+ if (rc > 0)
+ {
+ if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
+ printf ("rtems-rfs: dir-empty: %d: %s\n", rc, strerror (rc));
+ rtems_rfs_inode_close (fs, &target_inode);
+ return rc;
+ }
+ break;
+
+ default:
+ break;
}
}