+ }
+
+ for (;;) {
+ n = read(fi, buf, sizeof buf);
+ if (n == 0) {
+ break;
+ } else if (n < 0) {
+ Perror2(source, "read");
+ close(fi);
+ close(fo);
+ return (1);
+ } else if (write(fo, buf, n) != n) {
+ Perror2(target, "write");
+ close(fi);
+ close(fo);
+ return (1);
+ }
+ }
+
+ close(fi);
+ close(fo);
+
+ tv[0].tv_sec = s1.st_atime;
+ tv[0].tv_usec = 0;
+ tv[1].tv_sec = s1.st_mtime;
+ tv[1].tv_usec = 0;
+ (void) utimes(target, tv);