#include // close, and in general #include //read #include //read #include //read #include // strlen #include // errno #include //strerror using namespace std; const char * NL = "\n"; const char * FAIL_TO_OPEN = "Error, failed to open: "; const char * FAIL_TO_READ = "Error, failed to read from: "; const char * FAIL_TO_WRITE = "Error, failed to write data from: "; void Header(char * filename) { write(STDOUT_FILENO,"Opening: ", 9); write(STDOUT_FILENO,filename, strlen(filename)); write(STDOUT_FILENO,"\n",1); return; } void Error(char * filename, int errorNumber, const char * msg) { char * errorMessage; write (STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO,filename, strlen(filename)); write(STDERR_FILENO, NL, strlen(NL)); errorMessage = strerror(errorNumber); write(STDERR_FILENO, errorMessage, strlen(errorMessage)); write(STDERR_FILENO, NL, strlen(NL)); return; } const int BUF_SIZE = 256; void MyCat(char * filename) { int fd; int error; char buffer[BUF_SIZE]; int inSize, outSize; Header(filename); fd = open(filename, O_RDONLY); if (fd == -1) { error = errno; Error(filename, error, FAIL_TO_OPEN) ; } else { inSize = read(fd,buffer,BUF_SIZE); error = errno; while (inSize > 0) { outSize = write(STDOUT_FILENO, buffer, inSize); error = errno; // I'm going to assume only output fail, we really should // handle incomplete output too. if (outSize < 0) { Error(filename, error, FAIL_TO_WRITE); } inSize = read(fd,buffer,BUF_SIZE); error = errno; } if (inSize == -1) { Error(filename, error, FAIL_TO_READ); } } write(STDERR_FILENO, NL, strlen(NL)); return; } int main(int argc, char * argv[]) { int i; for(i=1;i