]>
git.proxmox.com Git - pve-client.git/blob - Tools.pm
2d0b7276037b28a83559252d86d86e81235eb185
5 use POSIX
qw(EINTR EEXIST EOPNOTSUPP);
19 my $IPV4OCTET = "(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])";
20 our $IPV4RE = "(?:(?:$IPV4OCTET\\.){3}$IPV4OCTET)";
21 my $IPV6H16 = "(?:[0-9a-fA-F]{1,4})";
22 my $IPV6LS32 = "(?:(?:$IPV4RE|$IPV6H16:$IPV6H16))";
25 "(?:(?:" . "(?:$IPV6H16:){6})$IPV6LS32)|" .
26 "(?:(?:" . "::(?:$IPV6H16:){5})$IPV6LS32)|" .
27 "(?:(?:(?:" . "$IPV6H16)?::(?:$IPV6H16:){4})$IPV6LS32)|" .
28 "(?:(?:(?:(?:$IPV6H16:){0,1}$IPV6H16)?::(?:$IPV6H16:){3})$IPV6LS32)|" .
29 "(?:(?:(?:(?:$IPV6H16:){0,2}$IPV6H16)?::(?:$IPV6H16:){2})$IPV6LS32)|" .
30 "(?:(?:(?:(?:$IPV6H16:){0,3}$IPV6H16)?::(?:$IPV6H16:){1})$IPV6LS32)|" .
31 "(?:(?:(?:(?:$IPV6H16:){0,4}$IPV6H16)?::" . ")$IPV6LS32)|" .
32 "(?:(?:(?:(?:$IPV6H16:){0,5}$IPV6H16)?::" . ")$IPV6H16)|" .
33 "(?:(?:(?:(?:$IPV6H16:){0,6}$IPV6H16)?::" . ")))";
35 our $IPRE = "(?:$IPV4RE|$IPV6RE)";
37 sub file_set_contents
{
38 my ($filename, $data, $perm) = @_;
40 $perm = 0644 if !defined($perm);
42 my $tmpname = "$filename.tmp.$$";
45 my ($fh, $tries) = (undef, 0);
46 while (!$fh && $tries++ < 3) {
47 $fh = IO
::File-
>new($tmpname, O_WRONLY
|O_CREAT
|O_EXCL
, $perm);
48 if (!$fh && $! == EEXIST
) {
49 unlink($tmpname) or die "unable to delete old temp file: $!\n";
52 die "unable to open file '$tmpname' - $!\n" if !$fh;
53 die "unable to write '$tmpname' - $!\n" unless print $fh $data;
54 die "closing file '$tmpname' failed - $!\n" unless close $fh;
63 if (!rename($tmpname, $filename)) {
64 my $msg = "close (rename) atomic file '$filename' failed: $!\n";
70 sub file_get_contents
{
71 my ($filename, $max) = @_;
73 my $fh = IO
::File-
>new($filename, "r") ||
74 die "can't open '$filename' - $!\n";
76 my $content = safe_read_from
($fh, $max, 0, $filename);
83 sub file_read_firstline
{
86 my $fh = IO
::File-
>new ($filename, "r");
95 my ($fh, $max, $oneline, $filename) = @_;
97 $max = 32768 if !$max;
99 my $subject = defined($filename) ?
"file '$filename'" : 'input';
104 while ($count = sysread($fh, $input, 8192, $br)) {
106 die "$subject too long - aborting\n" if $br > $max;
107 if ($oneline && $input =~ m/^(.*)\n/) {
112 die "unable to read $subject - $!\n" if !defined($count);
118 my $listtxt = shift || '';
120 return split (/\0/, $listtxt) if $listtxt =~ m/\0/;
122 $listtxt =~ s/[,;]/ /g;
123 $listtxt =~ s/^\s+//;
125 my @data = split (/\s+/, $listtxt);
130 # split an shell argument string into an array,
134 return $str ?
[ Text
::ParseWords
::shellwords
($str) ] : [];