- if (stat(source, &s1) < 0) {
- fprintf(stderr, "mv: cannot access %s\n", source);
- return(1);
- }
- if ((s1.st_mode & S_IFMT) == S_IFDIR) {
- fprintf(stderr, "mv: directory rename only\n");
- return(1);
- }
- if (stat(target, &s2) >= 0) {
- if ((s2.st_mode & S_IFMT) == S_IFDIR) {
- sprintf(buf, "%s/%s", target, dname(source));
- target = buf;
- }
- if (stat(target, &s2) >= 0) {
- if ((s2.st_mode & S_IFMT) == S_IFDIR) {
- fprintf(stderr, "mv: %s is a directory\n", target);
- return(1);
- } else if (iflag && !fflag) {
- fprintf(stderr, "remove %s? ", target);
- i = c = getchar();
- while (c != '\n' && c != EOF)
- c = getchar();
- if (i != 'y')
- return(1);
- }
- if (s1.st_dev==s2.st_dev && s1.st_ino==s2.st_ino) {
- fprintf(stderr, "mv: %s and %s are identical\n",
- source, target);
- return(1);
- }
- if (access(target, 2) < 0 && !fflag && isatty(fileno(stdin))) {
- fprintf(stderr, "override protection %o for %s? ",
- s2.st_mode & MODEBITS, target);
- i = c = getchar();
- while (c != '\n' && c != EOF)
- c = getchar();
- if (i != 'y')
- return(1);
- }
- if (unlink(target) < 0) {
- fprintf(stderr, "mv: cannot unlink %s\n", target);
- return(1);
- }
- }
- }
- if (link(source, target) < 0) {
- i = fork();
- if (i == -1) {
- fprintf(stderr, "mv: try again\n");
- return(1);
- }
- if (i == 0) {
- execl("/bin/cp", "cp", source, target, 0);
- fprintf(stderr, "mv: cannot exec cp\n");
- exit(1);
- }
- while ((c = wait(&status)) != i && c != -1)
- ;
- if (status != 0)
- return(1);
- utime(target, &s1.st_atime);
- }
- if (unlink(source) < 0) {
- fprintf(stderr, "mv: cannot unlink %s\n", source);
- return(1);