36 Commits

Author SHA1 Message Date
3c96a4bd4e Merge branch 'master' of github.com:dspiljar/mboxgrep 2025-07-29 21:57:09 +02:00
103e532c02 Merge pull request #6 from PPN-SD/fix_build
fix build c23
2025-07-29 21:56:22 +02:00
4ada8db692 Merge pull request #6 from PPN-SD/fix_build
fix build c23
2025-07-29 21:52:30 +02:00
Nicolas PARLANT
ad59739005 drop really old ifdef and fix C23
Signed-off-by: Nicolas PARLANT <nicolas.parlant@parhuet.fr>
2025-07-28 19:14:01 +02:00
Nicolas PARLANT
ba1513796b missing include
>getopt.c:386:30: error: call to undeclared library function 'strcmp' with type 'int (const char *, const char *)';
>      ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
>  386 |       if (optind != argc && !strcmp (argv[optind], "--"))
>      |                              ^

Signed-off-by: Nicolas PARLANT <nicolas.parlant@parhuet.fr>
2025-07-28 18:09:41 +02:00
b93a60572b Remove an obsolete macro. 2024-09-28 12:36:22 +02:00
1938d25ced Update the copyright statement. 2024-09-28 12:35:18 +02:00
7b7bafd5f8 Re-arrange the TODO list for readability. 2024-09-27 23:42:13 +02:00
eec14b33ff Fix a typo. 2024-09-27 23:41:15 +02:00
fdab5e8c5e Automake settings
Omit the contrib subdirectory from the distribution tarball.
2024-09-27 11:11:11 +02:00
66dd5fed23 Git settings
- Clean up the .gitignore file.
- Treat Info pages as binary files.
2024-09-27 10:46:40 +02:00
4cb77488bc Bump the version to 0.7.13. 2024-09-23 21:34:04 +02:00
6f8e688a46 Merge branch 'master' of github.com:dspiljar/mboxgrep 2024-09-23 16:04:20 +02:00
d8f44235f5 Fix Automake to include AUTHORS.md. 2024-09-23 14:37:53 +02:00
6e9600426a Minor update to the man and info pages
Sync the examples section, refer to RFC 4155 for the mbox mailbox
format, and add URLs to Gitea and Github.
2024-09-23 13:15:05 +02:00
b4d3034c8c Minor update to the man and info pages
Sync the examples section, refer to RFC 4155 for the mbox mailbox
format, and add URLs to Gitea and Github.
2024-09-23 12:59:51 +02:00
9515236244 Merge branch 'mbox_cleanup' 2024-09-20 23:43:29 +02:00
a790494133 Code refactoring
Refactor of mbox_open(). Checking for a "postmark" line, i.e. whether
the file is an mbox mailbox, has been moved to mbox_check_postmark().
2024-09-20 22:18:30 +02:00
ec8062309d Readability of the news file
Headings in the news file now refer to changes in the current version,
as opposed to changes since the last version.
2024-09-20 13:48:55 +02:00
631998a849 Code refactoring
Partial refactor of mbox_open(). Opening of file descripts has been
moved to mbox_fdopen().
2024-09-20 13:11:06 +02:00
bd64536e89 Function prototype
Use an enum type instead of a string to define the file opening mode.
2024-09-19 22:40:20 +02:00
b30f2f2362 Suppress "Not an mbox folder" error messages on empty files. 2024-09-19 00:24:21 +02:00
1a63374e73 Move file locking code to a separate function.
Failure to lock a file is now fatal.
2024-09-18 23:48:21 +02:00
efc6f92cdb Update the TODO list. 2024-09-13 15:54:50 +02:00
191b24433f Mention the contributors and convert to Markdown. 2024-09-11 18:07:50 +02:00
40b6f8799f Merge branch 'giachello-master' 2024-09-11 13:47:18 +02:00
Giovanni Iachello
13bf23b9a2 fix autoconf on Windows 2024-09-10 22:39:39 -07:00
c732d4f949 Phrasing
Clarify that the parameter to the "-o" switch is a MAILBOX instead of a
FOLDER (which could be confused with an ordinary filesystem folder).

Added per Roman Nezval's comment.
2023-12-29 00:59:25 +01:00
7255fae5d0 Bump the version to 0.7.12a. 2023-05-21 15:09:44 +02:00
03407c7afb Correction of Automake macros
Fix Automake macros to include the license file and other files and
directories in the distribution tarball.
2023-05-21 12:05:18 +02:00
dd5fefe22d Update the TODO list and bump the version to 0.7.12. 2023-05-20 20:34:23 +02:00
cbba5c2a33 Remove config.h.in from the git repo, as it is autogenerated. 2023-05-20 20:09:23 +02:00
27082f9629 Minor updates of the documentation. 2023-05-18 13:43:09 +02:00
d17f37b3c5 Include the contrib subdirectory in the distribution tarball. 2023-05-18 13:35:35 +02:00
e004f116b7 Merge branch 'pcre2-port' 2023-05-17 19:40:41 +02:00
e5409a897d Port to the pcre2 library. 2023-05-17 17:58:59 +02:00
26 changed files with 343 additions and 398 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
*.info binary

7
.gitignore vendored
View File

