diff options
Diffstat (limited to 'cp_mv.c')
-rw-r--r-- | cp_mv.c | 26 |
1 files changed, 15 insertions, 11 deletions
@@ -69,10 +69,12 @@ extern int cp_mv_main(int argc, char **argv) | |||
69 | 69 | ||
70 | const char *baseSrcName; | 70 | const char *baseSrcName; |
71 | int srcDirFlag; | 71 | int srcDirFlag; |
72 | struct stat srcStatBuf; | ||
72 | 73 | ||
73 | char baseDestName[PATH_MAX + 1]; | 74 | char baseDestName[PATH_MAX + 1]; |
74 | size_t baseDestLen; | 75 | size_t baseDestLen; |
75 | int destDirFlag; | 76 | int destDirFlag; |
77 | struct stat destStatBuf; | ||
76 | 78 | ||
77 | void fill_baseDest_buf(char *_buf, size_t * _buflen) { | 79 | void fill_baseDest_buf(char *_buf, size_t * _buflen) { |
78 | const char *srcBasename; | 80 | const char *srcBasename; |
@@ -91,7 +93,6 @@ extern int cp_mv_main(int argc, char **argv) | |||
91 | } | 93 | } |
92 | 94 | ||
93 | int fileAction(const char *fileName, struct stat *statbuf) { | 95 | int fileAction(const char *fileName, struct stat *statbuf) { |
94 | __label__ return_false; | ||
95 | char destName[PATH_MAX + 1]; | 96 | char destName[PATH_MAX + 1]; |
96 | size_t destLen; | 97 | size_t destLen; |
97 | const char *srcBasename; | 98 | const char *srcBasename; |
@@ -109,7 +110,7 @@ extern int cp_mv_main(int argc, char **argv) | |||
109 | 110 | ||
110 | if (destLen + strlen(srcBasename) > PATH_MAX) { | 111 | if (destLen + strlen(srcBasename) > PATH_MAX) { |
111 | fprintf(stderr, name_too_long, "cp"); | 112 | fprintf(stderr, name_too_long, "cp"); |
112 | goto return_false; | 113 | return FALSE; |
113 | } | 114 | } |
114 | strcat(destName, srcBasename); | 115 | strcat(destName, srcBasename); |
115 | } else if (destDirFlag == TRUE) { | 116 | } else if (destDirFlag == TRUE) { |
@@ -118,9 +119,6 @@ extern int cp_mv_main(int argc, char **argv) | |||
118 | srcBasename = baseSrcName; | 119 | srcBasename = baseSrcName; |
119 | } | 120 | } |
120 | return copyFile(fileName, destName, preserveFlag, followLinks); | 121 | return copyFile(fileName, destName, preserveFlag, followLinks); |
121 | |||
122 | return_false: | ||
123 | return FALSE; | ||
124 | } | 122 | } |
125 | 123 | ||
126 | int rmfileAction(const char *fileName, struct stat *statbuf) { | 124 | int rmfileAction(const char *fileName, struct stat *statbuf) { |
@@ -180,7 +178,6 @@ extern int cp_mv_main(int argc, char **argv) | |||
180 | argv++; | 178 | argv++; |
181 | } | 179 | } |
182 | } else { /* (dz_i == is_mv) */ | 180 | } else { /* (dz_i == is_mv) */ |
183 | |||
184 | recursiveFlag = preserveFlag = TRUE; | 181 | recursiveFlag = preserveFlag = TRUE; |
185 | followLinks = FALSE; | 182 | followLinks = FALSE; |
186 | } | 183 | } |
@@ -194,7 +191,7 @@ extern int cp_mv_main(int argc, char **argv) | |||
194 | if (baseDestLen == 0) | 191 | if (baseDestLen == 0) |
195 | goto exit_false; | 192 | goto exit_false; |
196 | 193 | ||
197 | destDirFlag = isDirectory(baseDestName, TRUE); | 194 | destDirFlag = isDirectory(baseDestName, TRUE, &destStatBuf); |
198 | if ((argc > 3) && destDirFlag == FALSE) { | 195 | if ((argc > 3) && destDirFlag == FALSE) { |
199 | fprintf(stderr, not_a_directory, "cp", baseDestName); | 196 | fprintf(stderr, not_a_directory, "cp", baseDestName); |
200 | goto exit_false; | 197 | goto exit_false; |
@@ -212,11 +209,18 @@ extern int cp_mv_main(int argc, char **argv) | |||
212 | if (srcLen == 0) | 209 | if (srcLen == 0) |
213 | continue; | 210 | continue; |
214 | 211 | ||
215 | srcDirFlag = isDirectory(baseSrcName, followLinks); | 212 | srcDirFlag = isDirectory(baseSrcName, followLinks, &srcStatBuf); |
216 | 213 | ||
217 | if ((flags_memo = (recursiveFlag == TRUE && | 214 | if ((flags_memo = (recursiveFlag == TRUE && |
218 | srcDirFlag == TRUE && destDirFlag == TRUE))) { | 215 | srcDirFlag == TRUE && destDirFlag == TRUE))) { |
219 | fill_baseDest_buf(&baseDestName[0], &baseDestLen); | 216 | if ((destStatBuf.st_ino == srcStatBuf.st_ino) && |
217 | (destStatBuf.st_rdev == srcStatBuf.st_rdev)) { | ||
218 | fprintf(stderr, | ||
219 | "%s: Cannot %s `%s' into a subdirectory of itself, `%s/%s'\n", | ||
220 | dz, dz, baseSrcName, baseDestName, baseSrcName); | ||
221 | continue; | ||
222 | } | ||
223 | fill_baseDest_buf(baseDestName, &baseDestLen); | ||
220 | } | 224 | } |
221 | if (recursiveAction(baseSrcName, | 225 | if (recursiveAction(baseSrcName, |
222 | recursiveFlag, followLinks, FALSE, | 226 | recursiveFlag, followLinks, FALSE, |
@@ -242,6 +246,6 @@ extern int cp_mv_main(int argc, char **argv) | |||
242 | } | 246 | } |
243 | 247 | ||
244 | // Local Variables: | 248 | // Local Variables: |
245 | // c-file-style: "k&r" | 249 | // c-file-style: "linux" |
246 | // c-basic-offset: 4 | 250 | // tab-width: 4 |
247 | // End: | 251 | // End: |