Bug #65697 [Nab]: is_link not working with windows junctions
| From: | giunta dot gaetano at gmail dot com | Date: | Wed, 18 Sep 2013 20:13:02 +0000 |
| Subject: | Bug #65697 [Nab]: is_link not working with windows junctions | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-181669@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=65697&edit=1
ID: 65697
User updated by: giunta dot gaetano at gmail dot com
Reported by: giunta dot gaetano at gmail dot com
Summary: is_link not working with windows junctions
Status: Not a bug
Type: Bug
Package: *Directory/Filesystem functions
Operating System: win7 64bit
PHP Version: 5.4.19
Block user comment: N
Private report: N
New Comment:
Mmm, if it walks like a duck and quacks like a duck...
For all scenarios I can figure (backups, deploying code using symlinks), treating a junction as a
symlink makes more sense than not doing it.
Right now the only way to tell if a folder is actually a "real one" or not is to use the
array_diff trick I put in the test script. It looks hackish, cumbersome, and why should lstat()
treat a junction differently than is_link() anyway?)
It is true that windows versions starting with Vista do create symlinks by default, but tools like
"Link Shell Extension" or the venerable sysinternals junction.exe still allow one to
create Junctions.
Previous Comments:
------------------------------------------------------------------------
[2013-09-18 19:00:39] pajoye@php.net
Junctions are not symlinks, the result is correct. Also the
junctions pointing to a directory may work. I remember
some windows version specific changes here, where it
ended as symlink or junction (recent always do it as
symlonk afair)
------------------------------------------------------------------------
[2013-09-18 12:51:32] giunta dot gaetano at gmail dot com
Description:
------------
is_link seems to return false for junction points which show up as <JUNCTION> when using the
DIR command.
It seems to work for junctions which show up as <SYMLINKD> when using the DIR command.
tested on php 5.3.27 and 5.4.14 (32 bit of course)
Test script:
---------------
<?php
$paths = array(
"linksource",
"linktarget",
"linktarget2"
);
foreach ( $paths as $path )
{
echo "----\n $path\n";
var_dump( is_link( $path ) );
var_dump( is_dir( $path ) );
var_dump( array_diff( stat($path), lstat($path) ) );
}
Expected result:
----------------
results of DIR command:
07/09/2013 15:59 <DIR> linksource
07/09/2013 19:11 <JUNCTION> linktarget [D:\htdocs\linksource]
18/09/2013 14:30 <SYMLINKD> linktarget2 [linksource]
Actual result:
--------------
D:\htdocs>php linktest.php
----
linksource
bool(false)
bool(true)
array(0) {
}
----
linktarget
bool(false)
bool(true)
array(8) {
[2]=>
int(16895)
[8]=>
int(1378562389)
[9]=>
int(1378562389)
[10]=>
int(1378562389)
["mode"]=>
int(16895)
["atime"]=>
int(1378562389)
["mtime"]=>
int(1378562389)
["ctime"]=>
int(1378562389)
}
----
linktarget2
bool(true)
bool(true)
array(8) {
[2]=>
int(16895)
[8]=>
int(1378562389)
[9]=>
int(1378562389)
[10]=>
int(1378562389)
["mode"]=>
int(16895)
["atime"]=>
int(1378562389)
["mtime"]=>
int(1378562389)
["ctime"]=>
int(1378562389)
}
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=65697&edit=1