From 77d1d123f4a6e7e7158f208e4d896838a98370f0 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 8 Apr 2007 09:56:52 +0000 Subject: [PATCH] Added silc_fd_stream_file2. --- lib/silcutil/silcfdstream.c | 60 ++++++++++++++++++++++++------------- lib/silcutil/silcfdstream.h | 27 +++++++++++++---- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/lib/silcutil/silcfdstream.c b/lib/silcutil/silcfdstream.c index 5a552847..a618c634 100644 --- a/lib/silcutil/silcfdstream.c +++ b/lib/silcutil/silcfdstream.c @@ -80,9 +80,6 @@ SilcStream silc_fd_stream_create2(int read_fd, int write_fd) { SilcFDStream stream; - if (read_fd < 1) - return NULL; - stream = silc_calloc(1, sizeof(*stream)); if (!stream) return NULL; @@ -98,31 +95,52 @@ SilcStream silc_fd_stream_create2(int read_fd, int write_fd) /* Create by opening file */ -SilcStream silc_fd_stream_file(const char *filename, - SilcBool reading, SilcBool writing) +SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, + SilcBool writing) { - int fd, flags = 0; - SilcStream stream; + const char *read_file = NULL, *write_file = NULL; if (!filename) return NULL; - SILC_LOG_DEBUG(("Creating new fd stream for file `%s'", filename)); - - if (reading) - flags |= O_RDONLY; if (writing) - flags |= O_CREAT | O_WRONLY; - if (reading && writing) - flags = O_CREAT | O_RDWR; + write_file = filename; + if (reading) + read_file = filename; - fd = silc_file_open(filename, flags); - if (fd < 0) - return NULL; + return silc_fd_stream_file2(read_file, write_file); +} - stream = silc_fd_stream_create(fd); - if (!stream) - silc_file_close(fd); +/* Create by opening two files */ + +SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file) +{ + SilcStream stream; + int fd1 = 0, fd2 = 0; + + SILC_LOG_DEBUG(("Creating new fd stream for reading `%s' and writing `%s'", + read_file ? read_file : "(none)", + write_file ? write_file : "(none)")); + + if (write_file) { + fd2 = silc_file_open(write_file, O_CREAT | O_WRONLY); + if (fd2 < 0) { + silc_file_close(fd1); + return NULL; + } + } + + if (read_file) { + fd1 = silc_file_open(read_file, O_RDONLY); + if (fd1 < 0) + return NULL; + } + + stream = silc_fd_stream_create2(fd1, fd2); + if (!stream) { + silc_file_close(fd1); + silc_file_close(fd2); + } return stream; } @@ -290,7 +308,7 @@ SilcBool silc_fd_stream_notifier(SilcStream stream, silc_fd_stream_io, stream); silc_schedule_set_listen_fd(schedule, fd_stream->fd1, SILC_TASK_READ, FALSE); - silc_file_set_nonblock(fd_stream->fd1);; + silc_file_set_nonblock(fd_stream->fd1); if (fd_stream->fd2 < 1) fd_stream->fd2 = fd_stream->fd1; } diff --git a/lib/silcutil/silcfdstream.h b/lib/silcutil/silcfdstream.h index f5a95e3a..cc2c587e 100644 --- a/lib/silcutil/silcfdstream.h +++ b/lib/silcutil/silcfdstream.h @@ -46,8 +46,7 @@ * by `fd'. The stream is closed with the silc_stream_close and destroyed * with the silc_stream_destroy. * - * The silc_stream_set_notifier must be called in order to be able to read - * from and write to this file descriptor stream if the `fd' is in + * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * ***/ @@ -66,8 +65,7 @@ SilcStream silc_fd_stream_create(int fd); * and `write_fd' opened for writing. The stream is closed with the * silc_stream_close and destroyed with the silc_stream_destroy. * - * The silc_stream_set_notifier must be called in order to be able to read - * from and write to this file descriptor stream if the `fd' is in + * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * ***/ @@ -87,14 +85,31 @@ SilcStream silc_fd_stream_create2(int read_fd, int write_fd); * opened for reading. If the `writing' is TRUE the file is opened * for writing. * - * The silc_stream_set_notifier must be called in order to be able to read - * from and write to this file descriptor stream if the `fd' is in + * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * ***/ SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, SilcBool writing); +/****f* silcutil/SilcFDStreamAPI/silc_fd_stream_file + * + * SYNOPSIS + * + * SilcStream silc_fd_stream_file2(const char *read_file, + * const char *write_file); + * + * DESCRIPTION + * + * Same as silc_fd_stream_file but creates the stream by opening `read_file' + * for reading and `write_file' for writing. + * + * If the silc_stream_set_notifier is called the stream is set to + * non-blocking mode. + * + ***/ +SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file); + /****f* silcutil/SilcFDStreamAPI/silc_fd_stream_get_info * * SYNOPSIS -- 2.24.0