From 03fe4081127edfaf692bec0980b0f82b5aa0ac6c Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 17 May 2021 18:42:01 +0100 Subject: [PATCH] general-functions.pl: Add "safe" system commands Signed-off-by: Michael Tremer --- config/cfgroot/general-functions.pl | 71 +++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/config/cfgroot/general-functions.pl b/config/cfgroot/general-functions.pl index a6656ccf56..96a826a154 100644 --- a/config/cfgroot/general-functions.pl +++ b/config/cfgroot/general-functions.pl @@ -28,6 +28,77 @@ $General::adminmanualurl = 'http://wiki.ipfire.org'; require "${General::swroot}/network-functions.pl"; +# This function executes a shell command without forking a shell or do any other +# Perl-voodoo before it. It deprecates the "system" command and is the only way +# to call shell commands. +sub safe_system($) { + my @command = @_; + + system { ${command[0]} } @command; + + # Return exit code + return $? >> 8; +} + +# Calls a process in the background and returns nothing +sub system_background($) { + my $pid = fork(); + + unless ($pid) { + my $rc = &system(@_); + exit($rc); + } + + return 0; +} + +# Returns the output of a shell command +sub system_output($) { + my @command = @_; + my $pid; + my @output = (); + + unless ($pid = open(OUTPUT, "-|")) { + open(STDERR, ">&STDOUT"); + exec { ${command[0]} } @command; + die "Could not execute @command: $!"; + } + + waitpid($pid, 0); + + while () { + push(@output, $_); + } + close(OUTPUT); + + return @output; +} + +# Calls a shell command and throws away the output +sub system($) { + my @command = @_; + + open(SAVEOUT, ">&STDOUT"); + open(SAVEERR, ">&STDERR"); + + open(STDOUT, ">/dev/null"); + open(STDERR, ">&STDOUT"); + + select(STDERR); $|=1; + select(STDOUT); $|=1; + + my $rc = &safe_system(@command); + + close(STDOUT); + close(STDERR); + + # Restore + open(STDOUT, ">&SAVEOUT"); + open(STDERR, ">&SAVEERR"); + + return $rc; +} + # Function to remove duplicates from an array sub uniq { my %seen; grep !$seen{$_}++, @_ } -- 2.39.5