Implementation of copy
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "%s <source-file> <destination-file>.\n", argv[0]);
return kWrongArgumentCount;
}
int fdin = open(argv[1], /* flags = */ O_RDONLY);
if (fdin == -1) {
fprintf(stderr, "%s: source file could not be opened.\n", argv[1]);
return kSourceFileNonExistent;
}
int fdout = open(argv[2], /* flags = */ O_WRONLY | O_CREAT | O_EXCL, 0644);
if (fdout == -1) {
switch (errno) {
case EEXIST:
fprintf(stderr, "%s: destination file already exists.\n", argv[2]);
break;
default:
fprintf(stderr, "%s: destination file could not be created.\n", argv[2]);
break;
}
return kDestinationFileOpenFailure;
}Implementation of copy, continued
char buffer[1024];
while (true) {
ssize_t bytesRead = read(fdin, buffer, sizeof(buffer));
if (bytesRead == 0) break;
if (bytesRead == -1) {
fprintf(stderr, "%s: lost access to file while reading.\n", argv[1]);
return kReadFailure;
}
size_t bytesWritten = 0;
while (bytesWritten < bytesRead) {
ssize_t count = write(fdout, buffer + bytesWritten, bytesRead - bytesWritten);
if (count == -1) {
fprintf(stderr, "%s: lost access to file while writing.\n", argv[2]);
return kWriteFailure;
}
bytesWritten += count;
}
}
if (close(fdin) == -1) fprintf(stderr, "%s: had trouble closing file.\n", argv[1]);
if (close(fdout) == -1) fprintf(stderr, "%s: had trouble closing file.\n", argv[2]);
return 0;
}