aboutsummaryrefslogtreecommitdiff
path: root/cp_mv.c
diff options
context:
space:
mode:
Diffstat (limited to 'cp_mv.c')
-rw-r--r--cp_mv.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/cp_mv.c b/cp_mv.c
index 33adf8f55..4c55e62d0 100644
--- a/cp_mv.c
+++ b/cp_mv.c
@@ -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: