| int mv_main(int argc, char *argv[]) |
| fprintf(stderr,"USAGE: %s <source...> <destination>\n", argv[0]); |
| /* check if destination exists */ |
| /* an error, unless the destination was missing */ |
| fprintf(stderr, "failed on %s - %s\n", dest, strerror(errno)); |
| for (i = 1; i < argc - 1; i++) { |
| const char *source = argv[i]; |
| char fullDest[PATH_MAX + 1 + PATH_MAX + 1]; |
| /* assume we build "dest/source", and let rename() fail on pathsize */ |
| if (strlen(dest) + 1 + strlen(source) + 1 > sizeof(fullDest)) { |
| fprintf(stderr, "path too long\n"); |
| /* if destination is a directory, concat the source file name */ |
| if (S_ISDIR(st.st_mode)) { |
| const char *fileName = strrchr(source, '/'); |
| if (fullDest[strlen(fullDest)-1] != '/') { |
| strcat(fullDest, fileName ? fileName + 1 : source); |
| if (rename(source, fullDest)) { |
| fprintf(stderr, "failed on '%s' - %s\n", source, strerror(errno)); |