diff options
Diffstat (limited to 'unix')
-rw-r--r-- | unix/tclUnixFile.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c index 9edd47e..6724778 100644 --- a/unix/tclUnixFile.c +++ b/unix/tclUnixFile.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixFile.c,v 1.23 2002/06/13 09:40:01 vincentdarley Exp $ + * RCS: @(#) $Id: tclUnixFile.c,v 1.24 2002/06/21 14:22:29 vincentdarley Exp $ */ #include "tclInt.h" @@ -724,10 +724,10 @@ TclpObjStat(pathPtr, bufPtr) #ifdef S_IFLNK Tcl_Obj* -TclpObjLink(pathPtr, toPtr, linkType) +TclpObjLink(pathPtr, toPtr, linkAction) Tcl_Obj *pathPtr; Tcl_Obj *toPtr; - int linkType; + int linkAction; { extern Tcl_Filesystem nativeFilesystem; @@ -738,12 +738,27 @@ TclpObjLink(pathPtr, toPtr, linkType) if (src == NULL || target == NULL) { return NULL; } - /* We don't recognise these codes */ - if (linkType < 0 || linkType > 2) return NULL; - if (linkType == 2) { - if (link(src, target) != 0) return NULL; + if (access(src, F_OK) != -1) { + /* src exists */ + errno = EEXIST; + return NULL; + } + if (access(target, F_OK) == -1) { + /* target doesn't exist */ + errno = ENOENT; + return NULL; + } + /* + * Check symbolic link flag first, since we prefer to + * create these. + */ + if (linkAction & TCL_CREATE_SYMBOLIC_LINK) { + if (symlink(target, src) != 0) return NULL; + } else if (linkAction & TCL_CREATE_HARD_LINK) { + if (link(target, src) != 0) return NULL; } else { - if (symlink(src, target) != 0) return NULL; + errno = ENODEV; + return NULL; } return toPtr; } else { |