3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-14 16:09:34 +01:00
pbot/applets/compiler_vm/guest/bin/accept-vsock-client
Pragmatic Software 1326b0ac5f compiler_vm: major refactor to support VM sockets (AF_VSOCK)
VM socket communication is superior to VM serial communication in
every way. Unfortunately at this time only Linux supports them.
Fortunately, that's 99% of PBot's userbase.

If you're not using Linux or if you're using an older Linux that
does not support VM sockets, the PBot VM scripts will gracefully
fallback to using the serial connection. You may explicitly
disable VM socket connection attempts by setting PBOTVM_CID=0.
2022-02-12 16:06:04 -08:00

70 lines
1.3 KiB
Perl
Executable File

#!/usr/bin/env perl
# File: accept-vsock-client
#
# Purpose: Accepts and handles a client connecting over Linux VM socket.
# SPDX-FileCopyrightText: 2022 Pragmatic Software <pragma78@gmail.com>
# SPDX-License-Identifier: MIT
use 5.020;
use warnings;
use strict;
use feature qw/signatures/;
no warnings qw(experimental::signatures);
use constant {
USERNAME => 'vm',
MOD_DIR => '/usr/local/share/pbot-vm/',
};
use lib MOD_DIR;
use Guest;
sub accept_client() {
print STDERR "VSOCK accepted new connection.\n";
my $buffer = '';
while (1) {
my $command = Guest::read_input(*STDIN, \$buffer, 'VSOCK');
if (not defined $command) {
# recoverable error or waiting for more input
next;
}
if (not $command) {
# unrecoverable error or input closed
exit 1;
}
last;
}
eval { require "Languages/$command->{lang}.pm" };
if ($@) {
require 'Languages/_default.pm';
$command->{lang} = '_default';
}
my $mod = $command->{lang}->new(%$command);
my $result = Guest::process_command($command, $mod, USERNAME, 'VSOCK');
if (not defined $result) {
$result = "[Fatal error]";
}
if ($result) {
Guest::send_output(*STDOUT, $result, 'VSOCK');
exit; # exit child process
}
}
accept_client();