X-Git-Url: http://git.silcnet.org/gitweb/?p=runtime.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcfdstream.c;h=f0032e8b7fcac3f220786f2f3acaaf0d17067f6e;hp=1ae8d413ca730fd7c67880522ea7604052edcd69;hb=afcd9ed820b767d8b6676a9156fa561b24ac2363;hpb=ff6a990d9e7361a5d1eb9909483bcea7decef4d4 diff --git a/lib/silcutil/silcfdstream.c b/lib/silcutil/silcfdstream.c index 1ae8d413..f0032e8b 100644 --- a/lib/silcutil/silcfdstream.c +++ b/lib/silcutil/silcfdstream.c @@ -17,7 +17,7 @@ */ -#include "silc.h" +#include "silcruntime.h" /************************** Types and definitions ***************************/ @@ -28,12 +28,12 @@ const SilcStreamOps silc_fd_stream_ops; /* FD stream context */ typedef struct { const SilcStreamOps *ops; + SilcStack stack; SilcSchedule schedule; SilcStreamNotifier notifier; void *notifier_context; int fd1; int fd2; - int error; } *SilcFDStream; @@ -67,28 +67,36 @@ SILC_TASK_CALLBACK(silc_fd_stream_io) /* Create file descriptor stream */ -SilcStream silc_fd_stream_create(int fd) +SilcStream silc_fd_stream_create(int fd, SilcStack stack) { - if (fd < 1) + if (fd < 1) { + silc_set_errno_reason(SILC_ERR_BAD_FD, "Bad file descriptor %d", fd); return NULL; - return silc_fd_stream_create2(fd, 0); + } + return silc_fd_stream_create2(fd, 0, stack); } /* Create stream with two file descriptors */ -SilcStream silc_fd_stream_create2(int read_fd, int write_fd) +SilcStream silc_fd_stream_create2(int read_fd, int write_fd, SilcStack stack) { SilcFDStream stream; - stream = silc_calloc(1, sizeof(*stream)); - if (!stream) + if (stack) + stack = silc_stack_alloc(0, stack); + + stream = silc_scalloc(stack, 1, sizeof(*stream)); + if (!stream) { + silc_stack_free(stack); return NULL; + } SILC_LOG_DEBUG(("Creating new fd stream %p", stream)); stream->ops = &silc_fd_stream_ops; stream->fd1 = read_fd; stream->fd2 = write_fd; + stream->stack = stack; return stream; } @@ -96,24 +104,27 @@ 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) + SilcBool writing, SilcStack stack) { const char *read_file = NULL, *write_file = NULL; - if (!filename) + if (!filename) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); return NULL; + } if (writing) write_file = filename; if (reading) read_file = filename; - return silc_fd_stream_file2(read_file, write_file); + return silc_fd_stream_file2(read_file, write_file, stack); } /* Create by opening two files */ -SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file) +SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file, + SilcStack stack) { SilcStream stream; int fd1 = 0, fd2 = 0; @@ -136,7 +147,7 @@ SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file) return NULL; } - stream = silc_fd_stream_create2(fd1, fd2); + stream = silc_fd_stream_create2(fd1, fd2, stack); if (!stream) { silc_file_close(fd1); silc_file_close(fd2); @@ -163,18 +174,6 @@ SilcBool silc_fd_stream_get_info(SilcStream stream, int *read_fd, return TRUE; } -/* Return errno */ - -int silc_fd_stream_get_error(SilcStream stream) -{ - SilcFDStream fd_stream = stream; - - if (!SILC_IS_FD_STREAM(fd_stream)) - return 0; - - return fd_stream->error; -} - /* Read */ int silc_fd_stream_read(SilcStream stream, unsigned char *buf, @@ -194,12 +193,13 @@ int silc_fd_stream_read(SilcStream stream, unsigned char *buf, SILC_LOG_DEBUG(("Could not read immediately, will do it later")); silc_schedule_set_listen_fd(fd_stream->schedule, fd_stream->fd1, SILC_TASK_READ, FALSE); + silc_set_errno_posix(errno); return -1; } SILC_LOG_DEBUG(("Cannot read from fd: %d:%s", fd_stream->fd1, strerror(errno))); silc_schedule_unset_listen_fd(fd_stream->schedule, fd_stream->fd1); - fd_stream->error = errno; + silc_set_errno_posix(errno); return -2; } @@ -230,11 +230,12 @@ int silc_fd_stream_write(SilcStream stream, const unsigned char *data, SILC_LOG_DEBUG(("Could not write immediately, will do it later")); silc_schedule_set_listen_fd(fd_stream->schedule, fd_stream->fd2, SILC_TASK_READ | SILC_TASK_WRITE, FALSE); + silc_set_errno_posix(errno); return -1; } SILC_LOG_DEBUG(("Cannot write to fd: %s", strerror(errno))); silc_schedule_unset_listen_fd(fd_stream->schedule, fd_stream->fd2); - fd_stream->error = errno; + silc_set_errno_posix(errno); return -2; } @@ -277,8 +278,12 @@ SilcBool silc_fd_stream_close(SilcStream stream) void silc_fd_stream_destroy(SilcStream stream) { + SilcFDStream fd_stream = stream; + SilcStack stack = fd_stream->stack; + silc_fd_stream_close(stream); - silc_free(stream); + silc_sfree(stack, stream); + silc_stack_free(stack); } /* Sets stream notification callback for the stream */