diff options
Diffstat (limited to 'utility.c')
-rw-r--r-- | utility.c | 45 |
1 files changed, 30 insertions, 15 deletions
@@ -231,7 +231,7 @@ void reset_ino_dev_hashtable(void) | |||
231 | 231 | ||
232 | #endif /* BB_CP_MV || BB_DU */ | 232 | #endif /* BB_CP_MV || BB_DU */ |
233 | 233 | ||
234 | #if defined (BB_CP_MV) || defined (BB_DU) || defined (BB_LN) || defined (BB_AR) | 234 | #if defined (BB_CP_MV) || defined (BB_DU) || defined (BB_LN) |
235 | /* | 235 | /* |
236 | * Return TRUE if a fileName is a directory. | 236 | * Return TRUE if a fileName is a directory. |
237 | * Nonexistant files return FALSE. | 237 | * Nonexistant files return FALSE. |
@@ -264,6 +264,29 @@ int isDirectory(const char *fileName, const int followLinks, struct stat *statBu | |||
264 | } | 264 | } |
265 | #endif | 265 | #endif |
266 | 266 | ||
267 | #if defined (BB_AR) | ||
268 | /* | ||
269 | * Copy readSize bytes between two file descriptors | ||
270 | */ | ||
271 | int copySubFile(int srcFd, int dstFd, size_t remaining) | ||
272 | { | ||
273 | size_t size; | ||
274 | char buffer[BUFSIZ]; | ||
275 | |||
276 | while (remaining > 0) { | ||
277 | if (remaining > BUFSIZ) | ||
278 | size = BUFSIZ; | ||
279 | else | ||
280 | size = remaining; | ||
281 | if (fullWrite(dstFd, buffer, fullRead(srcFd, buffer, size)) < size) | ||
282 | return(FALSE); | ||
283 | remaining -= size; | ||
284 | } | ||
285 | return (TRUE); | ||
286 | } | ||
287 | #endif | ||
288 | |||
289 | |||
267 | #if defined (BB_CP_MV) | 290 | #if defined (BB_CP_MV) |
268 | /* | 291 | /* |
269 | * Copy one file to another, while possibly preserving its modes, times, and | 292 | * Copy one file to another, while possibly preserving its modes, times, and |
@@ -277,9 +300,7 @@ copyFile(const char *srcName, const char *destName, | |||
277 | { | 300 | { |
278 | int rfd; | 301 | int rfd; |
279 | int wfd; | 302 | int wfd; |
280 | int rcc; | ||
281 | int status; | 303 | int status; |
282 | char buf[BUF_SIZE]; | ||
283 | struct stat srcStatBuf; | 304 | struct stat srcStatBuf; |
284 | struct stat dstStatBuf; | 305 | struct stat dstStatBuf; |
285 | struct utimbuf times; | 306 | struct utimbuf times; |
@@ -364,8 +385,7 @@ copyFile(const char *srcName, const char *destName, | |||
364 | return FALSE; | 385 | return FALSE; |
365 | } | 386 | } |
366 | 387 | ||
367 | wfd = | 388 | wfd = open(destName, O_WRONLY | O_CREAT | O_TRUNC, |
368 | open(destName, O_WRONLY | O_CREAT | O_TRUNC, | ||
369 | srcStatBuf.st_mode); | 389 | srcStatBuf.st_mode); |
370 | if (wfd < 0) { | 390 | if (wfd < 0) { |
371 | perror(destName); | 391 | perror(destName); |
@@ -373,14 +393,9 @@ copyFile(const char *srcName, const char *destName, | |||
373 | return FALSE; | 393 | return FALSE; |
374 | } | 394 | } |
375 | 395 | ||
376 | while ((rcc = read(rfd, buf, sizeof(buf))) > 0) { | 396 | if (copySubFile(rfd, wfd, srcStatBuf.st_size)==FALSE) |
377 | if (fullWrite(wfd, buf, rcc) < 0) | 397 | goto error_exit; |
378 | goto error_exit; | 398 | |
379 | } | ||
380 | if (rcc < 0) { | ||
381 | goto error_exit; | ||
382 | } | ||
383 | |||
384 | close(rfd); | 399 | close(rfd); |
385 | if (close(wfd) < 0) { | 400 | if (close(wfd) < 0) { |
386 | return FALSE; | 401 | return FALSE; |
@@ -677,7 +692,7 @@ int recursiveAction(const char *fileName, | |||
677 | 692 | ||
678 | 693 | ||
679 | 694 | ||
680 | #if defined (BB_TAR) || defined (BB_MKDIR) || defined (BB_AR) | 695 | #if defined (BB_TAR) || defined (BB_MKDIR) |
681 | /* | 696 | /* |
682 | * Attempt to create the directories along the specified path, except for | 697 | * Attempt to create the directories along the specified path, except for |
683 | * the final component. The mode is given for the final directory only, | 698 | * the final component. The mode is given for the final directory only, |
@@ -1292,7 +1307,7 @@ extern long getNum(const char *cp) | |||
1292 | #endif /* BB_DD || BB_TAIL */ | 1307 | #endif /* BB_DD || BB_TAIL */ |
1293 | 1308 | ||
1294 | 1309 | ||
1295 | #if defined BB_INIT || defined BB_SYSLOGD || defined BB_AR | 1310 | #if defined BB_INIT || defined BB_SYSLOGD |
1296 | /* try to open up the specified device */ | 1311 | /* try to open up the specified device */ |
1297 | extern int device_open(char *device, int mode) | 1312 | extern int device_open(char *device, int mode) |
1298 | { | 1313 | { |