#include #include #include #include #include #include #include #define USAGE "./mycp " #define BUFF 1024 int main(int argc, char **argv) { if (argc != 3) { fprintf(stderr, "Illegal usage, must specify two files.\n" "Usage: %s\n", USAGE); exit(-1); } if (strcmp(argv[1], argv[2]) == 0) { fprintf(stderr, "%s and %s are identical.", argv[1], argv[2]); exit(-1); } int from = -1; int to = -1; while ((from = open(argv[1], O_RDONLY)) == -1 && errno == EINTR); if (from == -1) { fprintf(stderr, "Couldn't open from file, %s.\n", argv[1]); exit(-1); } while ((to = open(argv[2], O_WRONLY | O_CREAT)) == -1 && errno == EINTR); if (to == -1) { fprintf(stderr, "Couldn't open to file, %s.\n", argv[2]); close(from); exit(-1); } char buf[BUFF]; ssize_t bytesRead = 0, bytesWritten = 0; while (1) { bytesRead = read(from, buf, BUFF); if (bytesRead == -1 && bytesRead != EINTR) { fprintf(stderr, "Error reading from file %s.", argv[1]); close(from); close(to); exit(-1); } else if (bytesRead == 0) { break; } while ((bytesWritten = write(to, buf, bytesRead)) == -1 && errno == EINTR); } close(from); close(to); exit(0); }