swap raw syscall numbers with syscall.ph for easier porting

Raw syscall numbers were not platform independent, so replace them
with the helpers provided from the syscall.ph perl bits helper.

This makes reading the code easier as a nice side effect.

As syscall.ph is not an ordinary module and makes problems when it is
required by multiple modules we make a own module PVE::Syscall which
loads it and allows to export the necessary constants in a sane way.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2017-05-10 15:03:45 +02:00 committed by Wolfgang Bumiller
parent 1cffb285c5
commit c8e94d4bb5
3 changed files with 30 additions and 6 deletions

View File

@ -23,6 +23,7 @@ LIB_SOURCES= \
AtomicFile.pm \
INotify.pm \
Tools.pm \
Syscall.pm \
Exception.pm
all:

22
src/PVE/Syscall.pm Normal file
View File

@ -0,0 +1,22 @@
package PVE::Syscall;
my %syscalls;
BEGIN {
die "syscall.ph can only be required once!\n" if $INC{'syscall.ph'};
require("syscall.ph");
%syscalls = (
unshare => &SYS_unshare,
setns => &SYS_setns,
syncfs => &SYS_syncfs,
openat => &SYS_openat,
close => &SYS_close,
mkdirat => &SYS_mkdirat,
faccessat => &SYS_faccessat,
);
};
use constant \%syscalls;
use base 'Exporter';
our @EXPORT_OK = keys(%syscalls);

View File

@ -26,6 +26,7 @@ use Net::DBus qw(dbus_uint32 dbus_uint64);
use Net::DBus::Callback;
use Net::DBus::Reactor;
use Scalar::Util 'weaken';
use PVE::Syscall;
# avoid warning when parsing long hex values with hex()
no warnings 'portable'; # Support for 64-bit ints required
@ -1248,17 +1249,17 @@ sub parse_host_and_port {
sub unshare($) {
my ($flags) = @_;
return 0 == syscall(272, $flags);
return 0 == syscall(PVE::Syscall::unshare, $flags);
}
sub setns($$) {
my ($fileno, $nstype) = @_;
return 0 == syscall(308, $fileno, $nstype);
return 0 == syscall(PVE::Syscall::setns, $fileno, $nstype);
}
sub syncfs($) {
my ($fileno) = @_;
return 0 == syscall(306, $fileno);
return 0 == syscall(PVE::Syscall::syncfs, $fileno);
}
sub sync_mountpoint {
@ -1390,7 +1391,7 @@ sub validate_ssh_public_keys {
sub openat($$$;$) {
my ($dirfd, $pathname, $flags, $mode) = @_;
my $fd = syscall(257, $dirfd, $pathname, $flags, $mode//0);
my $fd = syscall(PVE::Syscall::openat, $dirfd, $pathname, $flags, $mode//0);
return undef if $fd < 0;
# sysopen() doesn't deal with numeric file descriptors apparently
# so we need to convert to a mode string for IO::Handle->new_from_fd
@ -1398,14 +1399,14 @@ sub openat($$$;$) {
my $handle = IO::Handle->new_from_fd($fd, $flagstr);
return $handle if $handle;
my $err = $!; # save error before closing the raw fd
syscall(3, $fd); # close
syscall(PVE::Syscall::close, $fd); # close
$! = $err;
return undef;
}
sub mkdirat($$$) {
my ($dirfd, $name, $mode) = @_;
return syscall(258, $dirfd, $name, $mode) == 0;
return syscall(PVE::Syscall::mkdirat, $dirfd, $name, $mode) == 0;
}
# NOTE: This calls the dbus main loop and must not be used when another dbus