1 /* fileCopy1.c 2 This example shows how to do file copy, one block at a time. 3 System calls used in this program: 4 . write(), read(), open(), close(), exit(), lseek(). 5 */ 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #define FMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 13 main() 14 { 15 char buf[BUFSIZ]; 16 char PROMPT1[] = "Please enter source filename >> "; 17 char PROMPT2[] = "Please enter target filename >> "; 18 char ERR1[] = "Can't open source file\n"; 19 char ERR2[] = "Can't open target file\n"; 20 char ERR3[] = "Can't read source file\n"; 21 int fd1, fd2, i, nblock; 22 ssize_t nread; 23 off_t flen; 24 write(STDOUT_FILENO, PROMPT1, strlen(PROMPT1)); /* ask for input file */ 25 nread = read(STDIN_FILENO, buf, BUFSIZ); /* read from stdin */ 26 buf[nread-1] = '\0'; /* strip \n & NULL-terminate buf */ 27 if ((fd1 = open(buf, O_RDONLY)) == -1) { /* open for read */ 28 write(STDERR_FILENO, ERR1, strlen(ERR1)); /* write to stderr */ 29 return(1); 30 } 31 write(STDOUT_FILENO, PROMPT2, strlen(PROMPT2)); /* ask for output file */ 32 nread = read(STDIN_FILENO, buf, BUFSIZ); /* read from stdin */ 33 buf[nread-1] = '\0'; /* strip \n & NULL-terminate str */ 34 if ((fd2 = open(buf, O_WRONLY | O_CREAT | O_TRUNC, FMODE)) == -1) { 35 write(STDERR_FILENO, ERR2, strlen(ERR2)); /* write to stderr */ 36 return(2); 37 } 38 flen = lseek(fd1, 0, SEEK_END); /* get file length in char */ 39 nblock = flen / BUFSIZ; /* # of blocks needed */ 40 41 lseek(fd1, 0, SEEK_SET); /* rewind */ 42 for (i = 0; i <= nblock; i++) { 43 nread = read(fd1, buf, BUFSIZ); 44 write(fd2, buf, nread); /* save to file 2 */ 45 } 46 if (nread < 0) { 47 write(STDERR_FILENO, ERR3, strlen(ERR3)); /* write to stderr */ 48 return(3); 49 } 50 close(fd1); 51 close(fd2); 52 exit(0); 53 }