X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FTools.pm;h=a1571ea3d9fa8c05746fea45ad7c525b197d5c6d;hp=2038abf65fecc1318849628eb060a3edfccf59ed;hb=d94f7005cee0677d186f67b5641cd4a96824477c;hpb=9cccad5e3ed3ca69efbcbf90495b6c26a894caab diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 2038abf..a1571ea 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -302,7 +302,7 @@ sub safe_read_from { my ($fh, $max, $oneline, $filename) = @_; # pmxcfs file size limit - $max = 512*1024 if !$max; + $max = 1024 * 1024 if !$max; my $subject = defined($filename) ? "file '$filename'" : 'input'; @@ -1581,6 +1581,13 @@ sub sendmail { close($mail); } +# creates a temporary file that does not shows up on the file system hierarchy. +# +# Uses O_TMPFILE if available, which makes it just an anon inode that never shows up in the FS. +# If O_TMPFILE is not available, which unlikely nowadays (added in 3.11 kernel and all FS relevant +# for us support it) back to open-create + immediate unlink while still holding the file handle. +# +# TODO: to avoid FS dependent features we could (transparently) switch to memfd_create as backend sub tempfile { my ($perm, %opts) = @_; @@ -1611,6 +1618,7 @@ sub tempfile { return $fh; } +# create an (ideally) anon file with the $data as content and return its FD-path and FH sub tempfile_contents { my ($data, $perm, %opts) = @_; @@ -1856,6 +1864,37 @@ sub mount($$$$$) { ); } +# size is optional and defaults to 256, note that xattr limits are FS specific and that xattrs can +# get arbitrary long. pass `0` for $size in array context to get the actual size of a value +sub getxattr($$;$) { + my ($path_or_handle, $name, $size) = @_; + $size //= 256; + my $buf = pack("x${size}"); + + my $xattr_size = -1; # the actual size of the xattr, can be zero + if (defined(my $fd = fileno($path_or_handle))) { + $xattr_size = syscall(&PVE::Syscall::fgetxattr, $fd, $name, $buf, $size); + } else { + $xattr_size = syscall(&PVE::Syscall::getxattr, $path_or_handle, $name, $buf, $size); + } + if ($xattr_size < 0) { + return undef; + } + return wantarray ? ($buf, $xattr_size) : $buf; +} + +# NOTE: can take either a path or an open file handle, i.e., its multiplexing setxattr and fsetxattr +sub setxattr($$$;$) { + my ($path_or_handle, $name, $value, $flags) = @_; + my $size = length($value); # NOTE: seems to get correct length also for wide-characters in text.. + + if (defined(my $fd = fileno($path_or_handle))) { + return 0 == syscall(&PVE::Syscall::fsetxattr, $fd, $name, $value, $size, $flags // 0); + } else { + return 0 == syscall(&PVE::Syscall::setxattr, $path_or_handle, $name, $value, $size, $flags // 0); + } +} + sub safe_compare { my ($left, $right, $cmp) = @_;