@@ -1,10 +1,10 @@
Makefile
config.h
config.h.in
config.log
config.status
src/*.o
src/*.c~
src/*.h~
src/*.exe
src/mboxgrep
src/.deps/
src/stamp-h1
@@ -16,3 +16,6 @@ compile
depcomp
install-sh
missing
.gitignore
.vscode/*
*~

View File

@@ -1,5 +0,0 @@
-*- text -*-
mboxgrep is written and maintained by Daniel Spiljar.
$Id: AUTHORS,v 1.3 2005-11-16 01:37:18 dspiljar Exp $

1
AUTHORS.md Normal file
View File

@@ -0,0 +1 @@
mboxgrep is written and maintained by Daniel Spiljar with contributors.

View File

@@ -5,11 +5,15 @@
Autoconf and Automake are used, and the most basic compilation procedure consists of:
```
autoreconf --install
./configure
make
make install # root rights probably needed here, prefix with sudo in such case
```
(Invocation of `autoreconf` is only required if the source tree has been cloned from the
git repository.)
To see the list of flags accepted by the configure script, run:
```
@@ -18,5 +22,5 @@ To see the list of flags accepted by the configure script, run:
Optionally, `mboxgrep` can be linked with the following libraries:
- PCRE, to enable support for regular expressions compatible with Perl 5;
- PCRE2, to enable support for regular expressions compatible with Perl 5;
- zlib and bzlib, to enable support for compressed mbox folders.

View File

@@ -1 +1,2 @@
SUBDIRS = doc src
EXTRA_DIST = COPYING.md INSTALL.md NEWS.md README.md TODO.md AUTHORS.md

57
NEWS.md
View File

@@ -1,11 +1,28 @@
# Changes of mboxgrep
## Changes since 0.7.10
## Changes in 0.7.13
- Improve the readability of this file.
- Failure to lock a file (mbox) is now a fatal error.
- Fix Autoconf on Windows.
- Code refactoring, mostly of mbox-related functions.
## Changes in 0.7.12a
- Fix Automake macros to include the license file and others.
## Changes in 0.7.12
- Port to the pcre2 library (pcre1 is no longer supported).
- Check command-line options for conflicting matchers and actions.
- Various minor code cleanups.
## Changes in 0.7.11
- GNU Automake is now utilized instead of manually written Makefile.in files.
- Code indentation has been corrected and documented (GNU indent is used for this purpose).
## Changes since 0.7.9
## Changes in 0.7.10
- development has been restarted after a longer hiatus
- moved the source tree to git
@@ -14,7 +31,7 @@
- fixed multiple compilation errors and warnings on Linux and FreeBSD
- started implementing a debug mode
## Changes since 0.7.8
## Changes in 0.7.9
- implemented support for mbox folders compressed with bzip2 algorithm
- improved detection of PCRE library; this also fixes a compilation bug
@@ -23,7 +40,7 @@
folder and temporary directory were on different filesystems;
thanks to James P. Dugal <jpd AT louisiana.edu> for providing a patch
## Changes since 0.7.7
## Changes in 0.7.8
- fixed crashes on MH folders, as well as a potential problem with mbox
and maildir folders with the same cause
@@ -32,46 +49,46 @@
- mboxgrep can now read gzip compressed mbox folders from standard input
(which is a side effect of a code cleanup!)
## Changes since 0.7.6a
## Changes in 0.7.7
- mboxgrep can now read mbox folders from standard input
## Changes since 0.7.6
## Changes in 0.7.6a
- fixed a bug which prevented mboxgrep from being compiled
## Changes since 0.7.5
## Changes in 0.7.6
- fixed a bug which caused mboxgrep to coredump on recursive search of
maildirs
- code cleanups
## Changes since 0.7.4
## Changes in 0.7.5
- recursive search through directories has been reimplemented
## Changes since 0.7.3
## Changes in 0.7.4
- mboxgrep can now ignore messages with identical bodies
## Changes since 0.7.2
## Changes in 0.7.3
- file locking method can be selected at runtime
- mboxgrep used to coredump on messages with empty headers; the problem is
now hopefully fixed
- mboxgrep now compiles on FreeBSD
## Changes since 0.7.1
## Changes in 0.7.2
- file locking with `flock()` instead of `fcntl()` is now supported
- mboxgrep should now compile on systems which don't have `getopt_long()`
- other minor bugfixes
## Changes since 0.7.0
## Changes in 0.7.1
- bugfixes
## Changes since 0.5.3
## Changes in 0.7.0
- NOTE: there was no stable version between 0.5.x and 0.7.x
- mboxgrep is almost completely rewritten
@@ -81,7 +98,7 @@
command)
- added support for compressed mbox folders
## Changes since 0.5.2
## Changes in 0.5.3
- implemented ability to write found messages to another folder (instead
of standard output)
@@ -89,7 +106,7 @@
"NEWS")
- wrote a manual in Texinfo format
## Changes since 0.5.1
## Changes in 0.5.2
- implemented message counting (`-c, --count`)
- fixed manual page installation target in src/Makefile.in -- manual page
@@ -102,17 +119,17 @@
- implemented recursive search through directories (`-r, --recursive`)
- config.h[.in] is now wrapped (`#ifndef CONFIG_H` and stuff)
## Changes since 0.5.0
## Changes in 0.5.1
- added support for qmail-style maildir folders
## Changes since 0.4.0
## Changes in 0.5.0
- the source of `getopt_long()` is now included, so long options are also available
on platforms that don't use GNU libc
- file locking is now performed on mbox folders only
## Changes since 0.2.0
## Changes in 0.4.0
- added support for MH mailboxes
- added scope selection switches `-B` (or `--body`) and `-H` (or `--headers`)
@@ -123,12 +140,12 @@
- the feature of reading from standard input is gone
- added `-v` (or `--version`) switch
## Changes since 0.1.1
## Changes in 0.2.0
- mboxgrep now puts a shared lock on a mailbox before reading it
- various code cleanups
## Changes since 0.1.0
## Changes in 0.1.1
- fixed install target in Makefile (`install` is now used instead of `cp`)
- added support for mailboxes generated by Gnus

View File

@@ -1,7 +1,7 @@
# mboxgrep - selects e-mail messages matching a pattern
`mboxgrep` is a `grep(1)`-like tool which scans mailboxes and selects
e-mail messages matching pattern.
e-mail messages matching a pattern.
Full description of mboxgrep is contained in the documentation,
which is provided both in manpage and texinfo format, to satisfy

18
TODO.md
View File

@@ -3,37 +3,39 @@
## Behavior
- [x] use cryptographic hashes for detecting duplicate messages
- [ ] add checking for conflicting command-line options
- [ ] support for deletion of messages after being matched and displayed
- [x] add checking for conflicting command-line options
- [x] ignore .overview when grepping Gnus folders
- [x] inverted matching
- [x] recursive search through directories
- [x] writing selected messages to a new folder
- [x] deleting selected messages
- [ ] basic time and date matching
- [ ] more advanced time and date matching, with strings such as "yesterday"
- [x] reading messages from standard input
- [x] run-time selection of file locking method
- [x] add a debug function
- [ ] support for deletion of messages after being matched and displayed
- [ ] basic time and date matching
- [ ] more advanced time and date matching, with strings such as "yesterday"
- [ ] Remove the option to recursively traverse directories and instruct the users to run mboxgrep in conjuction with find(1) instead.
## File formats, encodings and standards
- [ ] migrate to pcre2, as pcre is obsolete
- [x] migrate to pcre2, as pcre is obsolete
- [x] support for compressed mbox folders
- [x] support for bzip2 compression
- [ ] use a more modern hash function than MD5
- [ ] MIME support
- [ ] support for GnuPG
- [x] support for compressed mbox folders
- [x] support for bzip2 compression
- [ ] support for XZ-format compression
- [ ] support for mail folder conversion
- [ ] improve error detection when a directory is not a Maildir or MH folder
- [ ] document criteria for folder format detection
- [ ] Maildir: check if an atomic rename() fails. This could be caused if "new" and "cur" subdirectories are not on the same filesystem, for example.
## Miscellaneous
- [x] write Texinfo documentation
- [x] provide possibility to use flock() instead of fcntl()
- [ ] configuration files
- [ ] make use of lockfile library
- [ ] make use of Solaris' maillock library
- [x] provide possibility to use flock() instead of fcntl()
- [ ] provide national language support with gettext()

View File

@@ -1,5 +1,5 @@
# mboxgrep - scan mailbox for messages matching a regular expression
# Copyright (C) 2000 - 2003, 2023 Daniel Spiljar
# Copyright (C) 2000 - 2003, 2023 - 2024 Daniel Spiljar
#
# Mboxgrep is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -18,50 +18,49 @@
# Process this file with autoconf to produce a configure script.
# Yawn.
AC_INIT([mboxgrep], [0.7.11], [dspiljar@datatipp.se], [mboxgrep], [https://www.mboxgrep.org/])
AC_INIT([mboxgrep],[0.7.13],[dspiljar@datatipp.se],[mboxgrep],[https://www.mboxgrep.org/])
#AM_INIT_AUTOMAKE
AM_INIT_AUTOMAKE([foreign])
AC_LANG([C])
AC_CONFIG_HEADER([src/config.h])
AC_CONFIG_HEADERS([src/config.h])
# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
# Checks for standard (sp?) header files
AC_HEADER_STDC
AC_HEADER_DIRENT
# Checks for libraries.
# Check for PCRE library
AC_ARG_WITH(pcre, [ --without-pcre Compile without Perl regexp support],,
# Check for PCRE2 library
AC_ARG_WITH(pcre2, [ --without-pcre2 Compile without Perl regexp support],,
[
AC_PATH_PROG(PCRE_CONFIG, pcre-config)
AC_PATH_PROG(PCRE2_CONFIG, pcre2-config)
if test "$PCRE_CONFIG"; then
CFLAGS="$CFLAGS `$PCRE_CONFIG --cflags`"
LIBS="$LIBS `$PCRE_CONFIG --libs`"
if test "$PCRE2_CONFIG"; then
CFLAGS="$CFLAGS `$PCRE2_CONFIG --cflags`"
LIBS="$LIBS `$PCRE2_CONFIG --libs32`"
AC_LINK_IFELSE(
[
#include <pcre.h>
#define PCRE2_CODE_UNIT_WIDTH 32
#include <pcre2.h>
int main ()
{
return 0;
}
],
AC_DEFINE(HAVE_LIBPCRE),
AC_DEFINE(HAVE_LIBPCRE2),
[
AC_MSG_NOTICE(found pcre-config but could not compile test program.)
AC_MSG_FAILURE(is PCRE properly installed?)
AC_MSG_NOTICE(found pcre2-config but could not compile test program.)
AC_MSG_FAILURE(is PCRE2 properly installed?)
]
)
else
AC_MSG_NOTICE(pcre-config not found)
AC_MSG_NOTICE(trying to find PCRE anyway)
AC_CHECK_LIB(pcre, main)
AC_MSG_NOTICE(pcre2-config not found)
AC_MSG_NOTICE(trying to find PCRE2 anyway)
AC_CHECK_LIB(pcre2, main)
fi
]
)
@@ -92,7 +91,5 @@ AC_CHECK_FUNCS([strptime])
AC_CHECK_FUNCS(ftw)
AC_CHECK_FUNCS(fts_open)
AC_CONFIG_FILES([Makefile
doc/Makefile
src/Makefile])
AC_CONFIG_FILES([Makefile doc/Makefile src/Makefile])
AC_OUTPUT

View File

@@ -1,4 +1,4 @@
.TH MBOXGREP 1 "24 Mar 2023"
.TH MBOXGREP 1 "27 September 2024"
.SH NAME
mboxgrep \- displays email messages matching a pattern
.SH SYNOPSIS
@@ -10,7 +10,7 @@ mboxgrep \- displays email messages matching a pattern
This manual page refers to
.B mboxgrep
version
.BR 0.7.11 .
.BR 0.7.13 .
.PP
.B mboxgrep
scans a
@@ -18,7 +18,7 @@ scans a
and displays messages matching
.I PATTERN.
.PP
If a mailbox name is ommited, or a single dash (-) is given instead,
If a mailbox name is omitted, or a single dash (-) is given instead,
it reads from standard input.
It can read mbox folders or output from another
.B mboxgrep
@@ -72,8 +72,8 @@ Do not lock files. This option is meaningful only if a mbox folder (see below)
is scanned.
.IP "-c, --count"
Suppress normal output and print a count of matching messages.
.IP "-o, --output=FOLDER"
Suppress normal output and write messages to destination folder FOLDER instead.
.IP "-o, --output=MAILBOX"
Suppress normal output and write messages to destination MAILBOX instead.
.IP "-p, --pipe=COMMAND"
Pipe each found message to COMMAND
.IP "-d, --delete"
@@ -97,10 +97,26 @@ Search $MAIL for messages from Dirty Harry:
mboxgrep '^From:.*callahan@sanfranciscopolice\\.org' $MAIL
.TP
\(bu
Re-mail to George messages that mention his name:
.PP
mboxgrep --pipe="/usr/lib/sendmail george" --ignore-case george ~/Mail/*
.TP
\(bu
Display all messages contained in folder ~/Mail/incoming, except those
that appear to originate from AOL:
.PP
mboxgrep -v 'Received:.*aol\\.com' ~/Mail/incoming
.TP
\(bu
Do a case-insensitive scan of ~/Mail/incoming for messages with subject
``Weekly News'' and write them to folder ~/Mail/archive:
.PP
mboxgrep -o ~/Mail/archive -H -i '^Subject: Weekly News' ~/Mail/incoming
.TP
\(bu
Count all messages stored in folder spam, ignoring duplicates:
.PP
mboxgrep -nd -c . spam
.SH BUGS
Report them to address below.
.SH SEE ALSO
@@ -108,7 +124,8 @@ grep(1),
regex(7),
perlre(1),
mbox(5),
RFC 2822
RFC 2822,
RFC 4155
.SH DEDICATION
Mboxgrep is dedicated in loving memory of Vicky, my cat who died of
tumor on Sep 12, 2002.
@@ -116,7 +133,11 @@ tumor on Sep 12, 2002.
You haven't been long with us, but you gave us a lot of joy and all your
big heart that stopped ticking too early. I will never forget you. Sleep
well, little friend.
.SH URL
http://www.mboxgrep.org/
.SH HOMEPAGE
https://www.mboxgrep.org/
.SH GIT
https://git.datatipp.se/dspiljar/mboxgrep
.PP
https://github.com/dspiljar/mboxgrep
.SH AUTHOR
Daniel Spiljar <dspiljar AT datatipp.se>
Daniel Spiljar <dspiljar@datatipp.se>

View File

@@ -1,4 +1,4 @@
This is mboxgrep.info, produced by makeinfo version 6.7 from
This is mboxgrep.info, produced by makeinfo version 6.8 from
mboxgrep.texi.
INFO-DIR-SECTION Mail
@@ -9,10 +9,10 @@ END-INFO-DIR-ENTRY

File: mboxgrep.info, Node: Top, Up: (dir)
This file documents 'mboxgrep' (version 0.7.11), a mailbox scanning
This file documents 'mboxgrep' (version 0.7.13), a mailbox scanning
utility.
Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar
Copyright (C) 2000 - 2003, 2024 Daniel Spiljar
* Menu:
@@ -151,10 +151,10 @@ options below change such behavior.
'-nd'
Ignore duplicate messages.
'--output=FOLDER'
'-o FOLDER'
Suppress normal output and write messages to destination folder
FOLDER instead.
'--output=MAILBOX'
'-o MAILBOX'
Suppress normal output and write messages to destination MAILBOX
instead.
Note that 'mboxgrep' assumes the output folder is of the same
format as the input folder. Currently there is no possibility to
@@ -250,17 +250,17 @@ Sleep well, little friend.

Tag Table:
Node: Top197
Node: Introduction596
Node: Invoking1465
Node: Miscellaneous1827
Node: File locking2112
Node: Regexp selection2749
Node: Output control3301
Node: Search scope selection4345
Node: Mailbox type selection4586
Node: Examples4907
Node: Bugs5731
Node: To Vicky6149
Node: Introduction591
Node: Invoking1460
Node: Miscellaneous1822
Node: File locking2107
Node: Regexp selection2744
Node: Output control3296
Node: Search scope selection4336
Node: Mailbox type selection4577
Node: Examples4898
Node: Bugs5722
Node: To Vicky6140

End Tag Table

View File

@@ -5,8 +5,8 @@
@setchapternewpage odd
@set EDITION 0.7
@set VERSION 0.7.11
@set UPDATED 24 Mar 2023
@set VERSION 0.7.13
@set UPDATED 23 September 2024
@dircategory Mail
@direntry
@@ -19,7 +19,7 @@
This file documents @code{mboxgrep} (version @value{VERSION}), a
mailbox scanning utility.
Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar
Copyright (C) 2000 - 2003, 2024 Daniel Spiljar
@end ifinfo
@menu
@@ -171,10 +171,9 @@ Use with extreme caution.
@itemx -nd
Ignore duplicate messages.
@item --output=FOLDER
@itemx -o FOLDER
Suppress normal output and write messages to destination folder FOLDER
instead.
@item --output=MAILBOX
@itemx -o MAILBOX
Suppress normal output and write messages to destination MAILBOX instead.
Note that @code{mboxgrep} assumes the output folder is of the same format
as the input folder. Currently there is no possibility to convert folders.

View File

@@ -1,76 +0,0 @@
/* src/config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
*/
#undef HAVE_DIRENT_H
/* Define to 1 if you have the `fcntl' function. */
#undef HAVE_FCNTL
/* Define to 1 if you have the `flock' function. */
#undef HAVE_FLOCK
/* Define to 1 if you have the `fts_open' function. */
#undef HAVE_FTS_OPEN
/* Define to 1 if you have the `ftw' function. */
#undef HAVE_FTW
/* Define to 1 if you have the `bz2' library (-lbz2). */
#undef HAVE_LIBBZ2
/* Define to 1 if you have the `dmalloc' library (-ldmalloc). */
#undef HAVE_LIBDMALLOC
/* Define to 1 if you have the `garfield' library (-lgarfield). */
#undef HAVE_LIBGARFIELD
/* Define to 1 if you have the `pcre' library (-lpcre). */
#undef HAVE_LIBPCRE
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
#undef HAVE_NDIR_H
/* Define to 1 if you have the `regcomp' function. */
#undef HAVE_REGCOMP
/* Define to 1 if you have the `strptime' function. */
#undef HAVE_STRPTIME
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
*/
#undef HAVE_SYS_DIR_H
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
*/
#undef HAVE_SYS_NDIR_H
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Version number of package */
#undef VERSION

