Compare commits

...

24 Commits

Author SHA1 Message Date
Daniel Spiljar 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
Daniel Spiljar 7255fae5d0
Bump the version to 0.7.12a. 2023-05-21 15:09:44 +02:00
Daniel Spiljar 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
Daniel Spiljar dd5fefe22d
Update the TODO list and bump the version to 0.7.12. 2023-05-20 20:34:23 +02:00
Daniel Spiljar cbba5c2a33
Remove config.h.in from the git repo, as it is autogenerated. 2023-05-20 20:09:23 +02:00
Daniel Spiljar 27082f9629
Minor updates of the documentation. 2023-05-18 13:43:09 +02:00
Daniel Spiljar d17f37b3c5
Include the contrib subdirectory in the distribution tarball. 2023-05-18 13:35:35 +02:00
Daniel Spiljar e004f116b7
Merge branch 'pcre2-port' 2023-05-17 19:40:41 +02:00
Daniel Spiljar e5409a897d
Port to the pcre2 library. 2023-05-17 17:58:59 +02:00
Daniel Spiljar 55aa25eca3
Add migration from pcre to pcre2 to the TODO list. 2023-05-08 22:54:58 +02:00
Daniel Spiljar 7ebef4a322
Fix a compile error caused by an extra curly bracket. 2023-04-22 17:36:28 +02:00
Daniel Spiljar d04349e9b4
Minor code cleanup and fix a compilation warning. 2023-04-19 23:04:57 +02:00
Daniel Spiljar c19253d080
Check command-line options for conflicting matchers and actions. 2023-04-19 21:55:25 +02:00
Daniel Spiljar 3040f9c363
Fix Automake macros. Remove autogenerated files from the git repo. 2023-03-28 00:59:16 +02:00
Daniel Spiljar 033063befc
Version bump to 0.7.11. 2023-03-24 15:18:53 +01:00
Daniel Spiljar 7720415afa
Updates to the news and installation instructions. 2023-03-24 15:00:06 +01:00
Daniel Spiljar 68c0ddee91
Merge branch 'automake' 2023-03-24 14:10:14 +01:00
Daniel Spiljar 53d3381cd4
Merge branch 'automake' of git.datatipp.se:dspiljar/mboxgrep into automake 2023-03-24 13:50:10 +01:00
Daniel Spiljar c02deefbd5
Utilize GNU Automake instead of manually written Makefile.in files. 2023-03-24 13:47:16 +01:00
Daniel Spiljar b7006b77b5
Utilize GNU Automake instead of manually written Makefile.in files. 2023-03-23 22:10:04 +01:00
Daniel Spiljar 43e7695eac
Update the basic documentation. 2023-03-08 15:19:20 +01:00
Daniel Spiljar 844dc84974
Ignore backup files. 2023-03-07 16:54:41 +01:00
Daniel Spiljar ee2489483b
Code cleanup and indentation.
C source files (with the exception of third-party files, i.e. getopt and
md5) have been indented with GNU indent.

The indentation "standard" has been documented in the readme file.
2023-03-07 16:51:33 +01:00
Daniel Spiljar 882a38f908
Refinement of the TODO list. 2023-03-01 20:53:15 +01:00
39 changed files with 12871 additions and 6585 deletions

13
.gitignore vendored
View File

