Add support for symbolic links
This patch adds support for symbolic links in libc, libc plugins, file system servers and Noux. Fixes #322.
This commit is contained in:
committed by
Norman Feske
parent
4017e592f0
commit
e9ac4b653b
@@ -34,9 +34,11 @@ namespace Noux {
|
||||
|
||||
bool syscall(Syscall sc)
|
||||
{
|
||||
static bool verbose = false;
|
||||
|
||||
bool result = call<Rpc_syscall>(sc);
|
||||
|
||||
if (result == false)
|
||||
if ((result == false) && verbose)
|
||||
PERR("syscall %s failed", syscall_name(sc));
|
||||
|
||||
return result;
|
||||
|
||||
@@ -34,7 +34,6 @@ namespace Noux {
|
||||
virtual Dataspace_capability sysio_dataspace() = 0;
|
||||
|
||||
enum Syscall {
|
||||
SYSCALL_GETCWD,
|
||||
SYSCALL_WRITE,
|
||||
SYSCALL_READ,
|
||||
SYSCALL_STAT,
|
||||
@@ -47,7 +46,6 @@ namespace Noux {
|
||||
SYSCALL_IOCTL,
|
||||
SYSCALL_LSEEK,
|
||||
SYSCALL_DIRENT,
|
||||
SYSCALL_FCHDIR,
|
||||
SYSCALL_EXECVE,
|
||||
SYSCALL_SELECT,
|
||||
SYSCALL_FORK,
|
||||
@@ -56,8 +54,10 @@ namespace Noux {
|
||||
SYSCALL_PIPE,
|
||||
SYSCALL_DUP2,
|
||||
SYSCALL_UNLINK,
|
||||
SYSCALL_READLINK,
|
||||
SYSCALL_RENAME,
|
||||
SYSCALL_MKDIR,
|
||||
SYSCALL_SYMLINK,
|
||||
SYSCALL_SOCKET,
|
||||
SYSCALL_GETSOCKOPT,
|
||||
SYSCALL_SETSOCKOPT,
|
||||
@@ -78,7 +78,6 @@ namespace Noux {
|
||||
static char const *syscall_name(Syscall sc)
|
||||
{
|
||||
switch (sc) {
|
||||
NOUX_DECL_SYSCALL_NAME(GETCWD)
|
||||
NOUX_DECL_SYSCALL_NAME(WRITE)
|
||||
NOUX_DECL_SYSCALL_NAME(READ)
|
||||
NOUX_DECL_SYSCALL_NAME(STAT)
|
||||
@@ -91,7 +90,6 @@ namespace Noux {
|
||||
NOUX_DECL_SYSCALL_NAME(IOCTL)
|
||||
NOUX_DECL_SYSCALL_NAME(LSEEK)
|
||||
NOUX_DECL_SYSCALL_NAME(DIRENT)
|
||||
NOUX_DECL_SYSCALL_NAME(FCHDIR)
|
||||
NOUX_DECL_SYSCALL_NAME(EXECVE)
|
||||
NOUX_DECL_SYSCALL_NAME(SELECT)
|
||||
NOUX_DECL_SYSCALL_NAME(FORK)
|
||||
@@ -100,8 +98,10 @@ namespace Noux {
|
||||
NOUX_DECL_SYSCALL_NAME(PIPE)
|
||||
NOUX_DECL_SYSCALL_NAME(DUP2)
|
||||
NOUX_DECL_SYSCALL_NAME(UNLINK)
|
||||
NOUX_DECL_SYSCALL_NAME(READLINK)
|
||||
NOUX_DECL_SYSCALL_NAME(RENAME)
|
||||
NOUX_DECL_SYSCALL_NAME(MKDIR)
|
||||
NOUX_DECL_SYSCALL_NAME(SYMLINK)
|
||||
NOUX_DECL_SYSCALL_NAME(SOCKET)
|
||||
NOUX_DECL_SYSCALL_NAME(GETSOCKOPT)
|
||||
NOUX_DECL_SYSCALL_NAME(SETSOCKOPT)
|
||||
|
||||
@@ -286,18 +286,20 @@ namespace Noux {
|
||||
|
||||
enum General_error { ERR_FD_INVALID, NUM_GENERAL_ERRORS };
|
||||
enum Stat_error { STAT_ERR_NO_ENTRY = NUM_GENERAL_ERRORS };
|
||||
enum Fchdir_error { FCHDIR_ERR_NOT_DIR = NUM_GENERAL_ERRORS };
|
||||
enum Fcntl_error { FCNTL_ERR_CMD_INVALID = NUM_GENERAL_ERRORS };
|
||||
enum Ftruncate_error { FTRUNCATE_ERR_NO_PERM = NUM_GENERAL_ERRORS };
|
||||
enum Open_error { OPEN_ERR_UNACCESSIBLE, OPEN_ERR_NO_PERM,
|
||||
OPEN_ERR_EXISTS };
|
||||
enum Execve_error { EXECVE_NONEXISTENT = NUM_GENERAL_ERRORS };
|
||||
enum Unlink_error { UNLINK_ERR_NO_ENTRY, UNLINK_ERR_NO_PERM };
|
||||
enum Readlink_error { READLINK_ERR_NO_ENTRY };
|
||||
enum Rename_error { RENAME_ERR_NO_ENTRY, RENAME_ERR_CROSS_FS,
|
||||
RENAME_ERR_NO_PERM };
|
||||
enum Mkdir_error { MKDIR_ERR_EXISTS, MKDIR_ERR_NO_ENTRY,
|
||||
MKDIR_ERR_NO_SPACE, MKDIR_ERR_NO_PERM,
|
||||
MKDIR_ERR_NAME_TOO_LONG};
|
||||
enum Symlink_error { SYMLINK_ERR_EXISTS, SYMLINK_ERR_NO_ENTRY,
|
||||
SYMLINK_ERR_NAME_TOO_LONG};
|
||||
|
||||
enum Read_error { READ_ERR_AGAIN, READ_ERR_WOULD_BLOCK,
|
||||
READ_ERR_INVALID, READ_ERR_IO };
|
||||
@@ -338,14 +340,15 @@ namespace Noux {
|
||||
union {
|
||||
General_error general;
|
||||
Stat_error stat;
|
||||
Fchdir_error fchdir;
|
||||
Fcntl_error fcntl;
|
||||
Ftruncate_error ftruncate;
|
||||
Open_error open;
|
||||
Execve_error execve;
|
||||
Unlink_error unlink;
|
||||
Readlink_error readlink;
|
||||
Rename_error rename;
|
||||
Mkdir_error mkdir;
|
||||
Symlink_error symlink;
|
||||
Read_error read;
|
||||
Write_error write;
|
||||
Accept_error accept;
|
||||
@@ -360,13 +363,13 @@ namespace Noux {
|
||||
|
||||
union {
|
||||
|
||||
SYSIO_DECL(getcwd, { }, { Path path; });
|
||||
|
||||
SYSIO_DECL(write, { int fd; size_t count; Chunk chunk; },
|
||||
{ size_t count; });
|
||||
|
||||
SYSIO_DECL(stat, { Path path; }, { Stat st; });
|
||||
|
||||
SYSIO_DECL(symlink, { Path oldpath; Path newpath; }, { });
|
||||
|
||||
SYSIO_DECL(fstat, { int fd; }, { Stat st; });
|
||||
|
||||
SYSIO_DECL(ftruncate, { int fd; off_t length; }, { });
|
||||
@@ -385,11 +388,12 @@ namespace Noux {
|
||||
|
||||
SYSIO_DECL(dirent, { int fd; }, { Dirent entry; });
|
||||
|
||||
SYSIO_DECL(fchdir, { int fd; }, { });
|
||||
|
||||
SYSIO_DECL(read, { int fd; size_t count; },
|
||||
{ Chunk chunk; size_t count; });
|
||||
|
||||
SYSIO_DECL(readlink, { Path path; size_t bufsiz; },
|
||||
{ Chunk chunk; ssize_t count; });
|
||||
|
||||
SYSIO_DECL(execve, { Path filename; Args args; Env env; }, { });
|
||||
|
||||
SYSIO_DECL(select, { Select_fds fds; Select_timeout timeout; },
|
||||
|
||||
Reference in New Issue
Block a user