use strict;
use warnings;
-use POSIX qw(EINTR);
+use POSIX qw(EINTR EEXIST EOPNOTSUPP);
use IO::Socket::IP;
use Socket qw(AF_INET AF_INET6 AI_ALL AI_V4MAPPED);
use IO::Select;
my $tmpname = "$filename.tmp.$$";
eval {
- my $fh = IO::File->new($tmpname, O_WRONLY|O_CREAT, $perm);
+ my ($fh, $tries) = (undef, 0);
+ while (!$fh && $tries++ < 3) {
+ $fh = IO::File->new($tmpname, O_WRONLY|O_CREAT|O_EXCL, $perm);
+ if (!$fh && $! == EEXIST) {
+ unlink($tmpname) or die "unable to delete old temp file: $!\n";
+ }
+ }
die "unable to open file '$tmpname' - $!\n" if !$fh;
die "unable to write '$tmpname' - $!\n" unless print $fh $data;
die "closing file '$tmpname' failed - $!\n" unless close $fh;
$pipe->reader();
my $readvalues = sub {
- $res->{total} = int(<$pipe>);
- $res->{used} = int(<$pipe>);
- $res->{avail} = int(<$pipe>);
+ $res->{total} = int((<$pipe> =~ /^(\d*)$/)[0]);
+ $res->{used} = int((<$pipe> =~ /^(\d*)$/)[0]);
+ $res->{avail} = int((<$pipe> =~ /^(\d*)$/)[0]);
};
eval {
run_with_timeout($timeout, $readvalues);
}
sub random_ether_addr {
+ my ($prefix) = @_;
my ($seconds, $microseconds) = gettimeofday;
- my $rand = Digest::SHA::sha1_hex($$, rand(), $seconds, $microseconds);
+ my $rand = Digest::SHA::sha1($$, rand(), $seconds, $microseconds);
# clear multicast, set local id
vec($rand, 0, 8) = (vec($rand, 0, 8) & 0xfe) | 2;
- return sprintf("%02X:%02X:%02X:%02X:%02X:%02X", unpack("C6", $rand));
+ my $addr = sprintf("%02X:%02X:%02X:%02X:%02X:%02X", unpack("C6", $rand));
+ if (defined($prefix)) {
+ $addr = uc($prefix) . substr($addr, length($prefix));
+ }
+ return $addr;
}
sub shellquote {
# default permissions are stricter than with file_set_contents
$perm = 0600 if !defined($perm);
- my $dir = $opts{dir} // '/tmp';
+ my $dir = $opts{dir} // '/run';
my $mode = $opts{mode} // O_RDWR;
$mode |= O_EXCL if !$opts{allow_links};
- my $fh = IO::File->new($dir, $mode | O_TMPFILE, $perm)
- or die "failed to create tempfile: $!\n";
+ my $fh = IO::File->new($dir, $mode | O_TMPFILE, $perm);
+ if (!$fh && $! == EOPNOTSUPP) {
+ $dir .= "/.tmpfile.$$";
+ $fh = IO::File->new($dir, $mode | O_CREAT | O_EXCL, $perm);
+ unlink($dir) if $fh;
+ }
+ die "failed to create tempfile: $!\n" if !$fh;
return $fh;
}