struct istream * i_stream_create_rawlog(struct istream *input, const char *rawlog_path, int rawlog_fd, enum iostream_rawlog_flags flags) { struct ostream *rawlog_output; bool autoclose_fd = (flags & IOSTREAM_RAWLOG_FLAG_AUTOCLOSE) != 0; i_assert(rawlog_path != NULL); i_assert(rawlog_fd != -1); rawlog_output = autoclose_fd ? o_stream_create_fd_autoclose(&rawlog_fd, 0) : o_stream_create_fd(rawlog_fd, 0); o_stream_set_name(rawlog_output, t_strdup_printf("rawlog(%s)", rawlog_path)); return i_stream_create_rawlog_from_stream(input, rawlog_output, flags); }
struct ostream *sieve_tool_open_output_stream(const char *filename) { struct ostream *outstream; int fd; if ( strcmp(filename, "-") == 0 ) outstream = o_stream_create_fd(1, 0, FALSE); else { if ( (fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0600)) < 0 ) { i_fatal("failed to open file for writing: %m"); } outstream = o_stream_create_fd_autoclose(&fd, 0); } return outstream; }
static void test_ostream_file_send_istream_sendfile(void) { struct istream *input, *input2; struct ostream *output; char buf[10]; int fd, sock_fd[2]; test_begin("ostream file send istream sendfile()"); /* temp file istream */ fd = open(".temp.istream", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd == -1) i_fatal("creat(.temp.istream) failed: %m"); test_assert(write(fd, "abcdefghij", 10) == 10); test_assert(lseek(fd, 0, SEEK_SET) == 0); input = i_stream_create_fd_autoclose(&fd, 1024); /* temp socket ostream */ i_assert(socketpair(AF_UNIX, SOCK_STREAM, 0, sock_fd) == 0); output = o_stream_create_fd_autoclose(sock_fd, 0); /* test that sendfile() works */ i_stream_seek(input, 3); input2 = i_stream_create_limit(input, 4); test_assert(o_stream_send_istream(output, input2) == OSTREAM_SEND_ISTREAM_RESULT_FINISHED); test_assert(output->offset == 4); test_assert(read(sock_fd[1], buf, sizeof(buf)) == 4 && memcmp(buf, "defg", 4) == 0); i_stream_unref(&input2); i_stream_unref(&input); o_stream_destroy(&output); i_close_fd(&sock_fd[1]); i_unlink(".temp.istream"); test_end(); }