Date: Wed, 1 Apr 1998 12:12:56 +0300 (IDT) From: Eli Zaretskii To: DJ Delorie cc: gerlach AT netcom16 DOT netcom DOT com, "Matthew H. Gerlach" , djgpp-workers AT delorie DOT com, djgpp AT delorie DOT com Subject: Re: [gerlach AT netcom DOT com: Even more RCS with network drives.] In-Reply-To: <199804010245.VAA24878@delorie.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Precedence: bulk On Tue, 31 Mar 1998, Matthew H. Gerlach wrote: > My first change, should probably be part of the official libc.a, whereby > if the file doesn't exist, just exit and set errno to ENOENT. This change > fixes initializing rcs files on network drives. Agreed. This patch should definitely be applied. If a file doesn't exist, we shouldn't worry about removing it. > God only knows why a printf after the _chmod making the file > writeable makes a difference, but it does. In particular having the \n > in the printf string is critical. Without the \n in the printf the > function would return erroneously and set errno to EACCES, which the rcs > code did not like. I think using `printf' *introduces* another bug which just happens to undo the damage of the original problem (which I still don't understand). The code clearly says it relies on the file name to stay in the transfer buffer. `printf' with a newline flushes the stdout buffer, which uses the transfer buffer, and thus overwrites the file name there. Then when you call `_chmod' it uses whatever `printf' printed as the file name! Try adding a call to `putpath' after `printf' to put the file name into the transfer buffer, and I believe the bug will be resurrected. > #ifdef MAKES_IT_WORK > printf("remove(%s) failed errno = %d\n", fn, errno); > if (errno == EACCES) > errno = ENOENT; > #endif This I don't like. IMHO we should only replace EACCES by ENOENT of we know for sure the file doresn't exist. In this case, it does exist, but cannot be removed due to access rights, so it seems to be one of the few cases where EACCES is *exactly* right.