Index: include/mailutils/stream.h =================================================================== RCS file: /cvsroot/mailutils/mailutils/include/mailutils/stream.h,v retrieving revision 1.7 diff -u -r1.7 stream.h --- include/mailutils/stream.h 2001/04/18 04:34:42 1.7 +++ include/mailutils/stream.h 2001/11/29 03:56:37 @@ -18,6 +18,7 @@ #ifndef _MAILUTILS_STREAM_H # define _MAILUTILS_STREAM_H +#include #include #include @@ -46,11 +47,13 @@ /* Stream will be destroy on stream_destroy whitout checking the owner. */ #define MU_STREAM_NO_CHECK 0x00000040 #define MU_STREAM_SEEKABLE 0x00000080 +#define MU_STREAM_NO_CLOSE 0x00000100 -extern int stream_create __P ((stream_t *, int flags, void *owner)); +extern int stream_create __P ((stream_t *stream)); extern void stream_destroy __P ((stream_t *, void *owner)); extern int stream_set_destroy __P ((stream_t, void (*_destroy) __P ((stream_t)), void *owner)); extern void * stream_get_owner __P ((stream_t)); +extern void stream_set_owner __P ((stream_t, void* owner)); extern int stream_open __P ((stream_t, const char *, int, int)); extern int stream_set_open __P ((stream_t, int (*_open) @@ -117,14 +120,17 @@ extern int stream_get_state __P ((stream_t, int *pstate)); /* Misc. */ -extern int file_stream_create __P ((stream_t *stream)); extern int mapfile_stream_create __P ((stream_t *stream)); extern int memory_stream_create __P ((stream_t *stream)); -extern int tcp_stream_create __P ((stream_t *stream)); extern int encoder_stream_create __P ((stream_t *stream, stream_t iostream, const char *encoding)); extern int decoder_stream_create __P ((stream_t *stream, stream_t iostream, const char *encoding)); + +extern int stream_open_file __P ((stream_t, const char *filename, int flags)); +extern int stream_open_stdio __P ((stream_t, FILE* stdio, int flags)); +extern int stream_open_tcp __P ((stream_t, const char* host, int port, int flags)); + #ifdef __cplusplus } Index: mailbox/include/stream0.h =================================================================== RCS file: /cvsroot/mailutils/mailutils/mailbox/include/stream0.h,v retrieving revision 1.6 diff -u -r1.6 stream0.h --- mailbox/include/stream0.h 2001/04/05 04:17:09 1.6 +++ mailbox/include/stream0.h 2001/11/29 03:56:37 @@ -57,8 +57,8 @@ off_t roff; struct rbuffer rbuffer; - void (*_destroy) __P ((stream_t)); - int (*_open) __P ((stream_t, const char *, int port, int flags)); +//void (*_destroy) __P ((stream_t)); +//int (*_open) __P ((stream_t, const char *, int port, int flags)); int (*_close) __P ((stream_t)); int (*_get_fd) __P ((stream_t, int *)); int (*_read) __P ((stream_t, char *, size_t, off_t, size_t *)); Index: mailbox/file_stream.c =================================================================== RCS file: /cvsroot/mailutils/mailutils/mailbox/file_stream.c,v retrieving revision 1.24 diff -u -r1.24 file_stream.c --- mailbox/file_stream.c 2001/10/11 04:23:30 1.24 +++ mailbox/file_stream.c 2001/11/29 03:56:37 @@ -19,6 +19,7 @@ # include #endif +#include #include #include #include @@ -38,15 +39,6 @@ int offset; }; -static void -_file_destroy (stream_t stream) -{ - struct _file_stream *fs = stream_get_owner (stream); - if (fs->file) - fclose (fs->file); - free (fs); -} - static int _file_read (stream_t stream, char *optr, size_t osize, off_t offset, size_t *nbytes) @@ -220,33 +212,79 @@ static int _file_close (stream_t stream) { - struct _file_stream *fs = stream_get_owner (stream); + struct _file_stream *fs = NULL; + int err = 0; + + if(!stream) + return EINVAL; + + fs = stream_get_owner (stream); + + if(!fs) + return 0; + if (fs->file) { - if (fclose (fs->file) != 0) - err = errno; + int flags = 0; + + stream_get_flags (stream, &flags); + + flags &= MU_STREAM_NO_CLOSE; + + if (flags == 0) + { + if (fclose (fs->file) != 0) + err = errno; + } fs->file = NULL; } + free (fs); + + stream_set_owner(stream, NULL); + return err; } static int -_file_open (stream_t stream, const char *filename, int port, int flags) +_file_open(stream_t stream, int flags, void* fs) { - struct _file_stream *fs = stream_get_owner (stream); + stream_set_flags (stream, flags |MU_STREAM_NO_CHECK); + + stream_set_owner (stream, fs); + + stream_set_close (stream, _file_close, fs); + stream_set_fd (stream, _file_get_fd, fs); + stream_set_read (stream, _file_read, fs); + stream_set_readline (stream, _file_readline, fs); + stream_set_write (stream, _file_write, fs); + stream_set_truncate (stream, _file_truncate, fs); + stream_set_size (stream, _file_size, fs); + stream_set_flush (stream, _file_flush, fs); + + return 0; +} + +int +file_stream_open (stream_t stream, const char *filename, int flags) +{ + struct _file_stream *fs = NULL; + int ret = 0; int flg; int fd; const char *mode; - (void)port; /* Ignored. */ + if (stream == NULL || filename == NULL) + return EINVAL; - if (fs->file) - { - fclose (fs->file); - fs->file = NULL; - } + if((ret = stream_close(stream)) != 0) + return ret; + + fs = calloc (1, sizeof (struct _file_stream)); + if (fs == NULL) + return ENOMEM; + /* Map the flags to the system equivalent. */ if (flags & MU_STREAM_WRITE && flags & MU_STREAM_READ) return EINVAL; @@ -324,45 +362,36 @@ mode = "rb"; fs->file = fdopen (fd, mode); + if (fs->file == NULL) { int ret = errno; free (fs); return ret; } - stream_set_flags (stream, flags |MU_STREAM_NO_CHECK); - return 0; + + return _file_open(stream, flags, fs); } int -file_stream_create (stream_t *stream) +stream_open_stdio (stream_t stream, FILE *stdio, int flags) { - struct _file_stream *fs; - int ret; + struct _file_stream *fs = NULL; + int ret = 0; - if (stream == NULL) + if (stream == NULL || stdio == NULL) return EINVAL; + if((ret = stream_close(stream)) != 0) + return ret; + fs = calloc (1, sizeof (struct _file_stream)); + if (fs == NULL) return ENOMEM; - ret = stream_create (stream, MU_STREAM_NO_CHECK, fs); - if (ret != 0) - { - free (fs); - return ret; - } + fs->file = stdio; - stream_set_open (*stream, _file_open, fs); - stream_set_close (*stream, _file_close, fs); - stream_set_fd (*stream, _file_get_fd, fs); - stream_set_read (*stream, _file_read, fs); - stream_set_readline (*stream, _file_readline, fs); - stream_set_write (*stream, _file_write, fs); - stream_set_truncate (*stream, _file_truncate, fs); - stream_set_size (*stream, _file_size, fs); - stream_set_flush (*stream, _file_flush, fs); - stream_set_destroy (*stream, _file_destroy, fs); - return 0; + return _file_open(stream, flags, fs); } + Index: mailbox/stream.c =================================================================== RCS file: /cvsroot/mailutils/mailutils/mailbox/stream.c,v retrieving revision 1.16 diff -u -r1.16 stream.c --- mailbox/stream.c 2001/10/15 05:29:37 1.16 +++ mailbox/stream.c 2001/11/29 03:56:37 @@ -71,8 +71,7 @@ stream_t stream = *pstream; if ((stream->flags & MU_STREAM_NO_CHECK) || stream->owner == owner) { - if (stream->_destroy) - stream->_destroy (stream); + stream_close(stream); if (stream->rbuffer.base) free (stream->rbuffer.base); free (stream); @@ -424,7 +423,7 @@ int stream_get_flags (stream_t stream, int *pfl) { - if (stream == NULL && pfl == NULL ) + if (stream == NULL || pfl == NULL ) return EINVAL; *pfl = stream->flags; return 0;