| The Android Open Source Project | dd7bc33 | 2009-03-03 19:32:55 -0800 | [diff] [blame] | 1 | #include <stdio.h> | 
|  | 2 | #include <string.h> | 
|  | 3 | #include <errno.h> | 
|  | 4 | #include <limits.h> | 
|  | 5 | #include <sys/stat.h> | 
|  | 6 | #include <sys/types.h> | 
|  | 7 |  | 
|  | 8 |  | 
|  | 9 | int mv_main(int argc, char *argv[]) | 
|  | 10 | { | 
|  | 11 | const char* dest; | 
|  | 12 | struct stat st; | 
|  | 13 | int i; | 
|  | 14 |  | 
|  | 15 | if (argc < 3) { | 
|  | 16 | fprintf(stderr,"USAGE: %s <source...> <destination>\n", argv[0]); | 
|  | 17 | return -1; | 
|  | 18 | } | 
|  | 19 |  | 
|  | 20 | /* check if destination exists */ | 
|  | 21 | dest = argv[argc - 1]; | 
|  | 22 | if (stat(dest, &st)) { | 
|  | 23 | /* an error, unless the destination was missing */ | 
|  | 24 | if (errno != ENOENT) { | 
|  | 25 | fprintf(stderr, "failed on %s - %s\n", dest, strerror(errno)); | 
|  | 26 | return -1; | 
|  | 27 | } | 
|  | 28 | st.st_mode = 0; | 
|  | 29 | } | 
|  | 30 |  | 
|  | 31 | for (i = 1; i < argc - 1; i++) { | 
|  | 32 | const char *source = argv[i]; | 
|  | 33 | char fullDest[PATH_MAX + 1 + PATH_MAX + 1]; | 
|  | 34 | /* assume we build "dest/source", and let rename() fail on pathsize */ | 
|  | 35 | if (strlen(dest) + 1 + strlen(source) + 1 > sizeof(fullDest)) { | 
|  | 36 | fprintf(stderr, "path too long\n"); | 
|  | 37 | return -1; | 
|  | 38 | } | 
|  | 39 | strcpy(fullDest, dest); | 
|  | 40 |  | 
|  | 41 | /* if destination is a directory, concat the source file name */ | 
|  | 42 | if (S_ISDIR(st.st_mode)) { | 
|  | 43 | const char *fileName = strrchr(source, '/'); | 
|  | 44 | if (fullDest[strlen(fullDest)-1] != '/') { | 
|  | 45 | strcat(fullDest, "/"); | 
|  | 46 | } | 
|  | 47 | strcat(fullDest, fileName ? fileName + 1 : source); | 
|  | 48 | } | 
|  | 49 |  | 
|  | 50 | /* attempt to move it */ | 
|  | 51 | if (rename(source, fullDest)) { | 
|  | 52 | fprintf(stderr, "failed on '%s' - %s\n", source, strerror(errno)); | 
|  | 53 | return -1; | 
|  | 54 | } | 
|  | 55 | } | 
|  | 56 |  | 
|  | 57 | return 0; | 
|  | 58 | } | 
|  | 59 |  |