38int __rename(
const char* _oldpath,
const char* _newpath)
40 if (!rename(_oldpath, _newpath))
48 int oldfd = -1, newfd = -1;
49 struct stat oldstat, newstat;
51 if (lstat(_oldpath, &oldstat) || lstat(_newpath, &newstat))
54 if (S_ISLNK(oldstat.st_mode)) {
55 char oldpath[1024 + 1];
56 int n = readlink(_oldpath, oldpath,
sizeof(oldpath) - 1);
61 if (symlink(oldpath, _newpath))
68 if (!S_ISREG(oldstat.st_mode)) {
74 oldfd = open(_oldpath, O_RDONLY);
75 newfd = open(_newpath, O_CREAT | O_WRONLY, oldstat.st_mode);
76 if (oldfd == -1 || newfd == -1)
80 ssize_t n = sendfile(newfd, oldfd, &offset, oldstat.st_size);
84 char* buf = (
char*)malloc(newstat.st_blksize);
90 while ((n != -1) && (n = read(oldfd, buf, newstat.st_blksize)) > 0)
91 n = write(newfd, buf, n);
100 ub.actime = oldstat.st_atime;
101 ub.modtime = oldstat.st_mtime;
102 utime(_newpath, &ub);