mirror of
https://github.com/vincentmli/bpfire.git
synced 2026-04-28 11:43:25 +02:00
general-functions.pl: Add "safe" system commands
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
This commit is contained in:
@@ -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 (<OUTPUT>) {
|
||||
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{$_}++, @_ }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user