From: Wolfgang Bumiller Date: Tue, 31 May 2016 12:58:26 +0000 (+0200) Subject: added: openat, mkdirat X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=commitdiff_plain;h=21c56a963f6bdcb8cd62aaf40fda4d5d26cb146b;hp=150f4bc65a2648369c5386fcc3ec4cbd513758b3 added: openat, mkdirat --- diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 8c7f373..3ad3794 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -12,6 +12,7 @@ use Filesys::Df (); # don't overwrite our df() use IO::Pipe; use IO::File; use IO::Dir; +use IO::Handle; use IPC::Open3; use Fcntl qw(:DEFAULT :flock); use base 'Exporter'; @@ -1322,4 +1323,24 @@ sub validate_ssh_public_keys { } } +sub openat($$$;$) { + my ($dirfd, $pathname, $flags, $mode) = @_; + my $fd = syscall(257, $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 + my $flagstr = ($flags & O_RDWR) ? 'rw' : ($flags & O_WRONLY) ? 'w' : 'r'; + 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 + $! = $err; + return undef; +} + +sub mkdirat($$$) { + my ($dirfd, $name, $mode) = @_; + return syscall(258, $dirfd, $name, $mode) == 0; +} + 1;