@ -1,6 +1,19 @@
Makefile
config.h
config.h.in
config.log
config.status
src/*.o
src/*.c~
src/*.h~
src/mboxgrep
src/.deps/
src/stamp-h1
aclocal.m4
autom4te.cache/
Makefile.in
configure
compile
depcomp
install-sh
missing

View File

26
INSTALL.md Normal file
View File

@ -0,0 +1,26 @@
# Compilation and installation of mboxgrep
`mboxgrep` should compile on a modern Unix-like operating system, such as GNU/Linux or FreeBSD.
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:
```
./configure --help
```
Optionally, `mboxgrep` can be linked with the following libraries:
- PCRE2, to enable support for regular expressions compatible with Perl 5;
- zlib and bzlib, to enable support for compressed mbox folders.

2
Makefile.am Normal file
View File

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

View File

@ -1,37 +0,0 @@
# mboxgrep - scan mailbox for messages matching a regular expression
# Copyright (C) 2000, 01 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Mboxgrep 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 mboxgrep; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# $Id: Makefile.in,v 1.1 2001-10-26 13:07:28 dspiljar Exp $
SHELL = /bin/sh
all:
cd src; $(MAKE)
clean:
cd src; $(MAKE) clean
distclean:
rm -f *~ Makefile config.status config.log config.cache
cd src; $(MAKE) distclean
cd doc; $(MAKE) distclean
install:
cd src; $(MAKE) install
cd doc; $(MAKE) install
.NOEXPORT:

15
NEWS.md
View File

@ -1,5 +1,20 @@
# Changes of mboxgrep
## Changes since 0.7.12
- Fix Automake macros to include the license file and others.
## Changes since 0.7.11
- Port to the pcre2 library (pcre1 is no longer supported).
- Check command-line options for conflicting matchers and actions.
- Various minor code cleanups.
## Changes since 0.7.10
- 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
- development has been restarted after a longer hiatus

View File

@ -1,4 +1,7 @@
mboxgrep - displays e-mail messages matching a pattern
# mboxgrep - selects e-mail messages matching a pattern
`mboxgrep` is a `grep(1)`-like tool which scans mailboxes and selects
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
@ -11,5 +14,8 @@ are welcome.
If you intend to bundle mboxgrep with an operating system (such as a
GNU/Linux distrubution, for example), please drop me a line about it.
For build instructions, read the file "INSTALL", and run
For build instructions, read the file `INSTALL.md`, and run
`./configure --help`.
This project aims to follow the [GNU coding style](https://www.gnu.org/prep/standards/html_node/Formatting.html),
at least loosely. The code should be indented with `indent -gnu -nut -ppi2`.

10
TODO.md
View File

@ -3,27 +3,31 @@
## Behavior
- [x] use cryptographic hashes for detecting duplicate messages
- [ ] add checking for conflicting command-line options
- [x] add checking for conflicting command-line options
- [ ] support for deletion of messages after being matched and displayed
- [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
- [ ] literal date matching
- [ ] 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
## File formats, encodings and standards
- [x] migrate to pcre2, as pcre is obsolete
- [ ] 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
- [ ] use a more modern hash function than MD5
- [ ] improve error detection when a directory is not a Maildir or MH folder
- [ ] document criteria for folder format detection
## Miscellaneous

5274
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
# mboxgrep - scan mailbox for messages matching a regular expression
# Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar
# Copyright (C) 2000 - 2003, 2023 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
@ -15,13 +15,13 @@
# along with mboxgrep; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# $Id: configure.ac,v 1.13 2003-08-10 22:45:45 dspiljar Exp $
# Process this file with autoconf to produce a configure script.
# Yawn.
AC_INIT
AC_LANG(C)
AC_INIT([mboxgrep], [0.7.12a], [dspiljar@datatipp.se], [mboxgrep], [https://www.mboxgrep.org/])
#AM_INIT_AUTOMAKE
AM_INIT_AUTOMAKE([foreign])
AC_LANG([C])
AC_CONFIG_HEADER([src/config.h])
# Checks for programs.
@ -34,34 +34,35 @@ 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
]
)

2
doc/Makefile.am Normal file
View File

@ -0,0 +1,2 @@
dist_man_MANS = mboxgrep.1
info_TEXINFOS = mboxgrep.texi

View File

@ -1,41 +0,0 @@
# mboxgrep - search mailbox for messages matching a regular expression
# Copyright (C) 2000, 01 Daniel Spiljar
#
# This program 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 2 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# $Id: Makefile.in,v 1.1 2001-10-26 13:07:55 dspiljar Exp $
MANPAGE = mboxgrep.1
INSTALL = @INSTALL@
prefix = @prefix@
mandir = @mandir@
infodir = @infodir@
SHELL = /bin/sh
.PHONY: all
all:
.PHONY: distclean
distclean:
rm -f *~ Makefile
.PHONY: install
install: mboxgrep.1
$(INSTALL) -d $(mandir)/man1
$(INSTALL) -m 0644 $(MANPAGE) $(mandir)/man1
$(INSTALL) -d $(infodir)
$(INSTALL) -m 0644 mboxgrep.info $(infodir)
.NOEXPORT:

View File

@ -1,4 +1,4 @@
.TH MBOXGREP 1 "17 Feb 2023"
.TH MBOXGREP 1 "21 May 2023"
.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.10 .
.BR 0.7.12a .
.PP
.B mboxgrep
scans a
@ -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"

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,7 +9,7 @@ END-INFO-DIR-ENTRY

File: mboxgrep.info, Node: Top, Up: (dir)
This file documents 'mboxgrep' (version 0.7.10), a mailbox scanning
This file documents 'mboxgrep' (version 0.7.12a), a mailbox scanning
utility.
Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar
@ -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: Introduction597
Node: Invoking1466
Node: Miscellaneous1828
Node: File locking2113
Node: Regexp selection2750
Node: Output control3302
Node: Search scope selection4342
Node: Mailbox type selection4583
Node: Examples4904
Node: Bugs5728
Node: To Vicky6146

End Tag Table

View File

@ -5,8 +5,8 @@
@setchapternewpage odd
@set EDITION 0.7
@set VERSION 0.7.10
@set UPDATED 17 Feb 2023
@set VERSION 0.7.12a
@set UPDATED 21 May 2023
@dircategory Mail
@direntry
@ -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.

11772
doc/texinfo.tex Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,251 +0,0 @@
#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
transformbasename=""
transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=""
chgrpcmd=""
stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""
while [ x"$1" != x ]; do
case $1 in
-c) instcmd="$cpprog"
shift
continue;;
-d) dir_arg=true
shift
continue;;
-m) chmodcmd="$chmodprog $2"
shift
shift
continue;;
-o) chowncmd="$chownprog $2"
shift
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
-s) stripcmd="$stripprog"
shift
continue;;
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
shift
continue;;
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
shift
continue;;
*) if [ x"$src" = x ]
then
src=$1
else
# this colon is to work around a 386BSD /bin/sh bug
:
dst=$1
fi
shift
continue;;
esac
done
if [ x"$src" = x ]
then
echo "install: no input file specified"
exit 1
else
true
fi
if [ x"$dir_arg" != x ]; then
dst=$src
src=""
if [ -d $dst ]; then
instcmd=:
chmodcmd=""
else
instcmd=mkdir
fi
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f $src -o -d $src ]
then
true
else
echo "install: $src does not exist"
exit 1
fi
if [ x"$dst" = x ]
then
echo "install: no destination specified"
exit 1
else
true
fi
# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic
if [ -d $dst ]
then
dst="$dst"/`basename $src`
else
true
fi
fi
## this sed command emulates the dirname command
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# this part is taken from Noah Friedman's mkinstalldirs script
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
defaultIFS='
'
IFS="${IFS-${defaultIFS}}"
oIFS="${IFS}"
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS="${oIFS}"
pathcomp=''
while [ $# -ne 0 ] ; do
pathcomp="${pathcomp}${1}"
shift
if [ ! -d "${pathcomp}" ] ;
then
$mkdirprog "${pathcomp}"
else
true
fi
pathcomp="${pathcomp}/"
done
fi
if [ x"$dir_arg" != x ]
then
$doit $instcmd $dst &&
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
else
# If we're going to rename the final executable, determine the name now.
if [ x"$transformarg" = x ]
then
dstfile=`basename $dst`
else
dstfile=`basename $dst $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
if [ x"$dstfile" = x ]
then
dstfile=`basename $dst`
else
true
fi
# Make a temp file name in the proper directory.
dsttmp=$dstdir/#inst.$$#
# Move or copy the file name to the temp name
$doit $instcmd $src $dsttmp &&
trap "rm -f ${dsttmp}" 0 &&
# and set any options; do chmod last to preserve setuid bits
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
# Now rename the file to the real destination.
$doit $rmcmd -f $dstdir/$dstfile &&
$doit $mvcmd $dsttmp $dstdir/$dstfile
fi &&
exit 0

6
src/Makefile.am Normal file
View File

@ -0,0 +1,6 @@
bin_PROGRAMS = mboxgrep
mboxgrep_SOURCES = info.c info.h maildir.c maildir.h main.c mbox.c mbox.h \
mboxgrep.h md5.c md5.h message.h misc.c misc.h mh.c mh.h \
getopt.c getopt1.c getopt.h re.c re.h scan.c scan.h wrap.c wrap.h
mboxgrep_LDADD = $(LIBOBJS)

View File

@ -1,57 +0,0 @@
# mboxgrep - scan mailbox for messages matching a regular expression
# Copyright (C) 2000, 2001, 2002, 2003, 2006 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Mboxgrep 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 mboxgrep; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# $Id: Makefile.in,v 1.12 2006-07-07 04:38:53 dspiljar Exp $
srcdir = @srcdir@
CC = @CC@
OBJS = info.o main.o mh.o scan.o maildir.o mbox.o misc.o \
wrap.o getopt.o getopt1.o md5.o re.o
SRCS = info.c main.c mh.c scan.c maildir.c mbox.c misc.c \
wrap.c getopt.c getopt1.c md5.c re.c
TARGET = mboxgrep
CFLAGS = @CFLAGS@
LIBS = @LIBS@
INSTALL = @INSTALL@
prefix = @prefix@
SHELL = /bin/sh
INCLUDES = -I. -I$(srcdir)
.SUFFIXES:
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $<
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJS) core
.PHONY: distclean
distclean:
rm -f *~ Makefile config.h
.PHONY: install
install: mboxgrep
$(INSTALL) -d $(prefix)/bin
$(INSTALL) -s $(TARGET) $(prefix)/bin
.NOEXPORT:

View File

@ -1,67 +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
/* 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 version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS

View File

@ -22,149 +22,152 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mboxgrep.h"
void
print_wrap (char *str, int len, int *n)
print_wrap (char *str)
{
*n += len;
static int n = 0;
n += strlen (str);
fprintf (stdout, "%s", str);
if (*n >= 50)
if (n >= 50)
{
fprintf (stdout, "\n");
*n = 0;
n = 0;
}
else fprintf (stdout, " ");
else
fprintf (stdout, " ");
}
void
version (void)
{
int n = 0;
fprintf (stdout, "%s %s\n\n"
"Copyright (C) 2000 - 2004, 2006, 2010, 2023 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 "
"2 of the License, or\n(at your option) any later version.\n\n",
APPNAME, VERSION);
"Copyright (C) 2000 - 2004, 2006, 2010, 2023 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 "
"2 of the License, or\n(at your option) any later version.\n\n",
APPNAME, VERSION);
fprintf (stdout, "Compilation options:\n");
#ifdef HAVE_DIRENT_H
print_wrap ("HAVE_DIRENT_H", 13, &n);
print_wrap ("HAVE_DIRENT_H");
#endif /* HAVE_DIRENT_H */
#ifdef HAVE_FCNTL
print_wrap ("HAVE_FCNTL", 10, &n);
print_wrap ("HAVE_FCNTL");
#endif /* HAVE_FCNTL */
#ifdef HAVE_FLOCK
print_wrap ("HAVE_FLOCK", 10, &n);
print_wrap ("HAVE_FLOCK");
#endif /* HAVE_FLOCK */
#ifdef HAVE_FTS_OPEN
print_wrap ("HAVE_FTS_OPEN", 13, &n);
print_wrap ("HAVE_FTS_OPEN");
#else
# ifdef HAVE_FTW
print_wrap ("HAVE_FTW", 8, &n);
# endif /* HAVE_FTW */
# ifdef HAVE_FTW
print_wrap ("HAVE_FTW");
# endif
/* HAVE_FTW */
#endif /* HAVE_FTS_OPEN */
/*
fprintf (stdout, "HAVE_LIBLOCKFILE ");
*/
#ifdef HAVE_LIBPCRE
print_wrap ("HAVE_LIBPCRE", 12, &n);
#endif /* HAVE_LIBPCRE */
#ifdef HAVE_LIBPCRE2
print_wrap ("HAVE_LIBPCRE2");
#endif /* HAVE_LIBPCRE2 */
#ifdef HAVE_LIBZ
print_wrap ("HAVE_LIBZ", 9, &n);
print_wrap ("HAVE_LIBZ");
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
print_wrap ("HAVE_LIBBZ2", 11, &n);
print_wrap ("HAVE_LIBBZ2");
#endif /* HAVE_LIBBZ2 */
#ifdef HAVE_NDIR_H
print_wrap ("HAVE_NDIR_H", 11, &n);
print_wrap ("HAVE_NDIR_H");
#endif /* HAVE_NDIR_H */
#ifdef HAVE_SYS_DIR_H
print_wrap ("HAVE_SYS_DIR_H", 14, &n);
print_wrap ("HAVE_SYS_DIR_H");
#endif /* HAVE_SYS_DIR_H */
#ifdef HAVE_SYS_NDIR_H
print_wrap ("HAVE_SYS_NDIR_H", 15, &n);
print_wrap ("HAVE_SYS_NDIR_H");
#endif /* HAVE_SYS_NDIR_H */
#ifdef HAVE_STRPTIME
print_wrap ("HAVE_STRPTIME", 15, &n);
print_wrap ("HAVE_STRPTIME");
#endif /* HAVE_STRPTIME */
#ifdef HAVE_REGCOMP
print_wrap ("HAVE_REGCOMP", 15, &n);
print_wrap ("HAVE_REGCOMP");
#endif /* HAVE_REGCOMP */
#ifdef HAVE_LIBDMALLOC
print_wrap ("HAVE_LIBDMALLOC", 15, &n);
print_wrap ("HAVE_LIBDMALLOC");
#endif /* HAVE_LIBDMALLOC */
fprintf (stdout, "\n");
exit(0);
exit (0);
}
void
void
help (void)
{
fprintf(stdout, "%s %s - search MAILBOX for messages matching PATTERN\n\n",
APPNAME, VERSION);
fprintf(stdout,
"Miscellaneous:\n\n"
" -h, --help\t\t\tThis help screen\n"
" -V, --version\t\tDisplay version, copyright and\n"
"\t\t\t\tcompile-time options information\n"
" -r, --recursive\t\tDescend into directories recursively\n\n"
"Output control:\n\n"
" -c, --count\t\t\tPrint a count of matching messages\n"
" -d, --delete\t\t\tDelete matching messages\n"
" -nd, --no-duplicates\t\tIgnore duplicate messages\n"
" -o, --output=MAILBOX\t\tWrite messages to MAILBOX\n"
" -p, --pipe=COMMAND\t\tPipe each found message to COMMAND\n"
" -s, --no-messages\t\tSuppress most error messages\n"
" --debug\t\t\tPrint messages useful for debugging\n\n"
"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
fprintf(stdout,
" -P, --perl-regexp\t\tPATTERN is a Perl regular expression\n");
#endif /* HAVE_LIBPCRE */
fprintf(stdout,
" -e, --regexp=PATTERN\t\tUse PATTERN as a regular expression\n"
" -i, --ignore-case\t\tIgnore case distinctions\n"
" -v, --invert-match\t\tSelect non-matching messages\n\n"
"Search scope selection:\n\n"
" -H, --headers\t\tMatch PATTERN against message headers\n"
" -B, --body\t\t\tMatch PATTERN against message body\n\n"
"File locking:\n\n"
" -nl, --no-file-lock\t\tDo not lock files\n"
" -l, --file-lock=METHOD\tSelect file locking METHOD\n"
"\t\t\t\tMETHOD is");
fprintf (stdout, "%s %s - search MAILBOX for messages matching PATTERN\n\n",
APPNAME, VERSION);
fprintf (stdout,
"Miscellaneous:\n\n"
" -h, --help\t\t\tThis help screen\n"
" -V, --version\t\tDisplay version, copyright and\n"
"\t\t\t\tcompile-time options information\n"
" -r, --recursive\t\tDescend into directories recursively\n\n"
"Output control:\n\n"
" -c, --count\t\t\tPrint a count of matching messages\n"
" -d, --delete\t\t\tDelete matching messages\n"
" -nd, --no-duplicates\t\tIgnore duplicate messages\n"
" -o, --output=MAILBOX\t\tWrite messages to MAILBOX\n"
" -p, --pipe=COMMAND\t\tPipe each found message to COMMAND\n"
" -s, --no-messages\t\tSuppress most error messages\n"
" --debug\t\t\tPrint messages useful for debugging\n\n"
"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_LIBPCRE2
fprintf (stdout,
" -P, --perl-regexp\t\tPATTERN is a Perl regular expression\n");
#endif /* HAVE_LIBPCRE2 */
fprintf (stdout,
" -e, --regexp=PATTERN\t\tUse PATTERN as a regular expression\n"
" -i, --ignore-case\t\tIgnore case distinctions\n"
" -v, --invert-match\t\tSelect non-matching messages\n\n"
"Search scope selection:\n\n"
" -H, --headers\t\tMatch PATTERN against message headers\n"
" -B, --body\t\t\tMatch PATTERN against message body\n\n"
"File locking:\n\n"
" -nl, --no-file-lock\t\tDo not lock files\n"
" -l, --file-lock=METHOD\tSelect file locking METHOD\n"
"\t\t\t\tMETHOD is");
#ifdef HAVE_FCNTL
fprintf(stdout, " `fcntl',");
fprintf (stdout, " `fcntl',");
#endif /* HAVE_FCNTL */
#ifdef HAVE_FLOCK
fprintf(stdout, " `flock',");
fprintf (stdout, " `flock',");
#endif /* HAVE_FLOCK */
fprintf(stdout, " or `none'\n\n"
"Mailbox type selection:\n\n"
" -m, --mailbox-format=TYPE\tSelect mailbox TYPE\n"
"\t\t\t\tTYPE is `mbox', ");
fprintf (stdout, " or `none'\n\n"
"Mailbox type selection:\n\n"
" -m, --mailbox-format=TYPE\tSelect mailbox TYPE\n"
"\t\t\t\tTYPE is `mbox', ");
#ifdef HAVE_LIBZ
fprintf(stdout, "`zmbox', ");
fprintf (stdout, "`zmbox', ");
#endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2
fprintf(stdout, "`bz2mbox', ");
fprintf (stdout, "`bz2mbox', ");
#endif /* HAVE_LIBBZ2 */
fprintf(stdout,
"`mh',\n"
"\t\t\t\t`nnml', `nnmh', or `maildir'.\n\n"
"Mail bug reports and flames to <%s>.\n", BUGREPORT_ADDR);
fprintf (stdout,
"`mh',\n"
"\t\t\t\t`nnml', `nnmh', or `maildir'.\n\n"
"Mail bug reports and flames to <%s>.\n", BUGREPORT_ADDR);
exit(0);
exit (0);
}
void
void
usage (void)
{
printf ("Usage: %s [OPTION] PATTERN MAILBOX ...\n\n"

View File

@ -18,9 +18,9 @@
*/
#ifndef INFO_H
#define INFO_H
# define INFO_H
void print_wrap (char *str, int len, int *n);
void print_wrap (char *str);
void version (void);
void help (void);
void usage (void);

View File

@ -23,20 +23,23 @@
#include <string.h>
#ifdef HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif /* HAVE_SYS_NDIR_H */
# ifdef HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif /* HAVE_SYS_DIR_H */
# ifdef HAVE_NDIR_H
# include <ndir.h>
# endif /* HAVE_NDIR_H */
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
/* HAVE_SYS_NDIR_H */
# ifdef HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
/* HAVE_SYS_DIR_H */
# ifdef HAVE_NDIR_H
# include <ndir.h>
# endif
/* HAVE_NDIR_H */
#endif /* HAVE_DIRENT_H */
#include <stdlib.h>
@ -52,7 +55,7 @@
#include "wrap.h"
#ifdef HAVE_LIBDMALLOC
#include <dmalloc.h>
# include <dmalloc.h>
#endif /* HAVE_LIBDMALLOC */
maildir_t *
@ -64,20 +67,20 @@ maildir_open (const char *path)
foo = m_opendir (path);
if (foo == NULL)
return NULL;
return NULL;
closedir (foo);
if (-1 == maildir_check (path))
{
if (config.merr)
fprintf (stderr, "%s: %s: Not a maildir folder\n", APPNAME, path);
fprintf (stderr, "%s: %s: Not a maildir folder\n", APPNAME, path);
return NULL;
}
dirname = (char *) xmalloc((sizeof (char) * (strlen (path) + 5)));
dirname = (char *) xmalloc ((sizeof (char) * (strlen (path) + 5)));
mp = (maildir_t *) xmalloc(sizeof (maildir_t));
mp = (maildir_t *) xmalloc (sizeof (maildir_t));
sprintf (dirname, "%s/new", path);
mp->new = m_opendir (dirname);
if (mp->new == NULL)
@ -108,14 +111,14 @@ maildir_open (const char *path)
free (dirname);
return mp;
} /* maildir_open */
} /* maildir_open */
message_t *
maildir_read_message (maildir_t *mdp)
maildir_read_message (maildir_t * mdp)
{
int isheaders = 1;
int have_from = 0, have_to = 0, have_message_id = 0, have_sender = 0,
have_date = 0;
have_date = 0;
static message_t *message;
static struct dirent *d_content;
char *filename, buffer[BUFSIZ];
@ -124,9 +127,9 @@ maildir_read_message (maildir_t *mdp)
message = allocate_message ();
for(;;)
for (;;)
{
if (mdp->new != NULL)
if (mdp->new != NULL)
{
d_content = readdir (mdp->new);
if (d_content == NULL)
@ -155,9 +158,10 @@ maildir_read_message (maildir_t *mdp)
if (d_content->d_name[0] == '.')
continue;
filename =
(char *) xmalloc ((sizeof (char)*((strlen (d_content->d_name))
+ (strlen (config.boxname)) + 6)));
filename =
(char *) xmalloc ((sizeof (char) * ((strlen (d_content->d_name))
+ (strlen (config.boxname)) +
6)));
/*
filename =
@ -173,7 +177,7 @@ maildir_read_message (maildir_t *mdp)
free (filename);
isheaders = 1;
fp = m_fopen(message->filename, "r");
fp = m_fopen (message->filename, "r");
if (fp == NULL)
continue;
@ -185,7 +189,7 @@ maildir_read_message (maildir_t *mdp)
{
isheaders = 0;
continue;
} /* if */
} /* if */
if (isheaders)
{
if (0 == strncasecmp ("From: ", buffer, 6))
@ -199,43 +203,45 @@ maildir_read_message (maildir_t *mdp)
if (0 == strncasecmp ("Message-ID: ", buffer, 12))
have_message_id = 1;
if (0 == strncasecmp ("Return-Path: ", buffer, 13))
message->from = parse_return_path(buffer);
message->from = parse_return_path (buffer);
message->headers =
(char *) xrealloc (message->headers,
((1 + s + message->hbytes) * sizeof (char)));
((1 + s +
message->hbytes) * sizeof (char)));
strcpy (message->headers + message->hbytes, buffer);
message->hbytes += s;
} /* if */
} /* if */
else
{
message->body =
(char *) xrealloc (message->body,
((1 + s + message->bbytes) * sizeof (char)));
((1 + s +
message->bbytes) * sizeof (char)));
strcpy (message->body + message->bbytes, buffer);
message->bbytes += s;
} /* else */
} /* while */
} /* else */
} /* while */
/* if (!have_from || !have_to || !have_message_id) */
if ((!have_from && !have_sender)|| !have_date)
if ((!have_from && !have_sender) || !have_date)
{
if (config.merr)
fprintf(stderr, "%s: %s: Not a RFC 2822 message\n",
APPNAME, message->filename);
fclose(fp);
fprintf (stderr, "%s: %s: Not a RFC 2822 message\n",
APPNAME, message->filename);
fclose (fp);
continue;
}
fclose(fp);
return message;
} /* for */
} /* maildir_read_message */
void
maildir_write_message (message_t *m, const char *path)
fclose (fp);
return message;
} /* for */
} /* maildir_read_message */
void
maildir_write_message (message_t * m, const char *path)
{
char bla[BUFSIZ], *s1, *s2;
int t;
@ -245,11 +251,11 @@ maildir_write_message (message_t *m, const char *path)
t = (int) time (NULL);
sprintf (bla, "%i.%i_%i.%s",
t, config.pid, runtime.maildir_count, config.hostname);
t, config.pid, runtime.maildir_count, config.hostname);
s1 = (char *) xmalloc ((strlen (path) + strlen (bla) + 6) * sizeof (char));
sprintf(s1, "%s/tmp/%s", path, bla);
sprintf (s1, "%s/tmp/%s", path, bla);
s2 = (char *) xmalloc ((strlen (path) + strlen (bla) + 6) * sizeof (char));
sprintf(s2, "%s/new/%s", path, bla);
sprintf (s2, "%s/new/%s", path, bla);
f1 = m_fopen (s1, "w");
fprintf (f1, "%s\n%s", m->headers, m->body);
@ -257,7 +263,7 @@ maildir_write_message (message_t *m, const char *path)
rename (s1, s2);
}
int
int
maildir_check (const char *path)
{
static struct stat fs;
@ -268,48 +274,54 @@ maildir_check (const char *path)
sprintf (s, "%s/cur", path);
i = stat (s, &fs);
if (-1 == i) return -1;
if (! S_ISDIR (fs.st_mode)) return -1;
if (-1 == i)
return -1;
if (!S_ISDIR (fs.st_mode))
return -1;
sprintf (s, "%s/new", path);
i = stat (s, &fs);
if (-1 == i) return -1;
if (! S_ISDIR (fs.st_mode)) return -1;
if (-1 == i)
return -1;
if (!S_ISDIR (fs.st_mode))
return -1;
sprintf(s, "%s/tmp", path);
sprintf (s, "%s/tmp", path);
i = stat (s, &fs);
if (-1 == i) return -1;
if (! S_ISDIR (fs.st_mode)) return -1;
if (-1 == i)
return -1;
if (!S_ISDIR (fs.st_mode))
return -1;
free (s);
return 0;
}
void
void
maildir_create (const char *path)
{
char *s;
int i;
s = (char *) xmalloc ((strlen (path) + 4) * sizeof(char));
s = (char *) xmalloc ((strlen (path) + 4) * sizeof (char));
errno = 0;
for (;;)
{
sprintf(s, "%s", path);
i = mkdir (s, S_IRWXU);
if (-1 == i)
break;
sprintf(s, "%s/new", path);
sprintf (s, "%s", path);
i = mkdir (s, S_IRWXU);
if (-1 == i)
break;
sprintf(s, "%s/cur", path);
sprintf (s, "%s/new", path);
i = mkdir (s, S_IRWXU);
if (-1 == i)
break;
sprintf(s, "%s/tmp", path);
sprintf (s, "%s/cur", path);
i = mkdir (s, S_IRWXU);
if (-1 == i)
break;
sprintf (s, "%s/tmp", path);
i = mkdir (s, S_IRWXU);
if (-1 == i)
break;
@ -321,7 +333,7 @@ maildir_create (const char *path)
{
if (config.merr)
{
fprintf(stderr, "%s:%s: ", APPNAME, s);
fprintf (stderr, "%s:%s: ", APPNAME, s);
perror (NULL);
}
}

View File

@ -18,28 +18,32 @@
*/
#ifndef MAILDIR_H
#define MAILDIR_H
# define MAILDIR_H
#include <config.h>
# include <config.h>
#ifdef HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h>