34int __rename(
const char* _oldpath,
const char* _newpath)
36 if (!rename(_oldpath, _newpath))
44 int oldfd = -1, newfd = -1;
45 struct stat oldstat, newstat;
47 if (lstat(_oldpath, &oldstat) || lstat(_newpath, &newstat))
50 if (S_ISLNK(oldstat.st_mode)) {
51 char oldpath[1024 + 1];
52 int n = readlink(_oldpath, oldpath,
sizeof(oldpath) - 1);
57 if (symlink(oldpath, _newpath))
64 if (!S_ISREG(oldstat.st_mode)) {
70 oldfd = open(_oldpath, O_RDONLY);
71 newfd = open(_newpath, O_CREAT | O_WRONLY, oldstat.st_mode);
72 if (oldfd == -1 || newfd == -1)
76 ssize_t
n = sendfile(newfd, oldfd, &offset, oldstat.st_size);
80 char*
buf = (
char*)malloc(newstat.st_blksize);
86 while ((
n != -1) && (
n = read(oldfd,
buf, newstat.st_blksize)) > 0)
87 n = _write(newfd,
buf,
n);
96 ub.actime = oldstat.st_atime;
97 ub.modtime = oldstat.st_mtime;