diff --git a/Changelog b/Changelog index 8edf3a62a..8d0b78eeb 100644 --- a/Changelog +++ b/Changelog @@ -13,6 +13,9 @@ * Fixed a bug where tar would set, and then clear SGID and SUID bits. * Fixed a bug where tar would not set the user and group on device special files. + * cp and mv were quite broken when moving directories. I have rewritten + them so they should now work as expected. + -Erik Andersen diff --git a/Makefile b/Makefile index 4215b291b..73aa2fc90 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ BUILDTIME=$(shell date "+%Y%m%d-%H%M") # Comment out the following to make a debuggable build # Leave this off for production use. -DODEBUG=true +DODEBUG=false # If you want a static binary, turn this on. I can't think # of many situations where anybody would ever want it static, # but... diff --git a/coreutils/cp.c b/coreutils/cp.c index 1e10f2868..83460190a 100644 --- a/coreutils/cp.c +++ b/coreutils/cp.c @@ -43,7 +43,6 @@ static int preserveFlag = FALSE; static const char *srcName; static const char *destName; static int destDirFlag = FALSE; -static int destExistsFlag = FALSE; static int srcDirFlag = FALSE; static int fileAction(const char *fileName, struct stat* statbuf) @@ -71,8 +70,6 @@ static int fileAction(const char *fileName, struct stat* statbuf) extern int cp_main(int argc, char **argv) { - struct stat statBuf; - if (argc < 3) { usage (cp_usage); } @@ -106,11 +103,7 @@ extern int cp_main(int argc, char **argv) destName = argv[argc - 1]; - if (stat(destName, &statBuf) >= 0) { - destExistsFlag = TRUE; - if (S_ISDIR(statBuf.st_mode)) - destDirFlag = TRUE; - } + destDirFlag = isDirectory(destName); if ((argc > 3) && destDirFlag==FALSE) { fprintf(stderr, "%s: not a directory\n", destName); diff --git a/coreutils/mv.c b/coreutils/mv.c index d0f346196..92c40c9b7 100644 --- a/coreutils/mv.c +++ b/coreutils/mv.c @@ -27,7 +27,6 @@ #include #include - static const char mv_usage[] = "mv SOURCE DEST\n" " or: mv SOURCE... DIRECTORY\n\n" "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.\n"; @@ -35,26 +34,49 @@ static const char mv_usage[] = "mv SOURCE DEST\n" static const char *srcName; static const char *destName; -static int dirFlag = FALSE; +static int destDirFlag = FALSE; +static int srcDirFlag = FALSE; static int fileAction(const char *fileName, struct stat* statbuf) { char newdestName[NAME_MAX]; - fprintf(stderr, "srcName='%s' destName='%s'\n", srcName, destName); strcpy(newdestName, destName); - strcat(newdestName, "/"); - strcat(newdestName, strstr(fileName, fileName)); - fprintf(stderr, "newdestName='%s'\n", newdestName); + if ( srcDirFlag == TRUE ) { + strcat(newdestName, strstr(fileName, srcName) + strlen(srcName)); + } + + if (destDirFlag==TRUE && srcDirFlag == FALSE) { + if (newdestName[strlen(newdestName)-1] != '/' ) { + strcat(newdestName, "/"); + } + strcat(newdestName, srcName); + } + return (copyFile(fileName, newdestName, TRUE, TRUE)); } +static int rmfileAction(const char *fileName, struct stat* statbuf) +{ + if (unlink( fileName) < 0 ) { + perror( fileName); + return ( FALSE); + } + return ( TRUE); +} + +static int rmdirAction(const char *fileName, struct stat* statbuf) +{ + if (rmdir( fileName) < 0 ) { + perror( fileName); + return ( FALSE); + } + return ( TRUE); +} + extern int mv_main(int argc, char **argv) { - char newdestName[NAME_MAX]; - char *skipName; - if (argc < 3) { usage (mv_usage); } @@ -62,45 +84,23 @@ extern int mv_main(int argc, char **argv) argv++; destName = argv[argc - 1]; - dirFlag = isDirectory(destName); + destDirFlag = isDirectory(destName); - if ((argc > 3) && dirFlag==FALSE) { + if ((argc > 3) && destDirFlag==FALSE) { fprintf(stderr, "%s: not a directory\n", destName); exit (FALSE); } - + while (argc-- > 1) { srcName = *(argv++); - skipName = strrchr(srcName, '/'); - if (skipName) - skipName++; - strcpy(newdestName, destName); - if (dirFlag==TRUE) { - strcat(newdestName, "/"); - if ( skipName != NULL) - strcat(newdestName, strstr(srcName, skipName)); - else - strcat(newdestName, srcName); + srcDirFlag = isDirectory(srcName); + if (recursiveAction(srcName, TRUE, TRUE, FALSE, + fileAction, fileAction) == FALSE) { + exit( FALSE); } - if (isDirectory(srcName)==TRUE && newdestName[strlen(newdestName)] != '/') { - strcat(newdestName, "/"); - createPath(newdestName, 0777); - fprintf(stderr, "srcName = '%s'\n", srcName); - fprintf(stderr, "newdestName = '%s'\n", newdestName); - if (recursiveAction(srcName, TRUE, TRUE, FALSE, - fileAction, fileAction) == FALSE) - { - exit( FALSE); - } - exit( TRUE); - } else { - if (copyFile(srcName, newdestName, FALSE, FALSE) == FALSE) { - exit( FALSE); - } - if (unlink (srcName) < 0) { - perror (srcName); - exit( FALSE); - } + if (recursiveAction(srcName, TRUE, TRUE, TRUE, + rmfileAction, rmdirAction) == FALSE) { + exit( FALSE); } } exit( TRUE); diff --git a/cp.c b/cp.c index 1e10f2868..83460190a 100644 --- a/cp.c +++ b/cp.c @@ -43,7 +43,6 @@ static int preserveFlag = FALSE; static const char *srcName; static const char *destName; static int destDirFlag = FALSE; -static int destExistsFlag = FALSE; static int srcDirFlag = FALSE; static int fileAction(const char *fileName, struct stat* statbuf) @@ -71,8 +70,6 @@ static int fileAction(const char *fileName, struct stat* statbuf) extern int cp_main(int argc, char **argv) { - struct stat statBuf; - if (argc < 3) { usage (cp_usage); } @@ -106,11 +103,7 @@ extern int cp_main(int argc, char **argv) destName = argv[argc - 1]; - if (stat(destName, &statBuf) >= 0) { - destExistsFlag = TRUE; - if (S_ISDIR(statBuf.st_mode)) - destDirFlag = TRUE; - } + destDirFlag = isDirectory(destName); if ((argc > 3) && destDirFlag==FALSE) { fprintf(stderr, "%s: not a directory\n", destName); diff --git a/mv.c b/mv.c index d0f346196..92c40c9b7 100644 --- a/mv.c +++ b/mv.c @@ -27,7 +27,6 @@ #include #include - static const char mv_usage[] = "mv SOURCE DEST\n" " or: mv SOURCE... DIRECTORY\n\n" "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.\n"; @@ -35,26 +34,49 @@ static const char mv_usage[] = "mv SOURCE DEST\n" static const char *srcName; static const char *destName; -static int dirFlag = FALSE; +static int destDirFlag = FALSE; +static int srcDirFlag = FALSE; static int fileAction(const char *fileName, struct stat* statbuf) { char newdestName[NAME_MAX]; - fprintf(stderr, "srcName='%s' destName='%s'\n", srcName, destName); strcpy(newdestName, destName); - strcat(newdestName, "/"); - strcat(newdestName, strstr(fileName, fileName)); - fprintf(stderr, "newdestName='%s'\n", newdestName); + if ( srcDirFlag == TRUE ) { + strcat(newdestName, strstr(fileName, srcName) + strlen(srcName)); + } + + if (destDirFlag==TRUE && srcDirFlag == FALSE) { + if (newdestName[strlen(newdestName)-1] != '/' ) { + strcat(newdestName, "/"); + } + strcat(newdestName, srcName); + } + return (copyFile(fileName, newdestName, TRUE, TRUE)); } +static int rmfileAction(const char *fileName, struct stat* statbuf) +{ + if (unlink( fileName) < 0 ) { + perror( fileName); + return ( FALSE); + } + return ( TRUE); +} + +static int rmdirAction(const char *fileName, struct stat* statbuf) +{ + if (rmdir( fileName) < 0 ) { + perror( fileName); + return ( FALSE); + } + return ( TRUE); +} + extern int mv_main(int argc, char **argv) { - char newdestName[NAME_MAX]; - char *skipName; - if (argc < 3) { usage (mv_usage); } @@ -62,45 +84,23 @@ extern int mv_main(int argc, char **argv) argv++; destName = argv[argc - 1]; - dirFlag = isDirectory(destName); + destDirFlag = isDirectory(destName); - if ((argc > 3) && dirFlag==FALSE) { + if ((argc > 3) && destDirFlag==FALSE) { fprintf(stderr, "%s: not a directory\n", destName); exit (FALSE); } - + while (argc-- > 1) { srcName = *(argv++); - skipName = strrchr(srcName, '/'); - if (skipName) - skipName++; - strcpy(newdestName, destName); - if (dirFlag==TRUE) { - strcat(newdestName, "/"); - if ( skipName != NULL) - strcat(newdestName, strstr(srcName, skipName)); - else - strcat(newdestName, srcName); + srcDirFlag = isDirectory(srcName); + if (recursiveAction(srcName, TRUE, TRUE, FALSE, + fileAction, fileAction) == FALSE) { + exit( FALSE); } - if (isDirectory(srcName)==TRUE && newdestName[strlen(newdestName)] != '/') { - strcat(newdestName, "/"); - createPath(newdestName, 0777); - fprintf(stderr, "srcName = '%s'\n", srcName); - fprintf(stderr, "newdestName = '%s'\n", newdestName); - if (recursiveAction(srcName, TRUE, TRUE, FALSE, - fileAction, fileAction) == FALSE) - { - exit( FALSE); - } - exit( TRUE); - } else { - if (copyFile(srcName, newdestName, FALSE, FALSE) == FALSE) { - exit( FALSE); - } - if (unlink (srcName) < 0) { - perror (srcName); - exit( FALSE); - } + if (recursiveAction(srcName, TRUE, TRUE, TRUE, + rmfileAction, rmdirAction) == FALSE) { + exit( FALSE); } } exit( TRUE);