View File

@@ -52,6 +52,7 @@ char *alloca ();
#endif
#include <stdio.h>
#include <string.h>
/* Comment out all this code if we are using the GNU C Library, and are not
actually compiling the library itself. This code is part of the GNU C

View File

@@ -1,6 +1,6 @@
/*
mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000 - 2004, 2006, 2010, 2023 Daniel Spiljar
Copyright (C) 2000 - 2004, 2006, 2010, 2023 - 2024 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@@ -47,7 +47,7 @@ void
version (void)
{
fprintf (stdout, "%s %s\n\n"
"Copyright (C) 2000 - 2004, 2006, 2010, 2023 Daniel Spiljar\n"
"Copyright (C) 2000 - 2004, 2006, 2010, 2023 - 2024 Daniel Spiljar\n"
"This program is free software; you can redistribute it and/or "
"modify\nit under the terms of the GNU General Public License "
"as published by\nthe Free Software Foundation; either version "
@@ -74,9 +74,9 @@ version (void)
/*
fprintf (stdout, "HAVE_LIBLOCKFILE ");
*/
#ifdef HAVE_LIBPCRE
print_wrap ("HAVE_LIBPCRE");
#endif /* HAVE_LIBPCRE */
#ifdef HAVE_LIBPCRE2
print_wrap ("HAVE_LIBPCRE2");
#endif /* HAVE_LIBPCRE2 */
#ifdef HAVE_LIBZ
print_wrap ("HAVE_LIBZ");
#endif /* HAVE_LIBZ */
@@ -128,10 +128,10 @@ help (void)
"Matching criteria:\n\n"
" -E, --extended-regexp\tPATTERN is an extended regular expression\n"
" -G, --basic-regexp\t\tPATTERN is a basic regular expression\n");
#ifdef HAVE_LIBPCRE
#ifdef HAVE_LIBPCRE2
fprintf (stdout,
" -P, --perl-regexp\t\tPATTERN is a Perl regular expression\n");
#endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
fprintf (stdout,
" -e, --regexp=PATTERN\t\tUse PATTERN as a regular expression\n"
" -i, --ignore-case\t\tIgnore case distinctions\n"

View File

@@ -1,6 +1,6 @@
/*
mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000 - 2004, 2006, 2023 Daniel Spiljar
Copyright (C) 2000 - 2004, 2006, 2023 - 2024 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@@ -99,11 +99,11 @@ main (int argc, char **argv)
if (config.haveregex)
{
#ifdef HAVE_LIBPCRE
#ifdef HAVE_LIBPCRE2
if (config.regextype == REGEX_PERL)
pcre_init ();
else
#endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
regex_init ();
}
else
@@ -117,7 +117,7 @@ main (int argc, char **argv)
if (config.action == ACTION_DELETE)
{
tmpmbox_create (argv[optind]);
runtime.tmp_mbox = (mbox_t *) mbox_open (config.tmpfilename, "w");
runtime.tmp_mbox = (mbox_t *) mbox_open (config.tmpfilename, w);
}
config.boxname = xstrdup (argv[optind]);

View File

@@ -1,6 +1,6 @@
/*
mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2023 Daniel Spiljar
Copyright (C) 2000 - 2004, 2006, 2023 - 2024 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@@ -50,166 +50,47 @@
#endif /* HAVE_LIBDMALLOC */
mbox_t *
mbox_open (const char *path, const char *mode)
mbox_open (const char *path, const mbox_mode_t mbox_mode)
{
mbox_t *mp;
static int fd;
#ifndef HAVE_FLOCK
struct flock lck;
#endif /* HAVE_FLOCK */
char buffer[BUFSIZ];
mp = (mbox_t *) xmalloc (sizeof (mbox_t));
mp->postmark_cache = (char *) xmalloc (BUFSIZ * sizeof (char));
mp->postmark_cache = NULL;
if (0 == strcmp ("-", path))
mp->fp = stdin;
else
{
if (mode[0] == 'r')
fd = m_open (path, O_RDONLY, 0);
else if (mode[0] == 'w')
if (mbox_mode == w)
fd = m_open (path, (O_WRONLY | O_CREAT | O_APPEND),
(S_IWUSR | S_IRUSR));
else
{
fprintf (stderr, "%s: mbox.c: Unknown mode %c. You shouldn't "
"get this error...", APPNAME, mode[0]);
exit (2);
}
fd = m_open (path, O_RDONLY, 0);
if (fd == -1)
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, path);
perror (NULL);
}
errno = 0;
return NULL;
}
if (config.lock > LOCK_NONE)
{
#ifdef HAVE_FLOCK
int op;
mbox_lock (fd, path, mbox_mode);
if (mode[0] == 'r')
op = LOCK_SH;
else
op = LOCK_EX;
if (-1 == flock (fd, op))
#else
memset (&lck, 0, sizeof (struct flock));
lck.l_whence = SEEK_SET;
if (mode[0] == 'r')
lck.l_type = F_RDLCK;
else
lck.l_type = F_WRLCK;
if (-1 == fcntl (fd, F_SETLK, &lck))
#endif /* HAVE_FLOCK */
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, path);
perror (NULL);
}
errno = 0;
close (fd);
return NULL;
}
}
if (mode[0] == 'r')
{
if (config.format == FORMAT_MBOX)
mp->fp = (FILE *) m_fdopen (fd, "r");
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
mp->fp = (gzFile *) m_gzdopen (fd, "rb");
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
mp->fp = (BZFILE *) BZ2_bzdopen (fd, "rb");
#endif /* HAVE_LIBBZ2 */
}
else if (mode[0] == 'w')
{
if (config.format == FORMAT_MBOX)
mp->fp = (FILE *) m_fdopen (fd, "w");
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
mp->fp = (gzFile *) m_gzdopen (fd, "wb");
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
mp->fp = (BZFILE *) BZ2_bzdopen (fd, "wb");
#endif /* HAVE_LIBBZ2 */
}
if (mp->fp == NULL)
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, path);
perror (NULL);
}
errno = 0;
close (fd);
return NULL;
}
mp->fp = mbox_fdopen (fd, path, mbox_mode);
}
if (mode[0] == 'r')
if (mbox_mode == r)
{
if (config.format == FORMAT_MBOX)
fgets (buffer, BUFSIZ, mp->fp);
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
gzgets (mp->fp, buffer, BUFSIZ);
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
{
char c[1] = "\0";
int n = 0;
mp->postmark_cache = mbox_check_postmark (mp, path);
while (c[0] != '\n' && n < BUFSIZ)
{
BZ2_bzread (mp->fp, c, 1);
buffer[n] = c[0];
n++;
}
buffer[n] = '\0';
}
#endif /* HAVE_LIBBZ2 */
if (0 != strncmp ("From ", buffer, 5))
{
if (config.merr)
{
if (0 == strcmp ("-", path))
fprintf (stderr, "%s: (standard input): Not a mbox folder\n",
APPNAME);
else
fprintf (stderr, "%s: %s: Not a mbox folder\n", APPNAME,
path);
}
if (config.format == FORMAT_MBOX)
fclose (mp->fp);
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
gzclose (mp->fp);
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
BZ2_bzclose (mp->fp);
#endif /* HAVE_LIBBZ2 */
return NULL;
}
strcpy (mp->postmark_cache, buffer);
if (! mp->postmark_cache)
return NULL;
}
return mp;
}
@@ -431,3 +312,127 @@ tmpfile_create (void)
}
return fd;
}
void
mbox_lock (int fd, const char *path, const mbox_mode_t mbox_mode)
{
#ifdef HAVE_FLOCK
int op;
if (mbox_mode == r)
op = LOCK_SH;
else
op = LOCK_EX;
if (-1 == flock (fd, op))
#else
memset (&lck, 0, sizeof (struct flock));
lck.l_whence = SEEK_SET;
if (mode[0] == 'r')
lck.l_type = F_RDLCK;
else
lck.l_type = F_WRLCK;
if (-1 == fcntl (fd, F_SETLK, &lck))
#endif /* HAVE_FLOCK */
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, path);
perror (NULL);
exit (2);
}
}
}
void *
mbox_fdopen (int fd, const char *path, const mbox_mode_t mbox_mode)
{
void *f;
char *file_mode;
if (mbox_mode == w)
file_mode = xstrdup("wb");
else
file_mode = xstrdup("rb");
if (config.format == FORMAT_MBOX)
f = (FILE *) m_fdopen (fd, file_mode);
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
f = (gzFile *) m_gzdopen (fd, file_mode);
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
f = (BZFILE *) BZ2_bzdopen (fd, file_mode);
#endif /* HAVE_LIBBZ2 */
if (f == NULL)
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, path);
perror (NULL);
}
errno = 0;
close (fd);
return NULL;
}
return f;
}
char *
mbox_check_postmark(mbox_t *mp, const char *path)
{
char *buffer;
buffer = (char *) xmalloc (BUFSIZ * sizeof (char));
memset (buffer, 0, BUFSIZ);
if (config.format == FORMAT_MBOX)
fgets (buffer, BUFSIZ, mp->fp);
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
gzgets (mp->fp, buffer, BUFSIZ);
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
{
char c[1] = "\0";
int n = 0;
while (c[0] != '\n' && n < BUFSIZ)
{
BZ2_bzread (mp->fp, c, 1);
buffer[n] = c[0];
n++;
}
buffer[n] = '\0';
}
#endif /* HAVE_LIBBZ2 */
if (0 != strncmp ("From ", buffer, 5))
{
if ((config.merr) && (buffer[0] != '\0'))
{
if (0 == strcmp ("-", path))
fprintf (stderr, "%s: (standard input): Not an mbox folder\n",
APPNAME);
else
fprintf (stderr, "%s: %s: Not an mbox folder\n", APPNAME,
path);
}
if (config.format == FORMAT_MBOX)
fclose (mp->fp);
#ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX)
gzclose (mp->fp);
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX)
BZ2_bzclose (mp->fp);
#endif /* HAVE_LIBBZ2 */
return NULL;
}
return buffer;
}

