diff options
author | pjd <pjd@FreeBSD.org> | 2004-03-21 13:38:37 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2004-03-21 13:38:37 +0000 |
commit | 158be5bf0095957cbc7d81a3fdf170cc7d3c71a6 (patch) | |
tree | 4834090f89fd2ef1159ddb974beaab9ce83dee44 /bin | |
parent | f50e5eaa3bf8c17c182b7099dae5c36632be4266 (diff) | |
download | FreeBSD-src-158be5bf0095957cbc7d81a3fdf170cc7d3c71a6.zip FreeBSD-src-158be5bf0095957cbc7d81a3fdf170cc7d3c71a6.tar.gz |
When symbolic link is pointed onto a mount point, it can't be moved
to a different file system.
Patch in PR was incorrect.
PR: bin/64430
Submitted by: Samuel Tardieu
MFC after: 3 days
Diffstat (limited to 'bin')
-rw-r--r-- | bin/mv/mv.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/bin/mv/mv.c b/bin/mv/mv.c index 009ce51..7044a81 100644 --- a/bin/mv/mv.c +++ b/bin/mv/mv.c @@ -210,14 +210,25 @@ do_move(char *from, char *to) struct statfs sfs; char path[PATH_MAX]; - /* Can't mv(1) a mount point. */ - if (realpath(from, path) == NULL) { - warnx("cannot resolve %s: %s", from, path); + /* + * If the source is a symbolic link and is on another + * filesystem, it can be recreated at the destination. + */ + if (lstat(from, &sb) == -1) { + warn("%s", from); return (1); } - if (!statfs(path, &sfs) && !strcmp(path, sfs.f_mntonname)) { - warnx("cannot rename a mount point"); - return (1); + if (!S_ISLNK(sb.st_mode)) { + /* Can't mv(1) a mount point. */ + if (realpath(from, path) == NULL) { + warnx("cannot resolve %s: %s", from, path); + return (1); + } + if (!statfs(path, &sfs) && + !strcmp(path, sfs.f_mntonname)) { + warnx("cannot rename a mount point"); + return (1); + } } } else { warn("rename %s to %s", from, to); |