paradis@encore.UUCP (Jim Paradis) (04/18/87)
Well, I finally got around to fixing the 'mv' utility. As distributed,
it exhibited the following nasties:
- If you moved a directory to some other part of the
tree, it would not update its ".." entry to reflect
its new place in the hierarchy
- It would gladly let you clobber your "." and ".."
entries (e.g. "mv .. foo" did not complain)
- It would not let you specify a directory as the
destination of a directory move
(e.g. "mv /a/b/c/dirname ." would fail).
The fixes are as follows:
(1) Change the following code in main()
Was:
if ((st.st_mode & S_IFMT) == S_IFDIR) {
if (!stat(argv[2], &st) && (st.st_mode & S_IFMT) == S_IFDIR) {
std_err("mv: target ");
std_err(argv[2]);
std_err(" exists\n");
exit(1);
}
}
else {
setgid (getgid());
setuid (getuid());
}
Should be:
setgid (getgid());
setuid (getuid());
(2) Add the following right at the beginning of move():
/* It's too dangerous to fool with "." or ".." ! */
if ((strcmp(old, ".") == 0) || (strcmp(old, "..") == 0)) {
cant(old);
}
(3) Add the following just before the call to utime() in move():
/* If this was a directory that we moved, then we ahve
** to update its ".." entry (in case it was moved some-
** where else in the tree)
*/
if ((st.st_mode & S_IFMT) == S_IFDIR) {
int i;
char parent[64], dotdot[64];
strcpy(parent, new);
/* Determine the name for the parent of
** the new name by counting back until we
** hit a '/' or the beginning of the string
*/
for(i = (strlen(parent) - 1); i > 0; i--) {
if(parent[i] == '/') break;
}
/* If there are no slashes, then the name is
** in the current directory, so its parent
** is ".". Otherwise, the parent is the
** name up to the last slash.
*/
if (i == 0) {
strcpy(parent, ".");
}
else {
/* null-terminate name at last slash */
parent[i] = '\0';
}
/* Unlink the ".." entry */
strcpy(dotdot, new);
strcat(dotdot, "/..");
unlink(dotdot);
/* Now link it to its parent */
link(parent, dotdot);
}
Enjoy!
+----------------+ Jim Paradis linus--+
+--+-------------+ | Encore Computer Corp. necntc--|
| | E N C O R E | | 257 Cedar Hill St. ihnp4--+-encore!paradis
| +-------------+--+ Marlboro MA 01752 decvax--|
+----------------+ (617) 460-0500 talcott--+
You don't honestly think ENCORE is responsible for this??!!