View File

@@ -1,6 +1,6 @@
/*
mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000 - 2004, 2023 Daniel Spiljar
Copyright (C) 2000 - 2004, 2023 - 2024 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@@ -19,9 +19,7 @@
#ifndef MBOX_H
# define MBOX_H 1
# include <config.h>
# include "message.h"
typedef struct
@@ -31,8 +29,14 @@ typedef struct
char *postmark_cache;
} mbox_t;
typedef enum
{
r,
w,
} mbox_mode_t;
mbox_t *mbox_open (const char *path, const char *mode);
mbox_t *mbox_open (const char *path, const mbox_mode_t mbox_mode);
void tmpmbox_create (const char *path);
void tmpfile_name (const char *path);
void tmpfile_mod_own (const int fd, const char *path);
@@ -40,5 +44,8 @@ int tmpfile_create (void);
void mbox_close (mbox_t * mbp);
message_t *mbox_read_message (mbox_t * mp);
void mbox_write_message (message_t * m, mbox_t * mbox);
void mbox_lock (int fd, const char *path, const mbox_mode_t mbox_mode);
void *mbox_fdopen (int fd, const char *path, const mbox_mode_t mbox_mode);
char *mbox_check_postmark(mbox_t *mp, const char *path);
#endif /* MBOX_H */

