/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2009-2021 Free Software Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Mailutils is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Mailutils. If not, see . */
#ifndef _MAILUTILS_STREAM_H
#define _MAILUTILS_STREAM_H
#include
#include
#ifdef __cplusplus
extern "C" {
#endif
enum mu_buffer_type
{
mu_buffer_none,
mu_buffer_line,
mu_buffer_full
};
#define MU_SEEK_SET 0
#define MU_SEEK_CUR 1
#define MU_SEEK_END 2
#define MU_STREAM_READ 0x00000001
#define MU_STREAM_WRITE 0x00000002
#define MU_STREAM_RDWR (MU_STREAM_READ|MU_STREAM_WRITE)
#define MU_STREAM_SEEK 0x00000004
#define MU_STREAM_APPEND 0x00000008
#define MU_STREAM_CREAT 0x00000010
/* So far used only by TCP streams. */
#define MU_STREAM_NONBLOCK 0x00000020
/* Not used 0x00000040 */
/* Not used. Intended for mailboxes only. */
#define MU_STREAM_NONLOCK 0x00000080
/* Not used as well 0x00000100 */
/* FIXME: This one affects only mailboxes */
#define MU_STREAM_QACCESS 0x00000200
#define MU_STREAM_RDTHRU 0x00000400
#define MU_STREAM_WRTHRU 0x00000800
#define MU_STREAM_IRGRP 0x00001000
#define MU_STREAM_IWGRP 0x00002000
#define MU_STREAM_IROTH 0x00004000
#define MU_STREAM_IWOTH 0x00008000
#define MU_STREAM_IMASK 0x0000F000
/* Ioctl families */
#define MU_IOCTL_TRANSPORT 0
#define MU_IOCTL_PROGSTREAM 1 /* Program stream */
#define MU_IOCTL_SEEK_LIMITS 2 /* Seek limits (get/set),
Arg: mu_off_t[2] */
#define MU_IOCTL_SUBSTREAM 3 /* Substream (get/set) */
#define MU_IOCTL_TRANSPORT_BUFFER 4 /* get/set */
#define MU_IOCTL_ECHO 5 /* get/set */
#define MU_IOCTL_NULLSTREAM 6 /* Null stream (see below) */
#define MU_IOCTL_LOGSTREAM 7 /* Log stream (see below) */
#define MU_IOCTL_XSCRIPTSTREAM 8 /* Transcript stream (see below) */
#define MU_IOCTL_FD 9 /* File descriptor manipulation */
#define MU_IOCTL_SYSLOGSTREAM 10 /* Syslog stream (see below) */
#define MU_IOCTL_FILTER 11 /* Filter streams (see below) */
#define MU_IOCTL_TOPSTREAM 12 /* Same as MU_IOCTL_SUBSTREAM, but
always returns the topmost substream.
*/
#define MU_IOCTL_TLSSTREAM 13 /* TLS stream */
#define MU_IOCTL_WORDWRAPSTREAM 14 /* Word-wrapper stream */
#define MU_IOCTL_TCPSTREAM 15 /* TCP stream */
/* Opcodes common for various families */
#define MU_IOCTL_OP_GET 0
#define MU_IOCTL_OP_SET 1
/* Opcodes for MU_IOCTL_PROGSTREAM */
#define MU_IOCTL_PROG_STATUS 0
#define MU_IOCTL_PROG_PID 1
/* Opcodes for MU_IOCTL_NULLSTREAM */
/* Set read pattern.
Argument: struct mu_nullstream_pattern *pat.
If pat==NULL, any reads from that stream will return EOF. */
#define MU_IOCTL_NULLSTREAM_SET_PATTERN 0
/* Set pattern class for reads: Argument int *pclass (a class mask
from mailutils/cctype.h) */
#define MU_IOCTL_NULLSTREAM_SET_PATCLASS 1
/* Limit stream size. Argument: mu_off_t *psize; */
#define MU_IOCTL_NULLSTREAM_SETSIZE 2
/* Lift the size limit. Argument: NULL */
#define MU_IOCTL_NULLSTREAM_CLRSIZE 3
/* Get or set logging severity.
Arg: unsigned *
*/
#define MU_IOCTL_LOGSTREAM_GET_SEVERITY 0
#define MU_IOCTL_LOGSTREAM_SET_SEVERITY 1
/* Codes 2 and 3 are unused now.
For their prior use, see
http://mailutils.org/wiki/Source_location_API#Deprecated_interface
*/
/* Get or set log mode.
Arg: int *
*/
#define MU_IOCTL_LOGSTREAM_GET_MODE 4
#define MU_IOCTL_LOGSTREAM_SET_MODE 5
/* Set locus line.
Arg: unsigned *
*/
#define MU_IOCTL_LOGSTREAM_SET_LOCUS_LINE 6
/* Set locus column.
Arg: unsigned *
*/
#define MU_IOCTL_LOGSTREAM_SET_LOCUS_COL 7
/* Advance locus line.
Arg: NULL (increment by 1)
int *
*/
#define MU_IOCTL_LOGSTREAM_ADVANCE_LOCUS_LINE 8
/* Advance locus column.
Arg: NULL (increment by 1)
int *
*/
#define MU_IOCTL_LOGSTREAM_ADVANCE_LOCUS_COL 9
/* Suppress output of messages having severity lower than the
given threshold.
Arg: int *
*/
#define MU_IOCTL_LOGSTREAM_SUPPRESS_SEVERITY 10
/* Same as above, but:
Arg: const char *
*/
#define MU_IOCTL_LOGSTREAM_SUPPRESS_SEVERITY_NAME 11
/* Get or set severity output mask.
Arg: int *
*/
#define MU_IOCTL_LOGSTREAM_GET_SEVERITY_MASK 12
#define MU_IOCTL_LOGSTREAM_SET_SEVERITY_MASK 13
/* Clone the stream.
Arg: mu_stream_t*
*/
#define MU_IOCTL_LOGSTREAM_CLONE 14
/* Get locus range.
Arg: struct mu_locus_range *
*/
#define MU_IOCTL_LOGSTREAM_GET_LOCUS_RANGE 15
/* Set locus range.
Arg: struct mu_locus_range *
*/
#define MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE 16
/* Get prefix.
Arg: char **
*/
#define MU_IOCTL_LOGSTREAM_GET_PREFIX 17
/* Set prefix.
Arg: char *
*/
#define MU_IOCTL_LOGSTREAM_SET_PREFIX 18
/* Opcodes for MU_IOCTL_XSCRIPTSTREAM */
/* Swap transcript levels.
Arg: int *X
New transcript level is set to *X.
If setting separate levels for each channel, use MU_XSCRIPT_LEVEL_PACK
macro to pack them into one integer value. Use
MU_IOCTL_XSCRIPTSTREAM_CHANNEL to confugure single channel.
Upon successful return, previous levels are stored in X. Use the
MU_XSCRIPT_LEVEL_UNPACK macro to retrieve level for a particular
channel.
*/
#define MU_IOCTL_XSCRIPTSTREAM_LEVEL 0
/* Reconfigure a stream channel
Arg: struct mu_xscript_channel *
*/
#define MU_IOCTL_XSCRIPTSTREAM_CHANNEL 1
/* Opcodes for MU_IOCTL_FD */
/* Get "borrow state". Borrowed descriptors remain in open state
after the stream is closed.
Arg: int *
*/
#define MU_IOCTL_FD_GET_BORROW 0
/* Set borrow state.
Arg: int *
*/
#define MU_IOCTL_FD_SET_BORROW 1
/* Opcodes for MU_IOCTL_SYSLOGSTREAM */
/* Set logger function.
Arg: void (*) (int, const char *, ...)
*/
#define MU_IOCTL_SYSLOGSTREAM_SET_LOGGER 0
/* Get logger function.
Arg: void (**) (int, const char *, ...)
*/
#define MU_IOCTL_SYSLOGSTREAM_GET_LOGGER 1
/* Filter streams */
/* Get or set disabled state:
Arg: int*
*/
#define MU_IOCTL_FILTER_GET_DISABLED 0
#define MU_IOCTL_FILTER_SET_DISABLED 1
/* Set transcoder output buffer size.
Arg: size_t*
Has effect only if the stream is unbuffered
*/
#define MU_IOCTL_FILTER_SET_OUTBUF_SIZE 2
/* TLS transport streams */
/* Get cipher info.
Arg: mu_property_t *
On success, the following keys are defined: "protocol", "cipher", "mac"
*/
#define MU_IOCTL_TLS_GET_CIPHER_INFO 0
#define MU_TRANSPORT_INPUT 0
#define MU_TRANSPORT_OUTPUT 1
#define MU_TRANSPORT_VALID_TYPE(n) \
((n) == MU_TRANSPORT_INPUT || (n) == MU_TRANSPORT_OUTPUT)
/* Word wrapper streams */
/* Get left margin. */
#define MU_IOCTL_WORDWRAP_GET_MARGIN 0
/* Set left margin */
#define MU_IOCTL_WORDWRAP_SET_MARGIN 1
/* Shift left margin relative to current position */
#define MU_IOCTL_WORDWRAP_MOVE_MARGIN 2
/* Set left margin for the next line */
#define MU_IOCTL_WORDWRAP_SET_NEXT_MARGIN 3
/* Get current column */
#define MU_IOCTL_WORDWRAP_GET_COLUMN 4
/* TCP streams */
/* Get socket name.
Arg: struct mu_sockaddr **
*/
#define MU_IOCTL_TCP_GETSOCKNAME 0
struct mu_nullstream_pattern
{
char *pattern;
size_t size;
};
struct mu_buffer_query
{
int type; /* One of MU_TRANSPORT_ defines */
enum mu_buffer_type buftype; /* Buffer type */
size_t bufsize; /* Buffer size */
};
/* Statistics */
enum
{
MU_STREAM_STAT_IN, /* Bytes read */
MU_STREAM_STAT_OUT, /* Bytes written */
MU_STREAM_STAT_READS, /* Number of reads */
MU_STREAM_STAT_WRITES, /* Number of writes */
MU_STREAM_STAT_SEEKS, /* Number of seeks */
MU_STREAM_STAT_INLN, /* Lines read */
MU_STREAM_STAT_OUTLN, /* Lines written */
MU_STREAM_STAT_IN8BIT, /* 8-bit octets read */
MU_STREAM_STAT_OUT8BIT, /* 8-bit octets written */
_MU_STREAM_STAT_MAX
};
#define MU_STREAM_STAT_MASK(n) (1U<<(n+1))
#define MU_STREAM_STAT_MASK_ALL \
(MU_STREAM_STAT_MASK (MU_STREAM_STAT_IN) | \
MU_STREAM_STAT_MASK (MU_STREAM_STAT_OUT) | \
MU_STREAM_STAT_MASK (MU_STREAM_STAT_READS) | \
MU_STREAM_STAT_MASK (MU_STREAM_STAT_WRITES) | \
MU_STREAM_STAT_MASK (MU_STREAM_STAT_SEEKS) | \
MU_STREAM_STAT_MASK (MU_STREAM_STAT_INLN) | \
MU_STREAM_STAT_MASK (MU_STREAM_STAT_OUTLN))
typedef mu_off_t mu_stream_stat_buffer[_MU_STREAM_STAT_MAX];
int mu_stream_set_stat (mu_stream_t stream, int statmask,
mu_stream_stat_buffer statbuf);
int mu_stream_get_stat (mu_stream_t stream, int *pstatmask,
mu_off_t **pstatbuf);
#define MU_STREAM_DEFBUFSIZ 8192
extern size_t mu_stream_default_buffer_size;
void mu_stream_ref (mu_stream_t stream);
void mu_stream_unref (mu_stream_t stream);
void mu_stream_destroy (mu_stream_t *pstream);
int mu_stream_open (mu_stream_t stream);
const char *mu_stream_strerror (mu_stream_t stream, int rc);
int mu_stream_err (mu_stream_t stream);
int mu_stream_last_error (mu_stream_t stream);
void mu_stream_clearerr (mu_stream_t stream);
int mu_stream_seterr (struct _mu_stream *stream, int code, int perm);
int mu_stream_is_open (mu_stream_t stream);
int mu_stream_eof (mu_stream_t stream);
int mu_stream_seek (mu_stream_t stream, mu_off_t offset, int whence,
mu_off_t *pres);
int mu_stream_skip_input_bytes (mu_stream_t stream, mu_off_t count,
mu_off_t *pres);
int mu_stream_set_buffer (mu_stream_t stream, enum mu_buffer_type type,
size_t size);
int mu_stream_get_buffer (mu_stream_t stream,
struct mu_buffer_query *qry);
int mu_stream_read (mu_stream_t stream, void *buf, size_t size, size_t *pread);
int mu_stream_readdelim (mu_stream_t stream, char *buf, size_t size,
int delim, size_t *pread);
int mu_stream_readline (mu_stream_t stream, char *buf, size_t size, size_t *pread);
int mu_stream_getdelim (mu_stream_t stream, char **pbuf, size_t *psize,
int delim, size_t *pread);
int mu_stream_getline (mu_stream_t stream, char **pbuf, size_t *psize,
size_t *pread);
int mu_stream_write (mu_stream_t stream, const void *buf, size_t size,
size_t *pwrite);
int mu_stream_writeline (mu_stream_t stream, const char *buf, size_t size);
int mu_stream_flush (mu_stream_t stream);
int mu_stream_close (mu_stream_t stream);
int mu_stream_size (mu_stream_t stream, mu_off_t *psize);
int mu_stream_ioctl (mu_stream_t stream, int family, int opcode, void *ptr);
int mu_stream_truncate (mu_stream_t stream, mu_off_t);
int mu_stream_shutdown (mu_stream_t stream, int how);
#define MU_STREAM_READY_RD 0x1
#define MU_STREAM_READY_WR 0x2
#define MU_STREAM_READY_EX 0x4
struct timeval; /* Needed for the following declaration */
int mu_stream_wait (mu_stream_t stream, int *pflags, struct timeval *);
void mu_stream_get_flags (mu_stream_t stream, int *pflags);
int mu_stream_set_flags (mu_stream_t stream, int fl);
int mu_stream_clr_flags (mu_stream_t stream, int fl);
int mu_stream_vprintf (mu_stream_t str, const char *fmt, va_list ap);
int mu_stream_printf (mu_stream_t stream, const char *fmt, ...)
MU_PRINTFLIKE(2,3);
int mu_stream_copy (mu_stream_t dst, mu_stream_t src, mu_off_t size,
mu_off_t *pcsz);
int mu_stream_copy_wcb (mu_stream_t dst, mu_stream_t src, mu_off_t size,
void (*cbf) (char *, size_t, void *), void *cbd,
mu_off_t *pcsz);
int mu_stream_copy_nl (mu_stream_t dst, mu_stream_t src, mu_off_t size,
mu_off_t *pcsz);
int mu_stream_header_copy (mu_stream_t dst, mu_stream_t src, char **exclude_names);
int mu_stream_shift (mu_stream_t str, mu_off_t off_a, mu_off_t off_b,
size_t bufsize);
int mu_file_stream_create (mu_stream_t *pstream, const char *filename, int flags);
struct mu_tempfile_hints;
int mu_temp_file_stream_create (mu_stream_t *pstream,
struct mu_tempfile_hints *hints, int flags);
int mu_fd_stream_create (mu_stream_t *pstream, char *filename, int fd,
int flags);
#define MU_STDIN_FD 0
#define MU_STDOUT_FD 1
#define MU_STDERR_FD 2
int mu_stdio_stream_create (mu_stream_t *pstream, int fd, int flags);
int mu_memory_stream_create (mu_stream_t *pstream, int flags);
int mu_static_memory_stream_create (mu_stream_t *pstream, const void *mem,
size_t size);
int mu_fixed_memory_stream_create (mu_stream_t *pstream, void *mem,
size_t size, int flags);
int mu_mapfile_stream_create (mu_stream_t *pstream, const char *filename,
int flags);
int mu_socket_stream_create (mu_stream_t *pstream, const char *filename,
int flags);
int mu_streamref_create_abridged (mu_stream_t *pref, mu_stream_t str,
mu_off_t start, mu_off_t end);
int mu_streamref_create (mu_stream_t *pref, mu_stream_t str);
int mu_tcp_stream_create_from_sa (mu_stream_t *pstream,
struct mu_sockaddr *remote_addr,
struct mu_sockaddr *source_addr, int flags);
int mu_tcp_stream_create_with_source_ip (mu_stream_t *stream,
const char *host, unsigned port,
unsigned long source_ip,
int flags);
int mu_tcp_stream_create_with_source_host (mu_stream_t *stream,
const char *host, unsigned port,
const char *source_host,
int flags);
int mu_tcp_stream_create (mu_stream_t *stream, const char *host, unsigned port,
int flags);
/* Transcript log levels */
#define MU_XSCRIPT_NORMAL 0 /* Normal transcript */
#define MU_XSCRIPT_SECURE 1 /* Security-related data filtered out */
#define MU_XSCRIPT_PAYLOAD 2 /* Actual payload (may be copious) */
#define MU_XSCRIPT_LEVEL_PACK_BIT 0x100
#define MU_XSCRIPT_LEVEL_IS_PACKED(m) ((m) & MU_XSCRIPT_LEVEL_PACK_BIT)
/* Packing/unpacking of channel modes for the
MU_IOCTL_XSCRIPTSTREAM.MU_IOCTL_XSCRIPTSTREAM_LEVEL ioctl.
*/
#define MU_XSCRIPT_LEVEL_MASK(chan, mode) \
(((mode) & 0x3) << ((chan)<<2))
#define MU_XSCRIPT_LEVEL_UNMASK(chan, mode) \
((((mode) & 0xff) >> ((chan)<<2)) & 0x3)
/* Combine input and output channel modes into one integer, unless they
are the same, in which case return input mode unchanged.
*/
#define MU_XSCRIPT_LEVEL_PACK(imode, omode) \
((imode) == (omode) \
? (imode) \
: (MU_XSCRIPT_LEVEL_PACK_BIT \
| MU_XSCRIPT_LEVEL_MASK(0,imode) \
| MU_XSCRIPT_LEVEL_MASK(1,omode)))
#define MU_XSCRIPT_LEVEL_UNPACK(chan, pack) \
(MU_XSCRIPT_LEVEL_IS_PACKED(pack) \
? MU_XSCRIPT_LEVEL_UNMASK(chan, pack) : (pack))
struct mu_xscript_channel
{
int cd; /* Channel descriptor */
int level; /* Channel transcript level */
size_t length; /* Length of data, for MU_XSCRIPT_PAYLOAD */
};
int mu_xscript_stream_create(mu_stream_t *pref, mu_stream_t transport,
mu_stream_t logstr,
const char *prefix[]);
int mu_iostream_create (mu_stream_t *pref, mu_stream_t in, mu_stream_t out);
int mu_dbgstream_create(mu_stream_t *pref, int severity);
int mu_rdcache_stream_create (mu_stream_t *pstream, mu_stream_t transport,
int flags);
int mu_nullstream_create (mu_stream_t *pref, int flags);
int mu_wordwrap_stream_create (mu_stream_t *pstream, mu_stream_t transport,
size_t left_margin, size_t right_margin);
extern size_t mu_temp_file_threshold_size;
int mu_temp_stream_create (mu_stream_t *pstream, size_t threshold);
#ifdef __cplusplus
}
#endif
#endif