[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