View File

@@ -1,6 +1,6 @@
/*
mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000 - 2003, 2006, 2023 Daniel Spiljar
Copyright (C) 2000 - 2003, 2006, 2023 - 2024 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@@ -21,8 +21,8 @@
#define MBOXGREP_H
#define APPNAME "mboxgrep"
#define VERSION "0.7.11"
#define BUGREPORT_ADDR "dspiljar AT datatipp.se"
#define VERSION "0.7.13"
#define BUGREPORT_ADDR "dspiljar@datatipp.se"
#define HOST_NAME_SIZE 256
@@ -120,7 +120,7 @@ typedef struct
char hostname[HOST_NAME_SIZE];
char *boxname, *outboxname, *pipecmd, *tmpfilename, *regex_s;
void *pcre_pattern, *pcre_hints, *posix_pattern;
void *pcre_pattern, *posix_pattern, *match_data;
int res1, res2;
action_t action;

View File

@@ -24,19 +24,12 @@
# include <config.h>
#endif
#include <sys/types.h>
#if STDC_HEADERS || defined _LIBC
# include <stdlib.h>
# include <string.h>
#else
# ifndef HAVE_MEMCPY
# define memcpy(d, s, n) bcopy ((s), (d), (n))
# endif
#endif
#include "md5.h"
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#ifdef _LIBC
# include <endian.h>
# if __BYTE_ORDER == __BIG_ENDIAN
@@ -69,8 +62,7 @@ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
/* Initialize structure containing state of computation.
(RFC 1321, 3.3: Step 3) */
void
md5_init_ctx (ctx)
struct md5_ctx *ctx;
md5_init_ctx (struct md5_ctx *ctx)
{
ctx->A = 0x67452301;
ctx->B = 0xefcdab89;
@@ -87,9 +79,7 @@ md5_init_ctx (ctx)
IMPORTANT: On some systems it is required that RESBUF is correctly
aligned for a 32 bits value. */
void *
md5_read_ctx (ctx, resbuf)
const struct md5_ctx *ctx;
void *resbuf;
md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
{
((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
@@ -105,9 +95,7 @@ md5_read_ctx (ctx, resbuf)
IMPORTANT: On some systems it is required that RESBUF is correctly
aligned for a 32 bits value. */
void *
md5_finish_ctx (ctx, resbuf)
struct md5_ctx *ctx;
void *resbuf;
md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
{
/* Take yet unprocessed bytes into account. */
md5_uint32 bytes = ctx->buflen;
@@ -136,9 +124,7 @@ md5_finish_ctx (ctx, resbuf)
resulting message digest number will be written into the 16 bytes
beginning at RESBLOCK. */
int
md5_stream (stream, resblock)
FILE *stream;
void *resblock;
md5_stream (FILE *stream, void *resblock)
{
/* Important: BLOCKSIZE must be a multiple of 64. */
#define BLOCKSIZE 4096
@@ -193,10 +179,7 @@ md5_stream (stream, resblock)
output yields to the wanted ASCII representation of the message
digest. */
void *
md5_buffer (buffer, len, resblock)
const char *buffer;
size_t len;
void *resblock;
md5_buffer (const char *buffer, size_t len, void *resblock)
{
struct md5_ctx ctx;
@@ -212,10 +195,7 @@ md5_buffer (buffer, len, resblock)
void
md5_process_bytes (buffer, len, ctx)
const void *buffer;
size_t len;
struct md5_ctx *ctx;
md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
{
//const void aligned_buffer = buffer;
@@ -285,10 +265,7 @@ md5_process_bytes (buffer, len, ctx)
It is assumed that LEN % 64 == 0. */
void
md5_process_block (buffer, len, ctx)
const void *buffer;
size_t len;
struct md5_ctx *ctx;
md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
{
md5_uint32 correct_words[16];
const md5_uint32 *words = buffer;

View File

@@ -22,10 +22,7 @@
#define _MD5_H 1
#include <stdio.h>
#if defined HAVE_LIMITS_H || _LIBC
# include <limits.h>
#endif
#include <limits.h>
/* The following contortions are an attempt to use the C preprocessor
to determine an unsigned integral type that is 32 bits wide. An
@@ -38,20 +35,7 @@
# include <sys/types.h>
typedef u_int32_t md5_uint32;
#else
# if defined __STDC__ && __STDC__
# define UINT_MAX_32_BITS 4294967295U
# else
# define UINT_MAX_32_BITS 0xFFFFFFFF
# endif
/* If UINT_MAX isn't defined, assume it's a 32-bit type.
This should be valid for all systems GNU cares about because
that doesn't include 16-bit systems, and only modern systems
(that certainly have <limits.h>) have 64+-bit integral types. */
# ifndef UINT_MAX
# define UINT_MAX UINT_MAX_32_BITS
# endif
#define UINT_MAX_32_BITS 4294967295U
# if UINT_MAX == UINT_MAX_32_BITS
typedef unsigned int md5_uint32;

View File

@@ -373,7 +373,7 @@ set_option_regextype (regextype_t regextype)
exit (2);
}
#ifndef HAVE_LIBPCRE
#ifndef HAVE_LIBPCRE2
if (regextype == REGEX_PERL);
{
fprintf (stderr,
@@ -381,6 +381,6 @@ set_option_regextype (regextype_t regextype)
APPNAME);
exit (2);
}
#endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
config.regextype = regextype;
}

View File

@@ -21,52 +21,58 @@
#include <stdio.h>
#include <string.h>
#include <regex.h>
#ifdef HAVE_LIBPCRE
# include <pcre.h>
#endif /* HAVE_LIBPCRE */
#ifdef HAVE_LIBPCRE2
# define PCRE2_CODE_UNIT_WIDTH 32
# include <pcre2.h>
#endif /* HAVE_LIBPCRE2 */
#include "mboxgrep.h"
#include "message.h"
#include "wrap.h" /* xcalloc() et cetera */
#ifdef HAVE_LIBPCRE
#ifdef HAVE_LIBPCRE2
void
pcre_init (void)
{
int errptr;
const char *error;
int errornumber;
PCRE2_SIZE erroroffset;
config.pcre_pattern =
(pcre *) pcre_compile (config.regex_s,
(config.ignorecase ? PCRE_CASELESS : 0),
&error, &errptr, NULL);
(pcre2_code *) pcre2_compile ((PCRE2_SPTR) config.regex_s, (PCRE2_SIZE) strlen (config.regex_s),
(config.ignorecase ? PCRE2_CASELESS : 0),
&errornumber, &erroroffset, NULL);
if (config.pcre_pattern == NULL)
{
if (config.merr)
fprintf (stderr, "%s: %s: %s\n", APPNAME, config.regex_s, error);
{
PCRE2_UCHAR buffer[256];
pcre2_get_error_message (errornumber, buffer, sizeof(buffer));
fprintf (stderr, "%s: PCRE2 compilation failed at offset %d: %s\n",
APPNAME, (int) erroroffset, (char *) buffer);
}
exit (2);
}
config.match_data =
(pcre2_match_data* ) pcre2_match_data_create_from_pattern (config.pcre_pattern, NULL);
}
void
pcre_match (message_t * msg)
{
int of[BUFSIZ];
if (config.headers)
config.res1 =
pcre_exec ((pcre *) config.pcre_pattern,
(pcre_extra *) config.pcre_hints,
msg->headers, (int) strlen (msg->headers), 0, 0, of, BUFSIZ);
pcre2_match ((pcre2_code *) config.pcre_pattern,
(PCRE2_SPTR) msg->headers, (int) strlen (msg->headers), 0, 0, config.match_data, NULL);
if (config.body)
config.res2 =
pcre_exec ((pcre *) config.pcre_pattern,
(pcre_extra *) config.pcre_hints,
msg->body, (int) strlen (msg->body), 0, 0, of, BUFSIZ);
pcre2_match ((pcre2_code *) config.pcre_pattern,
(PCRE2_SPTR) msg->body, (int) strlen (msg->body), 0, 0, config.match_data, NULL);
config.res1 = config.res1 ^ 1;
config.res2 = config.res2 ^ 1;
}
#endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
void
regex_init (void)

View File

@@ -19,9 +19,9 @@
#include "mboxgrep.h"
#ifdef HAVE_LIBPCRE
#ifdef HAVE_LIBPCRE2
void pcre_init (void);
void pcre_match (message_t * msg);
#endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
void regex_init (void);
void regex_match (message_t * msg);

View File

@@ -1,6 +1,6 @@
/*
mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000 - 2004, 2006, 2023 Daniel Spiljar
Copyright (C) 2000 - 2004, 2006, 2023 - 2024 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
@@ -107,7 +107,7 @@ scan_mailbox (char path[])
if ((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX)
|| (config.format == FORMAT_BZ2MBOX))
{
mbox = (mbox_t *) mbox_open (path, "r");
mbox = (mbox_t *) mbox_open (path, r);
if (mbox == NULL)
return;
}
@@ -146,11 +146,11 @@ scan_mailbox (char path[])
if (msg->from == NULL)
msg->from = (char *) xstrdup ("nobody");
#ifdef HAVE_LIBPCRE
#ifdef HAVE_LIBPCRE2
if (config.regextype == REGEX_PERL)
pcre_match (msg);
else
#endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
regex_match (msg);
if (config.dedup)
@@ -179,7 +179,7 @@ scan_mailbox (char path[])
else if ((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX)
|| (config.format == FORMAT_BZ2MBOX))
{
out = mbox_open (config.outboxname, "w");
out = mbox_open (config.outboxname, w);
/* fprintf (out->fp, "%s\n%s", msg->headers, msg->body); */
mbox_write_message (msg, out);
mbox_close (out);