+# Note: we use this to wait until vncterm/spiceterm is ready
+sub wait_for_vnc_port {
+ my ($port, $timeout) = @_;
+
+ $timeout = 5 if !$timeout;
+ my $sleeptime = 0;
+ my $starttime = [gettimeofday];
+ my $elapsed;
+
+ while (($elapsed = tv_interval($starttime)) < $timeout) {
+ if (my $fh = IO::File->new ("/proc/net/tcp", "r")) {
+ while (defined (my $line = <$fh>)) {
+ if ($line =~ m/^\s*\d+:\s+([0-9A-Fa-f]{8}):([0-9A-Fa-f]{4})\s/) {
+ if ($port == hex($2)) {
+ close($fh);
+ return 1;
+ }
+ }
+ }
+ close($fh);
+ }
+ $sleeptime += 100000 if $sleeptime < 1000000;
+ usleep($sleeptime);
+ }
+
+ return undef;
+}
+
+sub next_unused_port {
+ my ($range_start, $range_end) = @_;
+
+ # We use a file to register allocated ports.
+ # Those registrations expires after $expiretime.
+ # We use this to avoid race conditions between
+ # allocation and use of ports.
+
+ my $filename = "/var/tmp/pve-reserved-ports";