#2539 file link -symbolic wrong error message

obsolete: 8.4.4
closed-fixed
5
2003-11-21
2003-11-21
Marco Maggi
No

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
the
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
by
"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;
symlink(...);

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

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

Discussion

  • Donal K. Fellows

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

    Vince Darley - 2003-11-21

    Logged In: YES
    user_id=32170

    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
    link'
    [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