Lines Matching refs:pair

103 static bool io_write_buf(file_pair *pair, const uint8_t *buf, size_t size);
182 io_wait(file_pair *pair, int timeout, bool is_reading) in io_wait() argument
187 pfd[0].fd = pair->src_fd; in io_wait()
190 pfd[0].fd = pair->dest_fd; in io_wait()
208 is_reading ? pair->src_name in io_wait()
209 : pair->dest_name, in io_wait()
293 io_copy_attrs(const file_pair *pair) in io_copy_attrs() argument
305 if (fchown(pair->dest_fd, pair->src_st.st_uid, (gid_t)(-1)) in io_copy_attrs()
308 pair->dest_name, strerror(errno)); in io_copy_attrs()
317 if (pair->dest_st.st_gid != pair->src_st.st_gid in io_copy_attrs()
318 && fchown(pair->dest_fd, (uid_t)(-1), in io_copy_attrs()
319 pair->src_st.st_gid)) { in io_copy_attrs()
321 pair->dest_name, strerror(errno)); in io_copy_attrs()
330 mode = ((pair->src_st.st_mode & 0070) >> 3) in io_copy_attrs()
331 & (pair->src_st.st_mode & 0007); in io_copy_attrs()
332 mode = (pair->src_st.st_mode & 0700) | (mode << 3) | mode; in io_copy_attrs()
335 mode = pair->src_st.st_mode & 0777; in io_copy_attrs()
338 if (fchmod(pair->dest_fd, mode)) in io_copy_attrs()
340 pair->dest_name, strerror(errno)); in io_copy_attrs()
354 atime_nsec = pair->src_st.st_atim.tv_nsec; in io_copy_attrs()
355 mtime_nsec = pair->src_st.st_mtim.tv_nsec; in io_copy_attrs()
359 atime_nsec = pair->src_st.st_atimespec.tv_nsec; in io_copy_attrs()
360 mtime_nsec = pair->src_st.st_mtimespec.tv_nsec; in io_copy_attrs()
364 atime_nsec = pair->src_st.st_atimensec; in io_copy_attrs()
365 mtime_nsec = pair->src_st.st_mtimensec; in io_copy_attrs()
369 atime_nsec = pair->src_st.st_uatime * 1000; in io_copy_attrs()
370 mtime_nsec = pair->src_st.st_umtime * 1000; in io_copy_attrs()
374 atime_nsec = pair->src_st.st_atim.st__tim.tv_nsec; in io_copy_attrs()
375 mtime_nsec = pair->src_st.st_mtim.st__tim.tv_nsec; in io_copy_attrs()
388 tv[0].tv_sec = pair->src_st.st_atime; in io_copy_attrs()
390 tv[1].tv_sec = pair->src_st.st_mtime; in io_copy_attrs()
393 (void)futimens(pair->dest_fd, tv); in io_copy_attrs()
398 tv[0].tv_sec = pair->src_st.st_atime; in io_copy_attrs()
400 tv[1].tv_sec = pair->src_st.st_mtime; in io_copy_attrs()
404 (void)futimes(pair->dest_fd, tv); in io_copy_attrs()
406 (void)futimesat(pair->dest_fd, NULL, tv); in io_copy_attrs()
409 (void)utimes(pair->dest_name, tv); in io_copy_attrs()
418 .actime = pair->src_st.st_atime, in io_copy_attrs()
419 .modtime = pair->src_st.st_mtime, in io_copy_attrs()
426 (void)_futime(pair->dest_fd, &buf); in io_copy_attrs()
433 .actime = pair->src_st.st_atime, in io_copy_attrs()
434 .modtime = pair->src_st.st_mtime, in io_copy_attrs()
441 (void)utime(pair->dest_name, &buf); in io_copy_attrs()
450 io_open_src_real(file_pair *pair) in io_open_src_real() argument
453 if (pair->src_name == stdin_filename) { in io_open_src_real()
454 pair->src_fd = STDIN_FILENO; in io_open_src_real()
517 if (lstat(pair->src_name, &st)) { in io_open_src_real()
518 message_error(_("%s: %s"), pair->src_name, in io_open_src_real()
524 "skipping"), pair->src_name); in io_open_src_real()
535 pair->src_fd = open(pair->src_name, flags); in io_open_src_real()
537 if (pair->src_fd == -1) { in io_open_src_real()
576 if (lstat(pair->src_name, &st) == 0 in io_open_src_real()
586 "skipping"), pair->src_name); in io_open_src_real()
592 message_error(_("%s: %s"), pair->src_name, in io_open_src_real()
606 if (stat(pair->src_name, &pair->src_st)) in io_open_src_real()
609 if (fstat(pair->src_fd, &pair->src_st)) in io_open_src_real()
613 if (S_ISDIR(pair->src_st.st_mode)) { in io_open_src_real()
615 pair->src_name); in io_open_src_real()
619 if (reg_files_only && !S_ISREG(pair->src_st.st_mode)) { in io_open_src_real()
621 pair->src_name); in io_open_src_real()
627 if (pair->src_st.st_mode & (S_ISUID | S_ISGID)) { in io_open_src_real()
639 pair->src_name); in io_open_src_real()
643 if (pair->src_st.st_mode & S_ISVTX) { in io_open_src_real()
646 pair->src_name); in io_open_src_real()
650 if (pair->src_st.st_nlink > 1) { in io_open_src_real()
653 "skipping"), pair->src_name); in io_open_src_real()
661 if (!S_ISREG(pair->src_st.st_mode)) { in io_open_src_real()
663 const io_wait_ret ret = io_wait(pair, -1, true); in io_open_src_real()
673 (void)posix_fadvise(pair->src_fd, 0, 0, in io_open_src_real()
682 message_error(_("%s: %s"), pair->src_name, strerror(errno)); in io_open_src_real()
684 (void)close(pair->src_fd); in io_open_src_real()
699 static file_pair pair; in io_open_src() local
705 pair = (file_pair){ in io_open_src()
720 const bool error = io_open_src_real(&pair); in io_open_src()
725 sandbox_enable_strict_if_allowed(pair.src_fd, in io_open_src()
729 return error ? NULL : &pair; in io_open_src()
739 io_close_src(file_pair *pair, bool success) in io_close_src() argument
743 assert(pair->src_fd == STDIN_FILENO); in io_close_src()
754 if (pair->src_fd != STDIN_FILENO && pair->src_fd != -1) { in io_close_src()
767 (void)close(pair->src_fd); in io_close_src()
770 io_unlink(pair->src_name, &pair->src_st); in io_close_src()
778 io_open_dest_real(file_pair *pair) in io_open_dest_real() argument
780 if (opt_stdout || pair->src_fd == STDIN_FILENO) { in io_open_dest_real()
782 pair->dest_name = (char *)"(stdout)"; in io_open_dest_real()
783 pair->dest_fd = STDOUT_FILENO; in io_open_dest_real()
808 pair->dest_name = suffix_get_dest_name(pair->src_name); in io_open_dest_real()
809 if (pair->dest_name == NULL) in io_open_dest_real()
814 if (stat(pair->dest_name, &st) == 0) { in io_open_dest_real()
819 pair->dest_name); in io_open_dest_real()
820 free(pair->dest_name); in io_open_dest_real()
825 if (st.st_dev == pair->src_st.st_dev in io_open_dest_real()
826 && st.st_ino == pair->src_st.st_ino) { in io_open_dest_real()
829 pair->dest_name); in io_open_dest_real()
830 free(pair->dest_name); in io_open_dest_real()
837 if (opt_force && unlink(pair->dest_name) && errno != ENOENT) { in io_open_dest_real()
839 pair->dest_name, strerror(errno)); in io_open_dest_real()
840 free(pair->dest_name); in io_open_dest_real()
851 pair->dest_fd = open(pair->dest_name, flags, mode); in io_open_dest_real()
853 if (pair->dest_fd == -1) { in io_open_dest_real()
854 message_error(_("%s: %s"), pair->dest_name, in io_open_dest_real()
856 free(pair->dest_name); in io_open_dest_real()
861 if (fstat(pair->dest_fd, &pair->dest_st)) { in io_open_dest_real()
864 pair->dest_st.st_ino[0] = 0; in io_open_dest_real()
865 pair->dest_st.st_ino[1] = 0; in io_open_dest_real()
866 pair->dest_st.st_ino[2] = 0; in io_open_dest_real()
868 pair->dest_st.st_dev = 0; in io_open_dest_real()
869 pair->dest_st.st_ino = 0; in io_open_dest_real()
882 else if (pair->dest_fd != STDOUT_FILENO in io_open_dest_real()
883 && !S_ISREG(pair->dest_st.st_mode)) { in io_open_dest_real()
885 pair->dest_name); in io_open_dest_real()
888 (void)close(pair->dest_fd); in io_open_dest_real()
889 pair->dest_fd = -1; in io_open_dest_real()
891 free(pair->dest_name); in io_open_dest_real()
908 if (pair->dest_fd == STDOUT_FILENO) { in io_open_dest_real()
909 if (!S_ISREG(pair->dest_st.st_mode)) in io_open_dest_real()
951 != pair->dest_st.st_size) { in io_open_dest_real()
959 pair->dest_try_sparse = true; in io_open_dest_real()
968 io_open_dest(file_pair *pair) in io_open_dest() argument
971 const bool ret = io_open_dest_real(pair); in io_open_dest()
985 io_close_dest(file_pair *pair, bool success) in io_close_dest() argument
990 assert(pair->dest_fd == STDOUT_FILENO); in io_close_dest()
1003 if (pair->dest_fd == -1 || pair->dest_fd == STDOUT_FILENO) in io_close_dest()
1006 if (close(pair->dest_fd)) { in io_close_dest()
1008 pair->dest_name, strerror(errno)); in io_close_dest()
1012 io_unlink(pair->dest_name, &pair->dest_st); in io_close_dest()
1013 free(pair->dest_name); in io_close_dest()
1020 io_unlink(pair->dest_name, &pair->dest_st); in io_close_dest()
1022 free(pair->dest_name); in io_close_dest()
1029 io_close(file_pair *pair, bool success) in io_close() argument
1032 if (success && pair->dest_try_sparse in io_close()
1033 && pair->dest_pending_sparse > 0) { in io_close()
1041 if (lseek(pair->dest_fd, pair->dest_pending_sparse - 1, in io_close()
1045 pair->dest_name, strerror(errno)); in io_close()
1049 if (io_write_buf(pair, zero, 1)) in io_close()
1058 if (success && pair->dest_fd != -1 && pair->dest_fd != STDOUT_FILENO) in io_close()
1059 io_copy_attrs(pair); in io_close()
1063 if (io_close_dest(pair, success)) in io_close()
1069 io_close_src(pair, success); in io_close()
1078 io_fix_src_pos(file_pair *pair, size_t rewind_size) in io_fix_src_pos() argument
1085 (void)lseek(pair->src_fd, -(off_t)(rewind_size), SEEK_CUR); in io_fix_src_pos()
1093 io_read(file_pair *pair, io_buf *buf, size_t size) in io_read() argument
1101 pair->src_fd, buf->u8 + pos, size - pos); in io_read()
1104 pair->src_eof = true; in io_read()
1122 const int timeout = pair->src_has_seen_input in io_read()
1126 switch (io_wait(pair, timeout, true)) { in io_read()
1134 pair->flush_needed = true; in io_read()
1144 pair->src_name, strerror(errno)); in io_read()
1151 if (!pair->src_has_seen_input) { in io_read()
1152 pair->src_has_seen_input = true; in io_read()
1162 io_seek_src(file_pair *pair, uint64_t pos) in io_seek_src() argument
1169 if (pos > (uint64_t)(pair->src_st.st_size)) in io_seek_src()
1172 if (lseek(pair->src_fd, (off_t)(pos), SEEK_SET) == -1) { in io_seek_src()
1174 pair->src_name, strerror(errno)); in io_seek_src()
1178 pair->src_eof = false; in io_seek_src()
1185 io_pread(file_pair *pair, io_buf *buf, size_t size, uint64_t pos) in io_pread() argument
1189 if (io_seek_src(pair, pos)) in io_pread()
1192 const size_t amount = io_read(pair, buf, size); in io_pread()
1198 pair->src_name); in io_pread()
1220 io_write_buf(file_pair *pair, const uint8_t *buf, size_t size) in io_write_buf() argument
1225 const ssize_t amount = write(pair->dest_fd, buf, size); in io_write_buf()
1236 if (io_wait(pair, -1, false) == IO_WAIT_MORE) in io_write_buf()
1257 pair->dest_name, strerror(errno)); in io_write_buf()
1271 io_write(file_pair *pair, const io_buf *buf, size_t size) in io_write() argument
1275 if (pair->dest_try_sparse) { in io_write()
1291 if (is_sparse(buf) && pair->dest_pending_sparse in io_write()
1293 pair->dest_pending_sparse += (off_t)(size); in io_write()
1302 if (pair->dest_pending_sparse > 0) { in io_write()
1303 if (lseek(pair->dest_fd, pair->dest_pending_sparse, in io_write()
1307 "file: %s"), pair->dest_name, in io_write()
1312 pair->dest_pending_sparse = 0; in io_write()
1316 return io_write_buf(pair, buf->u8, size); in io_write()