diff options
author | erik <erik@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 1999-12-29 02:36:29 +0000 |
---|---|---|
committer | erik <erik@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 1999-12-29 02:36:29 +0000 |
commit | b075e176c84bb3a5518bbabc5172212886a763b5 (patch) | |
tree | 0eb9f4d1d08bde592fc79ef034990fd5c0788e25 /mv.c | |
parent | 44f4e93332fd720f2962fc4189a710c30a5cb7f6 (diff) | |
download | busybox-w32-b075e176c84bb3a5518bbabc5172212886a763b5.tar.gz busybox-w32-b075e176c84bb3a5518bbabc5172212886a763b5.tar.bz2 busybox-w32-b075e176c84bb3a5518bbabc5172212886a763b5.zip |
Fixed mv so it now does the right thing (same method used in cp). Removed
some cruft from cp.
-Erik
git-svn-id: svn://busybox.net/trunk/busybox@268 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'mv.c')
-rw-r--r-- | mv.c | 82 |
1 files changed, 41 insertions, 41 deletions
@@ -27,7 +27,6 @@ | |||
27 | #include <utime.h> | 27 | #include <utime.h> |
28 | #include <dirent.h> | 28 | #include <dirent.h> |
29 | 29 | ||
30 | |||
31 | static const char mv_usage[] = "mv SOURCE DEST\n" | 30 | static const char mv_usage[] = "mv SOURCE DEST\n" |
32 | " or: mv SOURCE... DIRECTORY\n\n" | 31 | " or: mv SOURCE... DIRECTORY\n\n" |
33 | "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.\n"; | 32 | "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.\n"; |
@@ -35,26 +34,49 @@ static const char mv_usage[] = "mv SOURCE DEST\n" | |||
35 | 34 | ||
36 | static const char *srcName; | 35 | static const char *srcName; |
37 | static const char *destName; | 36 | static const char *destName; |
38 | static int dirFlag = FALSE; | 37 | static int destDirFlag = FALSE; |
38 | static int srcDirFlag = FALSE; | ||
39 | 39 | ||
40 | static int fileAction(const char *fileName, struct stat* statbuf) | 40 | static int fileAction(const char *fileName, struct stat* statbuf) |
41 | { | 41 | { |
42 | char newdestName[NAME_MAX]; | 42 | char newdestName[NAME_MAX]; |
43 | 43 | ||
44 | fprintf(stderr, "srcName='%s' destName='%s'\n", srcName, destName); | ||
45 | strcpy(newdestName, destName); | 44 | strcpy(newdestName, destName); |
46 | strcat(newdestName, "/"); | 45 | if ( srcDirFlag == TRUE ) { |
47 | strcat(newdestName, strstr(fileName, fileName)); | 46 | strcat(newdestName, strstr(fileName, srcName) + strlen(srcName)); |
48 | fprintf(stderr, "newdestName='%s'\n", newdestName); | 47 | } |
48 | |||
49 | if (destDirFlag==TRUE && srcDirFlag == FALSE) { | ||
50 | if (newdestName[strlen(newdestName)-1] != '/' ) { | ||
51 | strcat(newdestName, "/"); | ||
52 | } | ||
53 | strcat(newdestName, srcName); | ||
54 | } | ||
55 | |||
49 | return (copyFile(fileName, newdestName, TRUE, TRUE)); | 56 | return (copyFile(fileName, newdestName, TRUE, TRUE)); |
50 | } | 57 | } |
51 | 58 | ||
59 | static int rmfileAction(const char *fileName, struct stat* statbuf) | ||
60 | { | ||
61 | if (unlink( fileName) < 0 ) { | ||
62 | perror( fileName); | ||
63 | return ( FALSE); | ||
64 | } | ||
65 | return ( TRUE); | ||
66 | } | ||
52 | 67 | ||
53 | extern int mv_main(int argc, char **argv) | 68 | static int rmdirAction(const char *fileName, struct stat* statbuf) |
54 | { | 69 | { |
55 | char newdestName[NAME_MAX]; | 70 | if (rmdir( fileName) < 0 ) { |
56 | char *skipName; | 71 | perror( fileName); |
72 | return ( FALSE); | ||
73 | } | ||
74 | return ( TRUE); | ||
75 | } | ||
57 | 76 | ||
77 | |||
78 | extern int mv_main(int argc, char **argv) | ||
79 | { | ||
58 | if (argc < 3) { | 80 | if (argc < 3) { |
59 | usage (mv_usage); | 81 | usage (mv_usage); |
60 | } | 82 | } |
@@ -62,45 +84,23 @@ extern int mv_main(int argc, char **argv) | |||
62 | argv++; | 84 | argv++; |
63 | 85 | ||
64 | destName = argv[argc - 1]; | 86 | destName = argv[argc - 1]; |
65 | dirFlag = isDirectory(destName); | 87 | destDirFlag = isDirectory(destName); |
66 | 88 | ||
67 | if ((argc > 3) && dirFlag==FALSE) { | 89 | if ((argc > 3) && destDirFlag==FALSE) { |
68 | fprintf(stderr, "%s: not a directory\n", destName); | 90 | fprintf(stderr, "%s: not a directory\n", destName); |
69 | exit (FALSE); | 91 | exit (FALSE); |
70 | } | 92 | } |
71 | 93 | ||
72 | while (argc-- > 1) { | 94 | while (argc-- > 1) { |
73 | srcName = *(argv++); | 95 | srcName = *(argv++); |
74 | skipName = strrchr(srcName, '/'); | 96 | srcDirFlag = isDirectory(srcName); |
75 | if (skipName) | 97 | if (recursiveAction(srcName, TRUE, TRUE, FALSE, |
76 | skipName++; | 98 | fileAction, fileAction) == FALSE) { |
77 | strcpy(newdestName, destName); | 99 | exit( FALSE); |
78 | if (dirFlag==TRUE) { | ||
79 | strcat(newdestName, "/"); | ||
80 | if ( skipName != NULL) | ||
81 | strcat(newdestName, strstr(srcName, skipName)); | ||
82 | else | ||
83 | strcat(newdestName, srcName); | ||
84 | } | 100 | } |
85 | if (isDirectory(srcName)==TRUE && newdestName[strlen(newdestName)] != '/') { | 101 | if (recursiveAction(srcName, TRUE, TRUE, TRUE, |
86 | strcat(newdestName, "/"); | 102 | rmfileAction, rmdirAction) == FALSE) { |
87 | createPath(newdestName, 0777); | 103 | exit( FALSE); |
88 | fprintf(stderr, "srcName = '%s'\n", srcName); | ||
89 | fprintf(stderr, "newdestName = '%s'\n", newdestName); | ||
90 | if (recursiveAction(srcName, TRUE, TRUE, FALSE, | ||
91 | fileAction, fileAction) == FALSE) | ||
92 | { | ||
93 | exit( FALSE); | ||
94 | } | ||
95 | exit( TRUE); | ||
96 | } else { | ||
97 | if (copyFile(srcName, newdestName, FALSE, FALSE) == FALSE) { | ||
98 | exit( FALSE); | ||
99 | } | ||
100 | if (unlink (srcName) < 0) { | ||
101 | perror (srcName); | ||
102 | exit( FALSE); | ||
103 | } | ||
104 | } | 104 | } |
105 | } | 105 | } |
106 | exit( TRUE); | 106 | exit( TRUE); |