1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 19:17:44 +00:00

AK+LibSystem+LibMain: Add Error::from_syscall() for syscall failures

This creates an error that contains the name of the syscall that failed.
This allows error handlers to print out the name of the call if they
want to. :^)
This commit is contained in:
Andreas Kling 2021-11-22 16:00:53 +01:00
parent d3cf68a540
commit 4e530135d5
3 changed files with 26 additions and 7 deletions

View file

@ -8,6 +8,7 @@
#include <AK/StringView.h>
#include <AK/Vector.h>
#include <LibMain/Main.h>
#include <string.h>
int main(int argc, char** argv)
{
@ -22,7 +23,13 @@ int main(int argc, char** argv)
.arguments = arguments.span(),
});
if (result.is_error()) {
warnln("Runtime error: {}", result.error());
auto error = result.release_error();
if (error.is_syscall())
warnln("Runtime error: {}: {} (errno={})", error.string_literal(), strerror(error.code()), error.code());
else if (error.is_errno())
warnln("Runtime error: {} (errno={})", strerror(error.code()), error.code());
else
warnln("Runtime error: {}", error.string_literal());
return 1;
}
return result.value();

View file

@ -7,6 +7,12 @@
#include <LibSystem/Wrappers.h>
#include <LibSystem/syscall.h>
#define HANDLE_SYSCALL_RETURN_VALUE(syscall_name, rc) \
if ((rc) < 0) { \
return Error::from_syscall(syscall_name, rc); \
} \
return {};
namespace System {
ErrorOr<void> pledge(StringView promises, StringView execpromises)
@ -16,9 +22,7 @@ ErrorOr<void> pledge(StringView promises, StringView execpromises)
{ execpromises.characters_without_null_termination(), execpromises.length() },
};
int rc = syscall(SC_pledge, &params);
if (rc < 0)
return Error::from_errno(-rc);
return {};
HANDLE_SYSCALL_RETURN_VALUE("pledge"sv, rc);
}
ErrorOr<void> unveil(StringView path, StringView permissions)
@ -28,9 +32,7 @@ ErrorOr<void> unveil(StringView path, StringView permissions)
{ permissions.characters_without_null_termination(), permissions.length() },
};
int rc = syscall(SC_unveil, &params);
if (rc < 0)
return Error::from_errno(-rc);
return {};
HANDLE_SYSCALL_RETURN_VALUE("unveil"sv, rc);
}
}