Message-Id: <199903181551.PAA77260@out4.ibm.net> From: "Mark E." To: djgpp-workers AT delorie DOT com Date: Thu, 18 Mar 1999 10:51:15 -0500 MIME-Version: 1.0 Content-type: Multipart/Mixed; boundary=Message-Boundary-25740 Subject: Re: symlink question References: <199903171807 DOT SAA76910 AT out5 DOT ibm DOT net> In-reply-to: X-mailer: Pegasus Mail for Win32 (v3.01d) Reply-To: djgpp-workers AT delorie DOT com --Message-Boundary-25740 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT Content-description: Mail message body Here is a corrected version of the patch. Attached is the revised documentation. > Of course. I was just asking where in the patched code is the case of a > missing source file handled (presumably by calling `link'). Can you point > at that place? > The only change is that non-v2 exes are handled calling link() instead of returning with an error. In the patch, you'll see two cases of if (v2_prog == 0) handler code here v2_prog == 0 means the file exists but isn't a v2 exe. v2_prog == -1 (doesn't exist) and v2_prog == 1 (is v2 exe) are let through in both cases. The handler code was changed from return an error sentinal to return the result of link(). Further down in symlink.c, there is a comment that mentions non- existing files. /* When we are here, either the file exists and is a v2 executable or it does not exist and we hope, the the user knows what he does. */ Since the only change I made was to the case of v2_prog == 0 and when the source and dest were in the same directory, non-existing files continue to work the same way as before the patch. Which is, to generate a DJGPP-style symlink as if the file existed. *** src/libc/posix/unistd/symlink.c.orig Tue Oct 28 14:22:54 1997 --- src/libc/posix/unistd/symlink.c Thu Mar 18 10:29:24 1999 *************** *** 73,84 **** src_base = tail (src_abs); dest_base = tail (dest_abs); ! /* DJGPP symlinks must be in the same directory. */ if (strnicmp (src_abs, dest_abs, src_base - src_abs)) ! { ! errno = EXDEV; ! return -1; ! } /* Any file is already a link to itself. */ if (stricmp (src_abs, dest_abs) == 0) --- 73,82 ---- src_base = tail (src_abs); dest_base = tail (dest_abs); ! /* DJGPP symlinks must be in the same directory. ! Retry by calling link() to make a copy. */ if (strnicmp (src_abs, dest_abs, src_base - src_abs)) ! return link (source, dest); /* Any file is already a link to itself. */ if (stricmp (src_abs, dest_abs) == 0) *************** *** 88,99 **** unstubbed COFF image) */ v2_prog = is_v2_prog(src_abs); ! /* It is an existing file but no v2 executable */ if (v2_prog == 0) ! { ! errno = EXDEV; ! return -1; ! } /* Allow to say `ln -s src dest' when we really mean `src.exe' and `dest.exe' */ --- 86,95 ---- unstubbed COFF image) */ v2_prog = is_v2_prog(src_abs); ! /* It is an existing file but no v2 executable. ! To make the best of things, call link(). */ if (v2_prog == 0) ! return link (source, dest); /* Allow to say `ln -s src dest' when we really mean `src.exe' and `dest.exe' */ *************** *** 106,121 **** v2_prog = v2_prog == 1 ? v2_prog : is_v2_prog(src_abs); } ! /* It is an existing file but no v2 executable */ if (v2_prog == 0) ! { ! errno = EXDEV; ! return -1; ! } /* When we are here, either the file exists and is a v2 executable ! or it does not exist and we hope, the the user knows what he ! does. */ /* Under LFN, we need the short version of the program name, since that is what the stub stores (and what a program gets in its argv[0]). */ --- 102,115 ---- v2_prog = v2_prog == 1 ? v2_prog : is_v2_prog(src_abs); } ! /* It is an existing file but no v2 executable. ! Retry by calling link() to make a regular copy. */ if (v2_prog == 0) ! return link (source, dest); /* When we are here, either the file exists and is a v2 executable ! or it does not exist and we hope, that the user knows what he is ! doing. */ /* Under LFN, we need the short version of the program name, since that is what the stub stores (and what a program gets in its argv[0]). */ --- Mark Elbrecht, snowball3 AT usa DOT net http://snowball.digitalspace.net/ --Message-Boundary-25740 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT Content-description: Text from file 'symlink2.dif' *** src/libc/posix/unistd/symlink.txh.orig Sun Sep 27 11:22:28 1998 --- src/libc/posix/unistd/symlink.txh Wed Mar 17 13:17:16 1999 *************** *** 17,24 **** depending on what's passed in @code{argv[0]}). The file referred to by @var{exists} doesn't really have to exist when this function is called. If @var{exists} points to an @emph{existing} file, the function checks ! that it is a DJGPP executable; if not, the call will fail with ! @code{EXDEV}. Both @var{new} and @var{exists} can point to a name with or without the @file{.exe} extension. --- 17,24 ---- depending on what's passed in @code{argv[0]}). The file referred to by @var{exists} doesn't really have to exist when this function is called. If @var{exists} points to an @emph{existing} file, the function checks ! that it is a DJGPP executable; if not, attempt to make a copy of the ! file by calling @code{link}(@pxref{link}). Both @var{new} and @var{exists} can point to a name with or without the @file{.exe} extension. --Message-Boundary-25740--