[pve-devel] [PATCH common] swap raw syscall numbers with syscall.ph for easier porting
Thomas Lamprecht
t.lamprecht at proxmox.com
Wed May 10 15:03:45 CEST 2017
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 at proxmox.com>
---
src/Makefile | 1 +
src/PVE/Syscall.pm | 22 ++++++++++++++++++++++
src/PVE/Tools.pm | 13 +++++++------
3 files changed, 30 insertions(+), 6 deletions(-)
create mode 100644 src/PVE/Syscall.pm
diff --git a/src/Makefile b/src/Makefile
index a45effb..894000e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -22,6 +22,7 @@ LIB_SOURCES= \
AtomicFile.pm \
INotify.pm \
Tools.pm \
+ Syscall.pm \
Exception.pm
all:
diff --git a/src/PVE/Syscall.pm b/src/PVE/Syscall.pm
new file mode 100644
index 0000000..87db66a
--- /dev/null
+++ b/src/PVE/Syscall.pm
@@ -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);
diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm
index 1fe7f4c..86b321a 100644
--- a/src/PVE/Tools.pm
+++ b/src/PVE/Tools.pm
@@ -25,6 +25,7 @@ use Time::HiRes qw(usleep gettimeofday tv_interval alarm);
use Net::DBus qw(dbus_uint32 dbus_uint64);
use Net::DBus::Callback;
use Net::DBus::Reactor;
+use PVE::Syscall;
# avoid warning when parsing long hex values with hex()
no warnings 'portable'; # Support for 64-bit ints required
@@ -1233,17 +1234,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 {
@@ -1375,7 +1376,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
@@ -1383,14 +1384,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
--
2.11.0
More information about the pve-devel
mailing list