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/15 04:30:51 @@ -334,6 +334,48 @@ return 0; } +static int +_stdio_open (stream_t stream, const char *stdio, int port, int flags) +{ + struct _file_stream *fs = stream_get_owner (stream); + int flg; + + (void)port; /* Ignored. */ + + if (fs->file) + { + fclose (fs->file); + fs->file = NULL; + } + + fs->file = (FILE*) stdio; + + /* Map the flags to the system equivalent. */ + if (flags & MU_STREAM_WRITE && flags & MU_STREAM_READ) + return EINVAL; + else if (flags & MU_STREAM_WRITE) + flg = O_WRONLY; + else if (flags & MU_STREAM_RDWR) + flg = O_RDWR; + else /* default */ + flg = O_RDONLY; + + /* Local folders should not block it is local disk ??? + We simply ignore the O_NONBLOCK flag + But take care of the APPEND. */ + if (flags & MU_STREAM_APPEND) + flg |= O_APPEND; + + if (fs->file == NULL) + { + int ret = errno; + free (fs); + return ret; + } + stream_set_flags (stream, flags |MU_STREAM_NO_CHECK); + return 0; +} + int file_stream_create (stream_t *stream) { @@ -355,6 +397,39 @@ } 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; +} + +int +stdio_stream_create (stream_t *stream) +{ + struct _file_stream *fs; + int ret; + + if (stream == NULL) + return EINVAL; + + 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; + } + + stream_set_open (*stream, _stdio_open, fs); stream_set_close (*stream, _file_close, fs); stream_set_fd (*stream, _file_get_fd, fs); stream_set_read (*stream, _file_read, fs); 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/15 04:30:51 @@ -118,6 +118,7 @@ /* Misc. */ extern int file_stream_create __P ((stream_t *stream)); +extern int stdio_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));