X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mv.c;h=92c40c9b7866bf8f8b1f2f9f9a0345e9b32783ae;hb=9d83165d9e36c61cf2fa49deee1bc14bd2d56c1d;hp=2be3961ca5b06f85e50b0eea35c5b23d31a48f2c;hpb=d80e851dc05f978dded84b7ac9fcae7066e3ffe0;p=oweals%2Fbusybox.git diff --git a/mv.c b/mv.c index 2be3961ca..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,14 +34,49 @@ static const char mv_usage[] = "mv SOURCE DEST\n" static const char *srcName; static const char *destName; -static const char *skipName; -static int dirFlag = FALSE; - +static int destDirFlag = FALSE; +static int srcDirFlag = FALSE; -extern int mv_main(int argc, char **argv) +static int fileAction(const char *fileName, struct stat* statbuf) { char newdestName[NAME_MAX]; + strcpy(newdestName, destName); + 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) +{ if (argc < 3) { usage (mv_usage); } @@ -50,34 +84,22 @@ 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); - fprintf(stderr, "srcName='%s'\n", srcName); - fprintf(stderr, "skipName='%s'\n", skipName); - fprintf(stderr, "newdestName='%s'\n", newdestName); - } - if (copyFile(srcName, newdestName, FALSE, FALSE) == FALSE) { + srcDirFlag = isDirectory(srcName); + if (recursiveAction(srcName, TRUE, TRUE, FALSE, + fileAction, fileAction) == FALSE) { exit( FALSE); } - if (unlink (srcName) < 0) { - perror (srcName); + if (recursiveAction(srcName, TRUE, TRUE, TRUE, + rmfileAction, rmdirAction) == FALSE) { exit( FALSE); } }