Messages in this thread |  | | Date | Sat, 29 Mar 2008 01:16:56 +0100 | | From | "J.A. Magallón" <> | | Subject | Re: unexpected rename() behaviour |
| |
On Sat, 29 Mar 2008 01:07:52 +0100, Ketil Froyn <ketil@froyn.name> wrote:
> Hi, > > The following behaviour was unexpected (tested on Debian/ext3): > > $ echo 1 > 1 > $ ln 1 2 > $ cat 2 > 1 > $ ./rename 2 1 > $ echo $? > 0 > $ cat 2 > 1 > > The code for ./rename is simple: > > --- > /* compile: gcc -o rename rename.c */ > #include <stdio.h> > int main(int argc, char *argv[]) { return rename(argv[1], argv[2]); } > --- > > I thought this must be wrong behaviour, but I have been unable to > confirm what the correct result should be in this special case. rename() > returns success, but the source file is intact, which seems odd. The > "mv" command specifically checks for cases like this and calls > unlink("2") instead of rename("2", "1"). Are all applications meant to > do this? What standards describe what rename() should do in cases like this? >
man 2 rename:
If oldpath and newpath are existing hard links referring to the same file, then rename() does nothing, and returns a success status.
That's why mv checks the special case.
-- J.A. Magallon <jamagallon()ono!com> \ Software is like sex: \ It's better when it's free Mandriva Linux release 2008.1 (Cooker) for i586 Linux 2.6.23-jam05 (gcc 4.2.2 20071128 (4.2.2-2mdv2008.1)) SMP PREEMPT
|  |