X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FTools.pm;h=4b445eafa784d526250e7632d93f02158645b8a7;hp=c91e933e0b012e844b53df71172772d1e2a87f16;hb=HEAD;hpb=a992ba134c8ef83cc7e405bf616f3010c1718f73 diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index c91e933..766c809 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -62,6 +62,20 @@ CLONE_NEWIPC CLONE_NEWUSER CLONE_NEWPID CLONE_NEWNET +MS_RDONLY +MS_NOSUID +MS_NODEV +MS_NOEXEC +MS_SYNCHRONOUS +MS_REMOUNT +MS_MANDLOCK +MS_DIRSYNC +MS_NOSYMFOLLOW +MS_NOATIME +MS_NODIRATIME +MS_BIND +MS_MOVE +MS_REC ); my $pvelogdir = "/var/log/pve"; @@ -110,6 +124,23 @@ use constant {RENAME_NOREPLACE => (1 << 0), RENAME_EXCHANGE => (1 << 1), RENAME_WHITEOUT => (1 << 2)}; +use constant { + MS_RDONLY => (1), + MS_NOSUID => (1 << 1), + MS_NODEV => (1 << 2), + MS_NOEXEC => (1 << 3), + MS_SYNCHRONOUS => (1 << 4), + MS_REMOUNT => (1 << 5), + MS_MANDLOCK => (1 << 6), + MS_DIRSYNC => (1 << 7), + MS_NOSYMFOLLOW => (1 << 8), + MS_NOATIME => (1 << 10), + MS_NODIRATIME => (1 << 11), + MS_BIND => (1 << 12), + MS_MOVE => (1 << 13), + MS_REC => (1 << 14), +}; + sub run_with_timeout { my ($timeout, $code, @param) = @_; @@ -1720,6 +1751,11 @@ sub mkdirat($$$) { return syscall(PVE::Syscall::mkdirat, int($dirfd), $name, int($mode)) == 0; } +sub mknod($$$) { + my ($filename, $mode, $dev) = @_; + return syscall(PVE::Syscall::SYS_mknod, $filename, int($mode), int($dev)) == 0; +} + sub fchownat($$$$$) { my ($dirfd, $pathname, $owner, $group, $flags) = @_; return syscall( @@ -2114,4 +2150,35 @@ sub get_file_hash { return lc($digest); } +# compare two perl variables recursively, so this works for scalars, nested +# hashes and nested arrays +sub is_deeply { + my ($a, $b) = @_; + + return 0 if defined($a) != defined($b); + return 1 if !defined($a); # both are undef + + my ($ref_a, $ref_b) = (ref($a), ref($b)); + + # scalar case + return 0 if !$ref_a && !$ref_b && "$a" ne "$b"; + + # different types, ok because ref never returns undef, only empty string + return 0 if $ref_a ne $ref_b; + + if ($ref_a eq 'HASH') { + return 0 if scalar(keys $a->%*) != scalar(keys $b->%*); + for my $opt (keys $a->%*) { + return 0 if !is_deeply($a->{$opt}, $b->{$opt}); + } + } elsif ($ref_a eq 'ARRAY') { + return 0 if scalar($a->@*) != scalar($b->@*); + for (my $i = 0; $i < $a->@*; $i++) { + return 0 if !is_deeply($a->[$i], $b->[$i]); + } + } + + return 1; +} + 1;