Imported from ../bash-2.05b.tar.gz.
[platform/upstream/bash.git] / lib / sh / rename.c
1 /*
2  * rename - rename a file
3  */
4
5 /* Copyright (C) 1999 Free Software Foundation, Inc.
6
7    This file is part of GNU Bash, the Bourne Again SHell.
8
9    Bash is free software; you can redistribute it and/or modify it
10    under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2, or (at your option)
12    any later version.
13
14    Bash is distributed in the hope that it will be useful, but WITHOUT
15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17    License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with Bash; see the file COPYING.  If not, write to the Free
21    Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
22
23 #include <config.h>
24
25 #if !defined (HAVE_RENAME)
26
27 #include <bashtypes.h>
28 #include <posixstat.h>
29
30 #if defined (HAVE_UNISTD_H)
31 #  include <unistd.h>
32 #endif
33 #include <errno.h>
34
35 #include <stdc.h>
36
37 #ifndef errno
38 extern int errno;
39 #endif
40
41 int
42 rename (from, to)
43      const char *from, *to;
44 {
45   struct stat fb, tb;
46
47   if (stat (from, &fb) < 0)
48     return -1;  
49
50   if (stat (to, &tb) < 0)
51     {
52       if (errno != ENOENT)
53         return -1;
54     }
55   else
56     {
57       if (fb.st_dev == tb.st_dev && fb.st_ino == tb.st_ino)
58         return 0;               /* same file */
59       if (unlink (to) < 0 && errno != ENOENT)
60         return -1;
61     }
62
63   if (link (from, to) < 0)
64     return (-1);
65
66   if (unlink (from) < 0 && errno != ENOENT)
67     {
68       int e = errno;
69       unlink (to);
70       errno = e;
71       return (-1);
72     }
73
74   return (0);
75 }
76 #endif /* !HAVE_RENAME */