lib/libc: remove internal use of getcwd at fstatat

The implementation and behaviour of 'getcwd' is externally defined.

Add move operators to Genode::Path.

Issue: #1984
This commit is contained in:
Emery Hemingway 2016-05-31 12:40:35 +02:00 committed by Christian Helmuth
parent 597cdc846c
commit 930e2638b2
2 changed files with 24 additions and 9 deletions

View File

@ -110,7 +110,7 @@ static void resolve_symlinks(char const *path, Absolute_path &resolved_path)
throw Symlink_resolve_error();
}
current_iteration_working_path.import(next_iteration_working_path.base());
current_iteration_working_path = next_iteration_working_path;
PDBGV("current_iteration_working_path = %s", current_iteration_working_path.base());
next_iteration_working_path.import("");
@ -184,7 +184,7 @@ static void resolve_symlinks(char const *path, Absolute_path &resolved_path)
} while (symlink_resolved_in_this_iteration);
resolved_path.import(next_iteration_working_path.base());
resolved_path = next_iteration_working_path;
resolved_path.remove_trailing('/');
PDBGV("resolved_path = %s", resolved_path.base());
}
@ -363,7 +363,7 @@ extern "C" int fstatat(int libc_fd, char const *path, struct stat *buf, int flag
Libc::Absolute_path abs_path;
if (libc_fd == AT_FDCWD) {
getcwd(abs_path.base(), abs_path.capacity());
abs_path = cwd();
abs_path.append("/");
abs_path.append(path);
} else {

View File

@ -192,6 +192,8 @@ class Genode::Path_base
void _strip_from_begin(unsigned count) { strip(_path, count); }
protected:
/**
* Remove superfluous artifacts from absolute path
*/
@ -203,7 +205,9 @@ class Genode::Path_base
remove_trailing('.', _path);
}
void _import(char const *path, char const *pwd = 0)
public:
void import(char const *path, char const *pwd = 0)
{
/*
* Validate 'pwd' argument, if not supplied, enforce invariant
@ -237,18 +241,14 @@ class Genode::Path_base
_canonicalize();
}
public:
Path_base(char *buf, size_t buf_len,
char const *path, char const *pwd = 0)
:
_path(buf), _path_max_len(buf_len)
{
_import(path, pwd);
import(path, pwd);
}
void import(char const *path, char const *pwd = 0) { _import(path, pwd); }
char *base() { return _path; }
char const *base() const { return _path; }
@ -345,6 +345,21 @@ class Genode::Path : public Path_base {
: Path_base(_buf, sizeof(_buf), path, pwd) { }
constexpr size_t capacity() { return MAX_LEN; }
Path& operator=(char const *path)
{
Genode::strncpy(_buf, path, MAX_LEN);
_canonicalize();
return *this;
}
template <unsigned N>
Path& operator=(Path<N> &other)
{
Genode::strncpy(_buf, other._buf, MAX_LEN);
return *this;
}
};
#endif /* _INCLUDE__OS__PATH_H_ */