#2539 file link -symbolic wrong error message

obsolete: 8.4.4
Marco Maggi

On Unix-like systems when creating a symbolic link:

file link -symbolic link target

and a directory component in "link" does not exist
TCL may return the wrong error message.

package require Tcl 8.4
package require tcltest 2.2

::tcltest::configure -verbose "start end error"

::tcltest::test file-link-error-1.1 "wrong error message" {
-setup {
set linkName [file join one two]
set target three

# If we do not create the directory the wrong error
# message is returned.
# ::tcltest::makeDirectory one
::tcltest::makeFile {some data} $target
-body {
catch {
file link -symbolic $linkName $target
} errmsg
set errmsg
-result "I don't know what to put here."
-cleanup {
::tcltest::removeFile $target
::tcltest::removeDirectory one

On my Linux system the Info documentation for
the GNU C Library reports that the only "errno"
values set by "symlink()" are: EEXIST, EROFS,
ENOSPC, EIO; while the manual page for "symlink()"
(which is marked "Linux Programmer's Manual") lists
more codes including:

ENOENT A directory component in "newpath"
does not exist or is a dangling
symbolic link, or "oldpath" is the
empty string.

It appears that "symlink()" returns ENOENT to signal
error, but "TclpObjLink()" in "tclUnixFile.c" is supposed to
leave this code in "errno" only if the target does not
exist, hence the wrong error message returned
"Tcl_FileObjCmd()" in "tclCmdAH.c" around line 1010.

Maybe the algorithm should be:

if (true_if_exists(source))
return error;
if (false_if_exists(get_parent(source)))
return error;
if (false_if_exists(target))
return error;

The choice of making "TclpObjLink()" to signal error
conditions through "errno" seems to be the cause

Aaah... the beauty of functions that can fail for one
reason only... :)

tcl_platform(byteOrder) = littleEndian
tcl_platform(machine) = i686
tcl_platform(os) = Linux
tcl_platform(osVersion) = 2.4.22
tcl_platform(platform) = unix
tcl_platform(threaded) = 1
tcl_platform(user) = marco
tcl_platform(wordSize) = 4

tcl_patchLevel = 8.4.4


  • Donal K. Fellows

    • labels: 105657 --> 37. File System
    • assigned_to: dkf --> vincentdarley
  • Vince Darley

    Vince Darley - 2003-11-21

    Logged In: YES

    This has been fixed in 8.5a0:

    2003-11-10 Vince Darley <vincentdarley@users.sourceforge.net>

    * generic/tclCmdAH.c:
    * tests/fCmd.test: fix to misleading error message in 'file
    [Bug 836208]

  • Vince Darley

    Vince Darley - 2003-11-21
    • status: open --> closed-fixed

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:

No, thanks