diff --git a/repos/libports/src/lib/libc/file_operations.cc b/repos/libports/src/lib/libc/file_operations.cc index 16c4edf95c..93f090650d 100644 --- a/repos/libports/src/lib/libc/file_operations.cc +++ b/repos/libports/src/lib/libc/file_operations.cc @@ -128,8 +128,7 @@ static void resolve_symlinks(char const *path, Absolute_path &resolved_path) PDBGV("path_element = %s", path_element); try { - next_iteration_working_path.append("/"); - next_iteration_working_path.append(path_element); + next_iteration_working_path.append_element(path_element); } catch (Genode::Path_base::Path_too_long) { errno = ENAMETOOLONG; throw Symlink_resolve_error(); @@ -167,7 +166,7 @@ static void resolve_symlinks(char const *path, Absolute_path &resolved_path) /* relative target */ next_iteration_working_path.strip_last_element(); try { - next_iteration_working_path.append(symlink_target); + next_iteration_working_path.append_element(symlink_target); } catch (Genode::Path_base::Path_too_long) { errno = ENAMETOOLONG; throw Symlink_resolve_error(); @@ -203,7 +202,7 @@ static void resolve_symlinks_except_last_element(char const *path, Absolute_path Absolute_path absolute_path_last_element(path, cwd().base()); absolute_path_last_element.keep_only_last_element(); try { - resolved_path.append(absolute_path_last_element.base()); + resolved_path.append_element(absolute_path_last_element.base()); } catch (Genode::Path_base::Path_too_long) { errno = ENAMETOOLONG; throw Symlink_resolve_error(); @@ -364,8 +363,7 @@ extern "C" int fstatat(int libc_fd, char const *path, struct stat *buf, int flag if (libc_fd == AT_FDCWD) { abs_path = cwd(); - abs_path.append("/"); - abs_path.append(path); + abs_path.append_element(path); } else { Libc::File_descriptor *fd = Libc::file_descriptor_allocator()->find_by_libc_fd(libc_fd); diff --git a/repos/os/include/file_system/util.h b/repos/os/include/file_system/util.h index 435f5a470b..8e2dcfe133 100644 --- a/repos/os/include/file_system/util.h +++ b/repos/os/include/file_system/util.h @@ -4,6 +4,13 @@ * \date 2012-04-11 */ +/* + * Copyright (C) 2012-2016 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + #ifndef _FILE_SYSTEM__UTIL_H_ #define _FILE_SYSTEM__UTIL_H_ @@ -89,7 +96,6 @@ namespace File_system { } catch (Lookup_failed) { Genode::Path target(path); target.strip_last_element(); - target.remove_trailing('/'); fs.close(ensure_dir(fs, target.base())); } } diff --git a/repos/os/include/os/path.h b/repos/os/include/os/path.h index 62024ec483..b9e553a777 100644 --- a/repos/os/include/os/path.h +++ b/repos/os/include/os/path.h @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2011-2013 Genode Labs GmbH + * Copyright (C) 2011-2016 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. @@ -267,7 +267,8 @@ class Genode::Path_base void strip_last_element() { - last_element(_path)[1] = 0; + char *p = last_element(_path); + p[p == _path ? 1 : 0] = 0; } bool equals(Path_base const &ref) const { return strcmp(ref._path, _path) == 0; } @@ -310,6 +311,12 @@ class Genode::Path_base void append(char const *str) { _append(str); _canonicalize(); } + void append_element(char const *str) + { + _append("/"); _append(str); + _canonicalize(); + } + bool operator == (char const *other) const { return strcmp(_path, other) == 0; diff --git a/repos/os/include/vfs/fs_file_system.h b/repos/os/include/vfs/fs_file_system.h index 9b7c62c4c6..0989d71369 100644 --- a/repos/os/include/vfs/fs_file_system.h +++ b/repos/os/include/vfs/fs_file_system.h @@ -173,7 +173,6 @@ class Vfs::Fs_file_system : public File_system Absolute_path dir_path(path); dir_path.strip_last_element(); - dir_path.remove_trailing('/'); Absolute_path file_name(path); file_name.keep_only_last_element(); @@ -340,7 +339,6 @@ class Vfs::Fs_file_system : public File_system { Absolute_path dir_path(path); dir_path.strip_last_element(); - dir_path.remove_trailing('/'); Absolute_path file_name(path); file_name.keep_only_last_element(); @@ -368,7 +366,6 @@ class Vfs::Fs_file_system : public File_system */ Absolute_path abs_path(path); abs_path.strip_last_element(); - abs_path.remove_trailing('/'); Absolute_path symlink_name(path); symlink_name.keep_only_last_element(); @@ -397,14 +394,12 @@ class Vfs::Fs_file_system : public File_system Absolute_path from_dir_path(from_path); from_dir_path.strip_last_element(); - from_dir_path.remove_trailing('/'); Absolute_path from_file_name(from_path); from_file_name.keep_only_last_element(); Absolute_path to_dir_path(to_path); to_dir_path.strip_last_element(); - to_dir_path.remove_trailing('/'); Absolute_path to_file_name(to_path); to_file_name.keep_only_last_element(); @@ -457,7 +452,6 @@ class Vfs::Fs_file_system : public File_system */ Absolute_path abs_path(to); abs_path.strip_last_element(); - abs_path.remove_trailing('/'); Absolute_path symlink_name(to); symlink_name.keep_only_last_element(); @@ -528,7 +522,6 @@ class Vfs::Fs_file_system : public File_system Absolute_path dir_path(path); dir_path.strip_last_element(); - dir_path.remove_trailing('/'); Absolute_path file_name(path); file_name.keep_only_last_element();