public function DaemonUnixSocket::scan in ClamAV 8
Same name and namespace in other branches
- 2.x src/Scanner/DaemonUnixSocket.php \Drupal\clamav\Scanner\DaemonUnixSocket::scan()
Scan a file.
Parameters
Drupal\file\FileInterface $file: The file to scan for viruses.
Return value
int
Overrides ScannerInterface::scan
File
- src/
Scanner/ DaemonUnixSocket.php, line 25
Class
Namespace
Drupal\clamav\ScannerCode
public function scan(FileInterface $file) {
// Attempt to open a socket to the ClamAV host and the file.
$file_handler = fopen($file
->getFileUri(), 'r');
$scanner_handler = @fsockopen("unix://{$this->_unix_socket}", 0);
// Abort if the ClamAV server is unavailable.
if (!$scanner_handler) {
\Drupal::logger('Clam AV')
->warning('Unable to connect to ClamAV daemon on unix socket @unix_socket', array(
'@unix_socket' => $this->_unix_socket,
));
return Scanner::FILE_IS_UNCHECKED;
}
// Push to the ClamAV socket.
$bytes = $file
->getSize();
fwrite($scanner_handler, "zINSTREAM\0");
fwrite($scanner_handler, pack("N", $bytes));
stream_copy_to_stream($file_handler, $scanner_handler);
// Send a zero-length block to indicate that we're done sending file data.
fwrite($scanner_handler, pack("N", 0));
// Request a response from the service.
$response = trim(fgets($scanner_handler));
fclose($scanner_handler);
if (preg_match('/^stream: OK$/', $response)) {
$result = Scanner::FILE_IS_CLEAN;
}
elseif (preg_match('/^stream: (.*) FOUND$/', $response, $matches)) {
$this->_virus_name = $matches[1];
$result = Scanner::FILE_IS_INFECTED;
}
else {
preg_match('/^stream: (.*) ERROR$/', $response, $matches);
$result = Scanner::FILE_IS_UNCHECKED;
}
return $result;
}