}
}
+if ( !function_exists( 'array_intersect_key' ) ) {
+ /**
+ * Exists in 5.1.0+
+ * Define our own array_intersect_key function
+ */
+ function array_intersect_key( $isec, $keys ) {
+ $argc = func_num_args();
+
+ if ( $argc > 2 ) {
+ for ( $i = 1; $isec && $i < $argc; $i++ ) {
+ $arr = func_get_arg( $i );
+
+ foreach ( array_keys( $isec ) as $key ) {
+ if ( !isset( $arr[$key] ) )
+ unset( $isec[$key] );
+ }
+ }
+
+ return $isec;
+ } else {
+ $res = array();
+ foreach ( array_keys( $isec ) as $key ) {
+ if ( isset( $keys[$key] ) )
+ $res[$key] = $isec[$key];
+ }
+
+ return $res;
+ }
+ }
+}
+
// Support for Wietse Venema's taint feature
if ( !function_exists( 'istainted' ) ) {
function istainted( $var ) {
*/
function wfDebug( $text, $logonly = false ) {
global $wgOut, $wgDebugLogFile, $wgDebugComments, $wgProfileOnly, $wgDebugRawPage;
- global $wgDebugLogPrefix;
+ global $wgDebugLogPrefix, $wgShowDebug;
static $recursion = 0;
static $cache = array(); // Cache of unoutputted messages
return;
}
- if ( $wgDebugComments && !$logonly ) {
+ if ( ( $wgDebugComments || $wgShowDebug ) && !$logonly ) {
$cache[] = $text;
if ( !isset( $wgOut ) ) {
array_map( array( $wgOut, 'debug' ), $cache );
$cache = array();
}
- if ( '' != $wgDebugLogFile && !$wgProfileOnly ) {
+ if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
# Strip unprintables; they can switch terminal modes when binary data
# gets dumped, which is pretty annoying.
$text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
// IPv6 bracketed host
$protocol = $m[1];
$host = $m[2];
- $port = $m[3];
+ $port = intval( $m[3] );
$prefix = isset( $m[4] ) ? $m[4] : false;
+ $domain = AF_INET6;
} elseif ( preg_match( '!^(tcp|udp):(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) {
$protocol = $m[1];
$host = $m[2];
- $port = $m[3];
+ if ( !IP::isIPv4( $host ) ) {
+ $host = gethostbyname( $host );
+ }
+ $port = intval( $m[3] );
$prefix = isset( $m[4] ) ? $m[4] : false;
+ $domain = AF_INET;
} else {
throw new MWException( __METHOD__.": Invalid UDP specification" );
}
}
}
- $sock = fsockopen( "$protocol://$host", $port );
+ $sock = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
if ( !$sock ) {
return;
}
- fwrite( $sock, $text );
- fclose( $sock );
+ socket_sendto( $sock, $text, strlen( $text ), 0, $host, $port );
+ socket_close( $sock );
} else {
wfSuppressWarnings();
$exists = file_exists( $file );
$log = sprintf( "%s\t%04.3f\t%s\n",
gmdate( 'YmdHis' ), $elapsed,
urldecode( $wgRequest->getRequestURL() . $forward ) );
- if ( '' != $wgDebugLogFile && ( $wgRequest->getVal('action') != 'raw' || $wgDebugRawPage ) ) {
+ if ( $wgDebugLogFile != '' && ( $wgRequest->getVal('action') != 'raw' || $wgDebugRawPage ) ) {
wfErrorLog( $log . $prof, $wgDebugLogFile );
}
}
if ( !is_null( $wgReadOnly ) ) {
return (bool)$wgReadOnly;
}
- if ( '' == $wgReadOnlyFile ) {
+ if ( $wgReadOnlyFile == '' ) {
return false;
}
// Set $wgReadOnly for faster access next time
* @param $args
* @param $useDB Boolean
* @param $transform Boolean: Whether or not to transform the message.
- * @param $forContent Boolean
+ * @param $forContent Mixed: Language code, or false for user lang, true for content lang.
* @return String: the requested message.
*/
function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) {
* @return bool Whereas client accept gzip compression
*/
function wfClientAcceptsGzip() {
- global $wgUseGzip;
- if( $wgUseGzip ) {
+ if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
# FIXME: we may want to blacklist some broken browsers
$m = array();
if( preg_match(
* "days=7&limit=100". Options in the first array override options in the second.
* Options set to "" will not be output.
*/
-function wfArrayToCGI( $array1, $array2 = NULL )
+function wfArrayToCGI( $array1, $array2 = null )
{
if ( !is_null( $array2 ) ) {
$array1 = $array1 + $array2;
$cgi = '';
foreach ( $array1 as $key => $value ) {
- if ( '' !== $value ) {
- if ( '' != $cgi ) {
+ if ( $value !== '' ) {
+ if ( $cgi != '' ) {
$cgi .= '&';
}
if ( is_array( $value ) ) {
} elseif( array_key_exists( '*/*', $avail ) ) {
return '*/*';
} else {
- return NULL;
+ return null;
}
}
}
}
$bestq = 0;
- $besttype = NULL;
+ $besttype = null;
foreach( array_keys( $combine ) as $type ) {
if( $combine[$type] > $bestq ) {
function wfUrlProtocols() {
global $wgUrlProtocols;
+ static $retval = null;
+ if ( !is_null( $retval ) )
+ return $retval;
+
// Support old-style $wgUrlProtocols strings, for backwards compatibility
// with LocalSettings files from 1.5
if ( is_array( $wgUrlProtocols ) ) {
foreach ($wgUrlProtocols as $protocol)
$protocols[] = preg_quote( $protocol, '/' );
- return implode( '|', $protocols );
+ $retval = implode( '|', $protocols );
} else {
- return $wgUrlProtocols;
+ $retval = $wgUrlProtocols;
}
+ return $retval;
}
/**
$cmd = escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd );
}
}
- } elseif ( php_uname( 's' ) == 'Windows NT' ) {
+ } elseif ( php_uname( 's' ) == 'Windows NT' &&
+ version_compare( PHP_VERSION, '5.3.0', '<' ) )
+ {
# This is a hack to work around PHP's flawed invocation of cmd.exe
# http://news.php.net/php.internals/21796
- $cmd = '"' . $cmd . '"'; // FIXME: breaking Vista sp2/PHP 5.2.9(2)
+ # Which is fixed in 5.3.0 :)
+ $cmd = '"' . $cmd . '"';
}
wfDebug( "wfShellExec: $cmd\n" );
return $output;
}
-/**
- * Executes a shell command in the background. Returns true of successful.
- *
- * @param $cmd String
- */
-function wfShellBackgroundExec( $cmd ) {
- wfDebug( "wfShellBackgroundExec: $cmd\n" );
-
- if ( ! wfShellExecEnabled() ) {
- return false;
- }
-
- if ( wfIsWindows() ) {
- shell_exec( "start /b $cmd >nul");
- return true;
- } else {
- $pid = shell_exec( "nohup $cmd > /dev/null & echo $!" );
- return (bool)$pid;
- }
-}
-
-/**
- * Checks if the current instance can execute a shell command
- *
- */
-function wfShellExecEnabled(){
- if( wfIniGetBool( 'safe_mode' ) ) {
- wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" );
- return false;
- }
- $functions = explode( ',', ini_get( 'disable_functions' ) );
- $functions = array_map( 'trim', $functions );
- $functions = array_map( 'strtolower', $functions );
- if ( in_array( 'passthru', $functions ) ) {
- wfDebug( "passthru is in disabled_functions\n" );
- return false;
- }
- return true;
-}
-
/**
* Workaround for http://bugs.php.net/bug.php?id=45132
* escapeshellarg() destroys non-ASCII characters if LANG is not a UTF-8 locale
}
}
}
-
+
return true;
}
/**
* Find a file.
* Shortcut for RepoGroup::singleton()->findFile()
+ * @param $title Either a string or Title object
* @param $options Associative array of options:
* time: requested time for an archived image, or false for the
* current version. An image object will be returned which was
/**
* Get an object referring to a locally registered file.
* Returns a valid placeholder object if the file does not exist.
+ * @param $title Either a string or Title object
+ * @return File, or null if passed an invalid Title
*/
function wfLocalFile( $title ) {
return RepoGroup::singleton()->getLocalRepo()->newFile( $title );
* to use this outside maintenance scripts in its present form.
*
* @param $maxLag Integer
+ * @param $wiki mixed Wiki identifier accepted by wfGetLB
* @return null
*/
-function wfWaitForSlaves( $maxLag ) {
+function wfWaitForSlaves( $maxLag, $wiki = false ) {
if( $maxLag ) {
- $lb = wfGetLB();
- list( $host, $lag ) = $lb->getMaxLag();
+ $lb = wfGetLB( $wiki );
+ list( $host, $lag ) = $lb->getMaxLag( $wiki );
while( $lag > $maxLag ) {
$name = @gethostbyaddr( $host );
if( $name !== false ) {