MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
my_redel.c
1 /* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation; version 2 of the License.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software
14  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
15 
16 #include "mysys_priv.h"
17 #include <my_dir.h>
18 #include <m_string.h>
19 #include "mysys_err.h"
20 #if defined(HAVE_UTIME_H)
21 #include <utime.h>
22 #elif defined(HAVE_SYS_UTIME_H)
23 #include <sys/utime.h>
24 #elif !defined(HPUX10)
25 struct utimbuf {
26  time_t actime;
27  time_t modtime;
28 };
29 #endif
30 
31  /*
32  Rename with copy stat form old file
33  Copy stats from old file to new file, deletes orginal and
34  changes new file name to old file name
35 
36  if MY_REDEL_MAKE_COPY is given, then the orginal file
37  is renamed to org_name-'current_time'.BAK
38  */
39 
40 #define REDEL_EXT ".BAK"
41 
42 int my_redel(const char *org_name, const char *tmp_name, myf MyFlags)
43 {
44  int error=1;
45  DBUG_ENTER("my_redel");
46  DBUG_PRINT("my",("org_name: '%s' tmp_name: '%s' MyFlags: %d",
47  org_name,tmp_name,MyFlags));
48 
49  if (my_copystat(org_name,tmp_name,MyFlags) < 0)
50  goto end;
51  if (MyFlags & MY_REDEL_MAKE_BACKUP)
52  {
53  char name_buff[FN_REFLEN+20];
54  char ext[20];
55  ext[0]='-';
56  get_date(ext+1,2+4,(time_t) 0);
57  strmov(strend(ext),REDEL_EXT);
58  if (my_rename(org_name, fn_format(name_buff, org_name, "", ext, 2),
59  MyFlags))
60  goto end;
61  }
62  else if (my_delete_allow_opened(org_name, MyFlags))
63  goto end;
64  if (my_rename(tmp_name,org_name,MyFlags))
65  goto end;
66 
67  error=0;
68 end:
69  DBUG_RETURN(error);
70 } /* my_redel */
71 
72 
73  /* Copy stat from one file to another */
74  /* Return -1 if can't get stat, 1 if wrong type of file */
75 
76 int my_copystat(const char *from, const char *to, int MyFlags)
77 {
78  struct stat statbuf;
79 
80  if (stat(from, &statbuf))
81  {
82  my_errno=errno;
83  if (MyFlags & (MY_FAE+MY_WME))
84  {
85  char errbuf[MYSYS_STRERROR_SIZE];
86  my_error(EE_STAT, MYF(ME_BELL+ME_WAITTANG), from,
87  errno, my_strerror(errbuf, sizeof(errbuf), errno));
88  }
89  return -1; /* Can't get stat on input file */
90  }
91  if ((statbuf.st_mode & S_IFMT) != S_IFREG)
92  return 1;
93 
94  /* Copy modes */
95  if (chmod(to, statbuf.st_mode & 07777))
96  {
97  my_errno= errno;
98  if (MyFlags & (MY_FAE+MY_WME))
99  {
100  char errbuf[MYSYS_STRERROR_SIZE];
101  my_error(EE_CHANGE_PERMISSIONS, MYF(ME_BELL+ME_WAITTANG), from,
102  errno, my_strerror(errbuf, sizeof(errbuf), errno));
103  }
104  return -1;
105  }
106 
107 #if !defined(__WIN__)
108  if (statbuf.st_nlink > 1 && MyFlags & MY_LINK_WARNING)
109  {
110  if (MyFlags & MY_LINK_WARNING)
111  my_error(EE_LINK_WARNING,MYF(ME_BELL+ME_WAITTANG),from,statbuf.st_nlink);
112  }
113  /* Copy ownership */
114  if (chown(to, statbuf.st_uid, statbuf.st_gid))
115  {
116  my_errno= errno;
117  if (MyFlags & (MY_FAE+MY_WME))
118  {
119  char errbuf[MYSYS_STRERROR_SIZE];
120  my_error(EE_CHANGE_OWNERSHIP, MYF(ME_BELL+ME_WAITTANG), from,
121  errno, my_strerror(errbuf, sizeof(errbuf), errno));
122  }
123  return -1;
124  }
125 #endif /* !__WIN__ */
126 
127  if (MyFlags & MY_COPYTIME)
128  {
129  struct utimbuf timep;
130  timep.actime = statbuf.st_atime;
131  timep.modtime = statbuf.st_mtime;
132  (void) utime((char*) to, &timep);/* Update last accessed and modified times */
133  }
134 
135  return 0;
136 } /* my_copystat */