diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-11-17 21:07:52 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-11-17 21:22:31 +0200 |
commit | 6f309ce61dcfb461c3fe1270efe2b23a7ac5d676 (patch) | |
tree | b692f47baf255d70eaec3eb2e68dec5a2812ac52 /libmailutils | |
parent | 2ec525acff5a090dcba8a0c7c166bbe745340902 (diff) | |
download | mailutils-6f309ce61dcfb461c3fe1270efe2b23a7ac5d676.tar.gz mailutils-6f309ce61dcfb461c3fe1270efe2b23a7ac5d676.tar.bz2 |
Implement IMAP I/O functions for client and server.
* include/mailutils/imapio.h: New file.
* include/mailutils/sys/imapio.h: New file.
* libmailutils/imapio/create.c: New file.
* libmailutils/imapio/getline.c: New file.
* libmailutils/imapio/literal.c: New file.
* libmailutils/imapio/printf.c: New file.
* libmailutils/imapio/qstring.c: New file.
* libmailutils/imapio/send.c: New file.
* libmailutils/imapio/trace.c: New file.
* libmailutils/imapio/words.c: New file.
* libmailutils/imapio/xscript.c: New file.
* configure.ac: Build libmailutils/imapio/Makefile
* include/mailutils/Makefile.am (pkginclude_HEADERS): Add imapio.h.
* include/mailutils/imapio.h: New file.
* include/mailutils/sys/Makefile.am (sysinclude_HEADERS): Add imapio.h.
* include/mailutils/sys/imapio.h: New file.
* include/mailutils/types.hin (mu_imapio_t): New data type.
* libmailutils/Makefile.am (SUBDIRS): Add imapio.
* libmailutils/tests/Makefile.am: Build imapio
* libmailutils/tests/imapio.c: New source.
* libmailutils/tests/wsp.c: Handle escape argument
Diffstat (limited to 'libmailutils')
-rw-r--r-- | libmailutils/Makefile.am | 3 | ||||
-rw-r--r-- | libmailutils/imapio/Makefile.am | 31 | ||||
-rw-r--r-- | libmailutils/imapio/create.c | 63 | ||||
-rw-r--r-- | libmailutils/imapio/getline.c | 114 | ||||
-rw-r--r-- | libmailutils/imapio/literal.c | 31 | ||||
-rw-r--r-- | libmailutils/imapio/printf.c | 35 | ||||
-rw-r--r-- | libmailutils/imapio/qstring.c | 72 | ||||
-rw-r--r-- | libmailutils/imapio/send.c | 29 | ||||
-rw-r--r-- | libmailutils/imapio/trace.c | 86 | ||||
-rw-r--r-- | libmailutils/imapio/words.c | 42 | ||||
-rw-r--r-- | libmailutils/imapio/xscript.c | 46 | ||||
-rw-r--r-- | libmailutils/tests/.gitignore | 1 | ||||
-rw-r--r-- | libmailutils/tests/Makefile.am | 1 | ||||
-rw-r--r-- | libmailutils/tests/imapio.c | 95 | ||||
-rw-r--r-- | libmailutils/tests/wsp.c | 5 |
15 files changed, 653 insertions, 1 deletions
diff --git a/libmailutils/Makefile.am b/libmailutils/Makefile.am index 5aef3382d..7c1c5c432 100644 --- a/libmailutils/Makefile.am +++ b/libmailutils/Makefile.am @@ -19,3 +19,3 @@ SUBDIRS = auth base address sockaddr cidr cfg diag filter mailbox mailer mime\ - server string stream stdstream property url . tests + server string stream stdstream property url imapio . tests @@ -35,2 +35,3 @@ libmailutils_la_LIBADD = \ filter/libfilter.la\ + imapio/libimapio.la\ mailbox/libmailbox.la\ diff --git a/libmailutils/imapio/Makefile.am b/libmailutils/imapio/Makefile.am new file mode 100644 index 000000000..74f36a2ec --- /dev/null +++ b/libmailutils/imapio/Makefile.am @@ -0,0 +1,31 @@ +# GNU Mailutils -- a suite of utilities for electronic mail +# Copyright (C) 2011 Free Software Foundation, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General +# Public License along with this library. If not, see +# <http://www.gnu.org/licenses/>. + +noinst_LTLIBRARIES = libimapio.la + +libimapio_la_SOURCES = \ + create.c\ + getline.c\ + literal.c\ + printf.c\ + qstring.c\ + send.c\ + trace.c\ + words.c\ + xscript.c + +INCLUDES = @MU_LIB_COMMON_INCLUDES@ -I/libmailutils diff --git a/libmailutils/imapio/create.c b/libmailutils/imapio/create.c new file mode 100644 index 000000000..4a3a9af59 --- /dev/null +++ b/libmailutils/imapio/create.c @@ -0,0 +1,63 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdlib.h> +#include <mailutils/stream.h> +#include <mailutils/errno.h> +#include <mailutils/sys/imapio.h> + +int +mu_imapio_create (mu_imapio_t *iop, mu_stream_t str) +{ + struct _mu_imapio *io = calloc (1, sizeof (*io)); + if (!io) + return ENOMEM; + io->_imap_stream = str; + mu_stream_ref (str); + io->_imap_ws.ws_delim = " \t()"; + io->_imap_ws.ws_escape = "\\\""; + io->_imap_ws_flags = MU_WRDSF_DELIM | + MU_WRDSF_ESCAPE | + MU_WRDSF_NOVAR | + MU_WRDSF_NOCMD | + MU_WRDSF_QUOTE | + MU_WRDSF_RETURN_DELIMS | + MU_WRDSF_WS; + *iop = io; + return 0; +} + +void +mu_imapio_free (mu_imapio_t io) +{ + if (!io) + return; + if (io->_imap_ws_flags & MU_WRDSF_REUSE) + mu_wordsplit_free (&io->_imap_ws); + mu_stream_unref (io->_imap_stream); + free (io); +} + +void +mu_imapio_destroy (mu_imapio_t *pio) +{ + if (!pio) + return; + mu_imapio_free (*pio); + *pio = NULL; +} + diff --git a/libmailutils/imapio/getline.c b/libmailutils/imapio/getline.c new file mode 100644 index 000000000..28c8d4b36 --- /dev/null +++ b/libmailutils/imapio/getline.c @@ -0,0 +1,114 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdlib.h> +#include <string.h> +#include <mailutils/types.h> +#include <mailutils/imapio.h> +#include <mailutils/stream.h> +#include <mailutils/cstr.h> +#include <mailutils/cctype.h> +#include <mailutils/errno.h> +#include <mailutils/sys/imapio.h> + +int +mu_imapio_getline (struct _mu_imapio *io) +{ + int rc; + char *last_arg; + + io->_imap_ws_flags &= ~MU_WRDSF_APPEND; + + if (io->_imap_reply_ready) + { + mu_wordsplit_free_words (&io->_imap_ws); + io->_imap_reply_ready = 0; + } + + for (;;) + { + rc = mu_stream_getline (io->_imap_stream, + &io->_imap_buf_base, &io->_imap_buf_size, + &io->_imap_buf_level); + if (rc) + return rc; + if (io->_imap_buf_level == 0) + break; + io->_imap_buf_level = mu_rtrim_class (io->_imap_buf_base, + MU_CTYPE_ENDLN); + + if (mu_wordsplit_len (io->_imap_buf_base, io->_imap_buf_level, + &io->_imap_ws, io->_imap_ws_flags)) + return MU_ERR_PARSE; + io->_imap_ws_flags |= MU_WRDSF_REUSE|MU_WRDSF_APPEND; + + last_arg = io->_imap_ws.ws_wordv[io->_imap_ws.ws_wordc - 1]; + if (last_arg[0] == '{' && last_arg[strlen (last_arg)-1] == '}') + { + int rc; + unsigned long number; + char *sp = NULL; + int xlev = mu_imapio_set_xscript_level (io, MU_XSCRIPT_PAYLOAD); + + number = strtoul (last_arg + 1, &sp, 10); + /* Client can ask for non-synchronised literal, + if a '+' is appended to the octet count. */ + if (*sp == '}') + mu_stream_printf (io->_imap_stream, "+ GO AHEAD\n"); + else if (*sp != '+') + break; + + if (number + 1 > io->_imap_buf_size) + { + size_t newsize = number + 1; + void *newp = realloc (&io->_imap_buf_base, newsize); + if (!newp) + return ENOMEM; + io->_imap_buf_base = newp; + io->_imap_buf_size = newsize; + } + + for (io->_imap_buf_level = 0; io->_imap_buf_level < number; ) + { + size_t sz; + rc = mu_stream_read (io->_imap_stream, + io->_imap_buf_base + io->_imap_buf_level, + number - io->_imap_buf_level, + &sz); + if (rc || sz == 0) + break; + io->_imap_buf_level += sz; + } + mu_imapio_set_xscript_level (io, xlev); + if (rc) + return rc; + io->_imap_buf_base[io->_imap_buf_level++] = 0; + + free (last_arg); + io->_imap_ws.ws_wordv[--io->_imap_ws.ws_wordc] = NULL; + if (mu_wordsplit_len (io->_imap_buf_base, io->_imap_buf_level, + &io->_imap_ws, + io->_imap_ws_flags|MU_WRDSF_NOSPLIT)) + return MU_ERR_PARSE; + } + else + break; + } + + io->_imap_reply_ready = 1; + return 0; +} diff --git a/libmailutils/imapio/literal.c b/libmailutils/imapio/literal.c new file mode 100644 index 000000000..e46d23e13 --- /dev/null +++ b/libmailutils/imapio/literal.c @@ -0,0 +1,31 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdlib.h> +#include <string.h> +#include <mailutils/types.h> +#include <mailutils/imapio.h> +#include <mailutils/sys/imapio.h> +#include <mailutils/stream.h> + +int +mu_imapio_send_literal (struct _mu_imapio *io, const char *buffer) +{ + return mu_stream_printf (io->_imap_stream, + "{%lu}\n%s", (unsigned long) strlen (buffer), + buffer); +} diff --git a/libmailutils/imapio/printf.c b/libmailutils/imapio/printf.c new file mode 100644 index 000000000..801e82ade --- /dev/null +++ b/libmailutils/imapio/printf.c @@ -0,0 +1,35 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdarg.h> +#include <mailutils/types.h> +#include <mailutils/imapio.h> +#include <mailutils/stream.h> +#include <mailutils/sys/imapio.h> + +int +mu_imapio_printf (mu_imapio_t io, const char *fmt, ...) +{ + va_list ap; + int status; + + va_start (ap, fmt); + status = mu_stream_vprintf (io->_imap_stream, fmt, ap); + va_end (ap); + return status; +} + diff --git a/libmailutils/imapio/qstring.c b/libmailutils/imapio/qstring.c new file mode 100644 index 000000000..f50c15c84 --- /dev/null +++ b/libmailutils/imapio/qstring.c @@ -0,0 +1,72 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <string.h> +#include <mailutils/types.h> +#include <mailutils/imapio.h> +#include <mailutils/stream.h> +#include <mailutils/sys/imapio.h> + +/* Send NIL if empty string, change the quoted string to a literal if the + string contains: double quotes, CR, LF, or \. */ + +int +mu_imapio_send_qstring_unfold (struct _mu_imapio *io, const char *buffer, + int unfold) +{ + if (buffer == NULL || *buffer == '\0') + return mu_imapio_printf (io, "NIL"); + if (strchr (buffer, '"') || + strchr (buffer, '\r') || + strchr (buffer, '\n') || + strchr (buffer, '\\')) + { + if (unfold) + { + int rc; + size_t len = strlen (buffer); + + rc = mu_stream_printf (io->_imap_stream, + "{%lu}\n", (unsigned long) strlen (buffer)); + if (rc) + return rc; + for (;;) + { + size_t s = strcspn (buffer, "\r\n"); + rc = mu_stream_write (io->_imap_stream, buffer, s, NULL); + if (rc) + return rc; + len -= s; + if (len == 0) + break; + buffer += s; + rc = mu_stream_write (io->_imap_stream, " ", 1, NULL); + if (rc) + return rc; + } + } + else + return mu_imapio_send_literal (io, buffer); + } + return mu_imapio_printf (io, "\"%s\"", buffer); +} + +int +mu_imapio_send_qstring (struct _mu_imapio *io, const char *buffer) +{ + return mu_imapio_send_qstring_unfold (io, buffer, 0); +} diff --git a/libmailutils/imapio/send.c b/libmailutils/imapio/send.c new file mode 100644 index 000000000..11ee04930 --- /dev/null +++ b/libmailutils/imapio/send.c @@ -0,0 +1,29 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdarg.h> +#include <mailutils/types.h> +#include <mailutils/imapio.h> +#include <mailutils/stream.h> +#include <mailutils/sys/imapio.h> + +int +mu_imapio_send (mu_imapio_t io, const char *buf, size_t bytes) +{ + return mu_stream_write (io->_imap_stream, buf, bytes, NULL); +} + diff --git a/libmailutils/imapio/trace.c b/libmailutils/imapio/trace.c new file mode 100644 index 000000000..ae607452c --- /dev/null +++ b/libmailutils/imapio/trace.c @@ -0,0 +1,86 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <errno.h> +#include <mailutils/types.h> +#include <mailutils/imapio.h> +#include <mailutils/stream.h> +#include <mailutils/errno.h> +#include <mailutils/error.h> +#include <mailutils/nls.h> +#include <mailutils/sys/imapio.h> + +static const char *imapio_prefix[] = { + "S: ", "C: " +}; + +int +mu_imapio_trace_enable (mu_imapio_t io) +{ + int rc = 0; + mu_stream_t dstr, xstr; + + if (io->_imap_transcript) + return MU_ERR_OPEN; + + rc = mu_dbgstream_create (&dstr, MU_DIAG_DEBUG); + if (rc) + mu_error (_("cannot create debug stream; transcript disabled: %s"), + mu_strerror (rc)); + else + { + rc = mu_xscript_stream_create (&xstr, io->_imap_stream, dstr, + imapio_prefix); + if (rc) + mu_error (_("cannot create transcript stream: %s"), + mu_strerror (rc)); + else + { + mu_stream_unref (io->_imap_stream); + io->_imap_stream = xstr; + io->_imap_transcript = 1; + } + } + + return rc; +} + +int +mu_imapio_trace_disable (mu_imapio_t io) +{ + mu_stream_t xstr = io->_imap_stream; + mu_stream_t stream[2]; + int rc; + + if (!io->_imap_transcript) + return MU_ERR_NOT_OPEN; + + rc = mu_stream_ioctl (xstr, MU_IOCTL_TRANSPORT, MU_IOCTL_OP_GET, stream); + if (rc) + return rc; + + io->_imap_stream = stream[0]; + mu_stream_destroy (&xstr); + io->_imap_transcript = 0; + return 0; +} + +int +mu_imapio_get_trace (mu_imapio_t io) +{ + return io ? io->_imap_transcript : 0; +} diff --git a/libmailutils/imapio/words.c b/libmailutils/imapio/words.c new file mode 100644 index 000000000..7fa1c81bf --- /dev/null +++ b/libmailutils/imapio/words.c @@ -0,0 +1,42 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <stdlib.h> +#include <mailutils/errno.h> +#include <mailutils/imapio.h> +#include <mailutils/sys/imapio.h> + +int +mu_imapio_get_words (mu_imapio_t io, size_t *pwc, char ***pwv) +{ + if (!io->_imap_reply_ready) + return MU_ERR_INFO_UNAVAILABLE; + *pwc = io->_imap_ws.ws_wordc; + *pwv = io->_imap_ws.ws_wordv; + return 0; +} + +int +mu_imapio_getbuf (mu_imapio_t io, char **pptr, size_t *psize) +{ + if (!io->_imap_reply_ready) + return MU_ERR_INFO_UNAVAILABLE; + *pptr = io->_imap_buf_base; + *psize = io->_imap_buf_level; + return 0; +} + diff --git a/libmailutils/imapio/xscript.c b/libmailutils/imapio/xscript.c new file mode 100644 index 000000000..ebb003b66 --- /dev/null +++ b/libmailutils/imapio/xscript.c @@ -0,0 +1,46 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, + 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <config.h> +#include <errno.h> +#include <mailutils/types.h> +#include <mailutils/stream.h> +#include <mailutils/diag.h> +#include <mailutils/imapio.h> +#include <mailutils/sys/imapio.h> + +int +mu_imapio_set_xscript_level (struct _mu_imapio *io, int xlev) +{ + if (!io) + return EINVAL; + if (io->_imap_transcript) + { + if (xlev != MU_XSCRIPT_NORMAL) + { + if (mu_debug_level_p (MU_DEBCAT_REMOTE, + xlev == MU_XSCRIPT_SECURE ? + MU_DEBUG_TRACE6 : MU_DEBUG_TRACE7)) + return MU_XSCRIPT_NORMAL; + } + + if (mu_stream_ioctl (io->_imap_stream, MU_IOCTL_XSCRIPTSTREAM, + MU_IOCTL_XSCRIPTSTREAM_LEVEL, &xlev) == 0) + return xlev; + } + return MU_XSCRIPT_NORMAL; +} diff --git a/libmailutils/tests/.gitignore b/libmailutils/tests/.gitignore index 0860f078e..444e39e91 100644 --- a/libmailutils/tests/.gitignore +++ b/libmailutils/tests/.gitignore @@ -14,2 +14,3 @@ fltst fsaf +imapio listop diff --git a/libmailutils/tests/Makefile.am b/libmailutils/tests/Makefile.am index 66d83ca0e..0ac3ec16b 100644 --- a/libmailutils/tests/Makefile.am +++ b/libmailutils/tests/Makefile.am @@ -49,2 +49,3 @@ noinst_PROGRAMS = \ fsaf\ + imapio\ listop\ diff --git a/libmailutils/tests/imapio.c b/libmailutils/tests/imapio.c new file mode 100644 index 000000000..652f0d654 --- /dev/null +++ b/libmailutils/tests/imapio.c @@ -0,0 +1,95 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 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 <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <mailutils/imapio.h> +#include <mailutils/errno.h> +#include <mailutils/error.h> +#include <mailutils/stream.h> +#include <mailutils/stdstream.h> + +void +usage () +{ + mu_stream_printf (mu_strout, "usage: %s [debug=SPEC] [-transcript]\n", + mu_program_name); + exit (0); +} + +int +main (int argc, char **argv) +{ + int i, rc; + int transcript = 0; + mu_imapio_t io; + mu_stream_t str; + + mu_set_program_name (argv[0]); + mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); + + for (i = 1; i < argc; i++) + { + char *opt = argv[i]; + + if (strncmp (opt, "debug=", 6) == 0) + mu_debug_parse_spec (opt + 6); + else if (strcmp (opt, "-transcript") == 0) + transcript = 1; + else if (strcmp (opt, "-h") == 0) + usage (); + else + { + mu_error ("%s: unrecognized argument", opt); + exit (1); + } + } + + MU_ASSERT (mu_iostream_create (&str, mu_strin, mu_strout)); + + + MU_ASSERT (mu_imapio_create (&io, str)); + + if (transcript) + mu_imapio_trace_enable (io); + mu_stream_unref (str); + + while ((rc = mu_imapio_getline (io)) == 0) + { + size_t wc; + char **wv; + + MU_ASSERT (mu_imapio_get_words (io, &wc, &wv)); + if (wc == 0) + break; + + mu_stream_printf (mu_strerr, "%d\n", wc); + for (i = 0; i < wc; i++) + { + mu_stream_printf (mu_strerr, "%d: '%s'\n", i, wv[i]); + } + } + + if (rc) + mu_error ("mu_imap_getline: %s", mu_strerror (rc)); + + mu_imapio_free (io); + return 0; +} diff --git a/libmailutils/tests/wsp.c b/libmailutils/tests/wsp.c index 0b8d622b0..47cd4ff6d 100644 --- a/libmailutils/tests/wsp.c +++ b/libmailutils/tests/wsp.c @@ -55,2 +55,3 @@ struct mu_kwd string_keytab[] = { { "comment", MU_WRDSF_COMMENT }, + { "escape", MU_WRDSF_ESCAPE }, { NULL, 0 } @@ -241,2 +242,6 @@ main (int argc, char **argv) break; + + case MU_WRDSF_ESCAPE: + ws.ws_escape = argv[i]; + break; } |