From 92a339befd851643fba679eb5f7856ff86c87ec9 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Thu, 23 Mar 2017 17:59:25 +0100 Subject: [PATCH] rump_fs: handle errors on mkdir correctly --- repos/dde_rump/run/rump_ext2.run | 11 +++++------ repos/dde_rump/src/server/rump_fs/directory.h | 9 ++++++++- repos/libports/src/test/libc_ffat/main.cc | 3 +++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/repos/dde_rump/run/rump_ext2.run b/repos/dde_rump/run/rump_ext2.run index b958397a33..82a2a776e2 100644 --- a/repos/dde_rump/run/rump_ext2.run +++ b/repos/dde_rump/run/rump_ext2.run @@ -65,12 +65,11 @@ append config { - - - - - - + + + + + } diff --git a/repos/dde_rump/src/server/rump_fs/directory.h b/repos/dde_rump/src/server/rump_fs/directory.h index 25d080a231..588a6440c7 100644 --- a/repos/dde_rump/src/server/rump_fs/directory.h +++ b/repos/dde_rump/src/server/rump_fs/directory.h @@ -50,7 +50,14 @@ class File_system::Directory : public Node mode_t ugo = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; ret = rump_sys_mkdir(path, ugo); if (ret == -1) - throw No_space(); + switch (errno) { + case ENAMETOOLONG: throw Name_too_long(); + case EACCES: throw Permission_denied(); + case ENOENT: throw Lookup_failed(); + case EEXIST: throw Node_already_exists(); + case ENOSPC: + default: throw No_space(); + } } struct stat s; diff --git a/repos/libports/src/test/libc_ffat/main.cc b/repos/libports/src/test/libc_ffat/main.cc index 1fc88fda13..def23f5ac2 100644 --- a/repos/libports/src/test/libc_ffat/main.cc +++ b/repos/libports/src/test/libc_ffat/main.cc @@ -119,6 +119,9 @@ static void test(Genode::Xml_node node) /* create directory (short name) */ CALL_AND_CHECK(ret, mkdir(dir_name, 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", dir_name); + /* try to create again */ + CALL_AND_CHECK(ret, mkdir(dir_name, 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", dir_name); + /* change to new directory */ CALL_AND_CHECK(ret, chdir(dir_name), ret == 0, "dir_name=%s", dir_name);