Mercurial > hg > rc1
diff vendor/pear/crypt_gpg/Crypt/GPG/ProcessControl.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/pear/crypt_gpg/Crypt/GPG/ProcessControl.php Thu Jan 04 15:50:29 2018 -0500 @@ -0,0 +1,152 @@ +<?php + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * A class for monitoring and terminating processes + * + * PHP version 5 + * + * LICENSE: + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * <http://www.gnu.org/licenses/> + * + * @category Encryption + * @package Crypt_GPG + * @author Michael Gauthier <mike@silverorange.com> + * @copyright 2013 silverorange + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear.php.net/package/Crypt_GPG + */ + +// {{{ class Crypt_GPG_ProcessControl + +/** + * A class for monitoring and terminating processes by PID + * + * This is used to safely terminate the gpg-agent for GnuPG 2.x. This class + * is limited in its abilities and can only check if a PID is running and + * send a PID SIGTERM. + * + * @category Encryption + * @package Crypt_GPG + * @author Michael Gauthier <mike@silverorange.com> + * @copyright 2013 silverorange + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear.php.net/package/Crypt_GPG + */ +class Crypt_GPG_ProcessControl +{ + // {{{ protected properties + + /** + * The PID (process identifier) being monitored + * + * @var integer + */ + protected $pid; + + // }}} + // {{{ __construct() + + /** + * Creates a new process controller from the given PID (process identifier) + * + * @param integer $pid the PID (process identifier). + */ + public function __construct($pid) + { + $this->pid = $pid; + } + + // }}} + // {{{ public function getPid() + + /** + * Gets the PID (process identifier) being controlled + * + * @return integer the PID being controlled. + */ + public function getPid() + { + return $this->pid; + } + + // }}} + // {{{ isRunning() + + /** + * Checks if the process is running + * + * If the <kbd>posix</kbd> extension is available, <kbd>posix_getpgid()</kbd> + * is used. Otherwise <kbd>ps</kbd> is used on UNIX-like systems and + * <kbd>tasklist</kbd> on Windows. + * + * @return boolean true if the process is running, false if not. + */ + public function isRunning() + { + $running = false; + + if (function_exists('posix_getpgid')) { + $running = false !== posix_getpgid($this->pid); + } elseif (PHP_OS === 'WINNT') { + $command = 'tasklist /fo csv /nh /fi ' + . escapeshellarg('PID eq ' . $this->pid); + + $result = exec($command); + $parts = explode(',', $result); + $running = (count($parts) > 1 && trim($parts[1], '"') == $this->pid); + } else { + $result = exec('ps -p ' . escapeshellarg($this->pid) . ' -o pid='); + $running = (trim($result) == $this->pid); + } + + return $running; + } + + // }}} + // {{{ terminate() + + /** + * Ends the process gracefully + * + * The signal SIGTERM is sent to the process. The gpg-agent process will + * end gracefully upon receiving the SIGTERM signal. Upon 3 consecutive + * SIGTERM signals the gpg-agent will forcefully shut down. + * + * If the <kbd>posix</kbd> extension is available, <kbd>posix_kill()</kbd> + * is used. Otherwise <kbd>kill</kbd> is used on UNIX-like systems and + * <kbd>taskkill</kbd> is used in Windows. + * + * @return void + */ + public function terminate() + { + if (function_exists('posix_kill')) { + posix_kill($this->pid, 15); + } elseif (PHP_OS === 'WINNT') { + exec('taskkill /PID ' . escapeshellarg($this->pid)); + } else { + exec('kill -15 ' . escapeshellarg($this->pid)); + } + } + + // }}} +} + +// }}} + +?>