int redir_left(t_way *pt) { int fd_files; int fd_copy; int acces; fd_files = open(pt->c_file, O_RDWR); if ((acces = check_access(pt->c_file)) == -1) return (-1); if (fd_files != -1) { fd_copy = check_dup(fd_files); if (fd_copy == -1) return (-1); check_dup2(fd_files, 0); check_dup2(fd_copy, 0); } if (fd_files == -1) return (-1); return (fd_files); }
int redir_right(t_way *pt) { int right; int acces; int fd_files; int fd_copy; right = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; fd_files = open(pt->c_file, O_CREAT | O_WRONLY | O_TRUNC, right); if ((acces = check_access(pt->c_file)) == -1) return (-1); if (fd_files != -1) { fd_copy = check_dup(fd_files); if (fd_copy == -1) return (-1); check_dup2(fd_files, 1); check_dup2(fd_copy, 1); } if (fd_files == -1) return (-1); return (fd_files); }
int main(int argc, char *argv[]) { char dir_path[PATH_MAX], file_path[PATH_MAX]; int dummy, fd; size_t size; aio_present = 0; size = sizeof(dummy); if (sysctlbyname("vfs.aio", &dummy, &size, NULL, 0) < 0) { if (errno == EISDIR) aio_present = 1; } strlcpy(dir_path, "/tmp/open-dir.XXXXXXXXXXX", sizeof(dir_path)); if (mkdtemp(dir_path) == NULL) err(-1, "mkdtemp"); if (chmod(dir_path, PERM_DIR) < 0) { warn("chmod %s", dir_path); (void)rmdir(dir_path); exit(-1); } strlcpy(file_path, "/tmp/open-file.XXXXXXXXXXX", sizeof(file_path)); fd = mkstemp(file_path); if (fd < 0) { warn("mkstemp"); (void)rmdir(dir_path); exit(-1); } close(fd); if (chmod(file_path, PERM_FILE) < 0) { warn("chmod %s", file_path); (void)unlink(file_path); (void)rmdir(dir_path); exit(-1); } check_directory_open_modes(dir_path, file_modes, file_modes_count); check_dup("check_dup_dir", dir_path, dir_modes, dir_modes_count); check_dup("check_dup_file", file_path, file_modes, file_modes_count); check_dup2("check_dup2_dir", dir_path, dir_modes, dir_modes_count); check_dup2("check_dup2_file", file_path, file_modes, file_modes_count); check_fchdir("check_fchdir", dir_path, dir_modes, dir_modes_count); check_fchflags("check_fchflags_dir", dir_path, dir_modes, dir_modes_count); check_fchflags("check_fchflags_file", file_path, file_modes, file_modes_count); check_fchmod("check_fchmod_dir", dir_path, PERM_DIR, dir_modes, dir_modes_count); check_fchmod("check_fchmod_file", file_path, PERM_FILE, file_modes, file_modes_count); check_fchown("check_fchown_dir", dir_path, dir_modes, dir_modes_count); check_fchown("check_fchown_file", file_path, file_modes, file_modes_count); check_flock("check_flock_dir", dir_path, dir_modes, dir_modes_count); check_flock("check_flock_file", file_path, file_modes, file_modes_count); check_fpathconf("check_fpathconf_dir", dir_path, dir_modes, dir_modes_count); check_fpathconf("check_fpathconf_file", file_path, file_modes, file_modes_count); check_fstat("check_fstat_dir", dir_path, dir_modes, dir_modes_count); check_fstat("check_fstat_file", file_path, file_modes, file_modes_count); check_fstatfs("check_fstatfs_dir", dir_path, dir_modes, dir_modes_count); check_fstatfs("check_fstatfs_file", file_path, file_modes, file_modes_count); check_fsync("check_fsync_dir", dir_path, dir_modes, dir_modes_count); check_fsync("check_fsync_file", file_path, file_modes, file_modes_count); check_ftruncate("check_ftruncate_dir", dir_path, dir_modes, dir_modes_count); check_ftruncate("check_ftruncate_file", file_path, file_modes, file_modes_count); check_futimes("check_futimes_dir", dir_path, dir_modes, dir_modes_count); check_futimes("check_futimes_file", file_path, file_modes, file_modes_count); check_lseek("check_lseek_dir", dir_path, dir_modes, dir_modes_count); check_lseek("check_lseek_file", file_path, file_modes, file_modes_count); check_getdents("check_getdents_dir", dir_path, 1, dir_modes, dir_modes_count); check_getdents("check_getdents_file", file_path, 0, file_modes, file_modes_count); check_sendfile("check_sendfile_dir", dir_path, 1, dir_modes, dir_modes_count); check_sendfile("check_sendfile_file", file_path, 0, file_modes, file_modes_count); check_write("check_write_dir", write, dir_path, dir_modes, dir_modes_count); check_write("check_write_file", write, file_path, file_modes, file_modes_count); check_write("check_writev_dir", writev_wrapper, dir_path, dir_modes, dir_modes_count); check_write("check_writev_file", writev_wrapper, file_path, file_modes, file_modes_count); check_write("check_pwrite_dir", pwrite_wrapper, dir_path, dir_modes, dir_modes_count); check_write("check_pwrite_file", pwrite_wrapper, file_path, file_modes, file_modes_count); check_write("check_pwritev_dir", pwritev_wrapper, dir_path, dir_modes, dir_modes_count); check_write("check_pwritev_file", pwritev_wrapper, file_path, file_modes, file_modes_count); if (aio_present) { check_write("check_aio_write_dir", aio_write_wrapper, dir_path, dir_modes, dir_modes_count); check_write("check_aio_write_file", aio_write_wrapper, file_path, file_modes, file_modes_count); } check_read("check_read_dir", read, dir_path, dir_modes, dir_modes_count); check_read("check_read_file", read, file_path, file_modes, file_modes_count); check_read("check_readv_dir", readv_wrapper, dir_path, dir_modes, dir_modes_count); check_read("check_readv_file", readv_wrapper, file_path, file_modes, file_modes_count); check_read("check_pread_dir", pread_wrapper, dir_path, dir_modes, dir_modes_count); check_read("check_pread_file", pread_wrapper, file_path, file_modes, file_modes_count); check_read("check_preadv_dir", preadv_wrapper, dir_path, dir_modes, dir_modes_count); check_read("check_preadv_file", preadv_wrapper, file_path, file_modes, file_modes_count); if (aio_present) { check_read("check_aio_read_dir", aio_read_wrapper, dir_path, dir_modes, dir_modes_count); check_read("check_aio_read_file", aio_read_wrapper, file_path, file_modes, file_modes_count); } check_mmap_read("check_mmap_read_dir", dir_path, 1, dir_modes, dir_modes_count); check_mmap_read("check_mmap_read_file", file_path, 0, file_modes, file_modes_count); check_mmap_write("check_mmap_write_dir", dir_path, dir_modes, dir_modes_count); check_mmap_write("check_mmap_write_file", file_path, file_modes, file_modes_count); check_mmap_exec("check_mmap_exec_dir", dir_path, 1, dir_modes, dir_modes_count); check_mmap_exec("check_mmap_exec_file", file_path, 0, file_modes, file_modes_count); check_mmap_write_private("check_mmap_write_private_dir", dir_path, 1, dir_modes, dir_modes_count); check_mmap_write_private("check_mmap_write_private_file", file_path, 0, file_modes, file_modes_count); (void)unlink(file_path); (void)rmdir(dir_path); exit(0); }