Compare commits

..

No commits in common. "master" and "0.7.10" have entirely different histories.

39 changed files with 6585 additions and 12871 deletions

13
.gitignore vendored
View File

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

0
INSTALL Normal file
View File

View File

@ -1,26 +0,0 @@
# 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.

View File

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

37
Makefile.in Normal file
View File

@ -0,0 +1,37 @@
# 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,20 +1,5 @@
# Changes of mboxgrep # 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 ## Changes since 0.7.9
- development has been restarted after a longer hiatus - development has been restarted after a longer hiatus

View File

@ -1,7 +1,4 @@
# mboxgrep - selects e-mail messages matching a pattern mboxgrep - displays 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, Full description of mboxgrep is contained in the documentation,
which is provided both in manpage and texinfo format, to satisfy which is provided both in manpage and texinfo format, to satisfy
@ -14,8 +11,5 @@ are welcome.
If you intend to bundle mboxgrep with an operating system (such as a 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. GNU/Linux distrubution, for example), please drop me a line about it.
For build instructions, read the file `INSTALL.md`, and run For build instructions, read the file "INSTALL", and run
`./configure --help`. `./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,31 +3,27 @@
## Behavior ## Behavior
- [x] use cryptographic hashes for detecting duplicate messages - [x] use cryptographic hashes for detecting duplicate messages
- [x] add checking for conflicting command-line options - [ ] add checking for conflicting command-line options
- [ ] support for deletion of messages after being matched and displayed - [ ] support for deletion of messages after being matched and displayed
- [x] ignore .overview when grepping Gnus folders - [x] ignore .overview when grepping Gnus folders
- [x] inverted matching - [x] inverted matching
- [x] recursive search through directories - [x] recursive search through directories
- [x] writing selected messages to a new folder - [x] writing selected messages to a new folder
- [x] deleting selected messages - [x] deleting selected messages
- [ ] basic time and date matching - [ ] literal date matching
- [ ] more advanced time and date matching, with strings such as "yesterday"
- [x] reading messages from standard input - [x] reading messages from standard input
- [x] run-time selection of file locking method - [x] run-time selection of file locking method
- [x] add a debug function - [x] add a debug function
## File formats, encodings and standards ## File formats, encodings and standards
- [x] migrate to pcre2, as pcre is obsolete
- [ ] use a more modern hash function than MD5
- [ ] MIME support - [ ] MIME support
- [ ] support for GnuPG - [ ] support for GnuPG
- [x] support for compressed mbox folders - [x] support for compressed mbox folders
- [x] support for bzip2 compression - [x] support for bzip2 compression
- [ ] support for XZ-format compression - [ ] support for XZ-format compression
- [ ] support for mail folder conversion - [ ] support for mail folder conversion
- [ ] improve error detection when a directory is not a Maildir or MH folder - [ ] use a more modern hash function than MD5
- [ ] document criteria for folder format detection
## Miscellaneous ## Miscellaneous

5274
configure vendored Executable file

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 # mboxgrep - scan mailbox for messages matching a regular expression
# Copyright (C) 2000 - 2003, 2023 Daniel Spiljar # Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar
# #
# Mboxgrep is free software; you can redistribute it and/or modify it # Mboxgrep is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # 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, # along with mboxgrep; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # 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. # Process this file with autoconf to produce a configure script.
# Yawn. # Yawn.
AC_INIT([mboxgrep], [0.7.12a], [dspiljar@datatipp.se], [mboxgrep], [https://www.mboxgrep.org/]) AC_INIT
#AM_INIT_AUTOMAKE AC_LANG(C)
AM_INIT_AUTOMAKE([foreign])
AC_LANG([C])
AC_CONFIG_HEADER([src/config.h]) AC_CONFIG_HEADER([src/config.h])
# Checks for programs. # Checks for programs.
@ -34,35 +34,34 @@ AC_HEADER_DIRENT
# Checks for libraries. # Checks for libraries.
# Check for PCRE2 library # Check for PCRE library
AC_ARG_WITH(pcre2, [ --without-pcre2 Compile without Perl regexp support],, AC_ARG_WITH(pcre, [ --without-pcre Compile without Perl regexp support],,
[ [
AC_PATH_PROG(PCRE2_CONFIG, pcre2-config) AC_PATH_PROG(PCRE_CONFIG, pcre-config)
if test "$PCRE2_CONFIG"; then if test "$PCRE_CONFIG"; then
CFLAGS="$CFLAGS `$PCRE2_CONFIG --cflags`" CFLAGS="$CFLAGS `$PCRE_CONFIG --cflags`"
LIBS="$LIBS `$PCRE2_CONFIG --libs32`" LIBS="$LIBS `$PCRE_CONFIG --libs`"
AC_LINK_IFELSE( AC_LINK_IFELSE(
[ [
#define PCRE2_CODE_UNIT_WIDTH 32 #include <pcre.h>
#include <pcre2.h>
int main () int main ()
{ {
return 0; return 0;
} }
], ],
AC_DEFINE(HAVE_LIBPCRE2), AC_DEFINE(HAVE_LIBPCRE),
[ [
AC_MSG_NOTICE(found pcre2-config but could not compile test program.) AC_MSG_NOTICE(found pcre-config but could not compile test program.)
AC_MSG_FAILURE(is PCRE2 properly installed?) AC_MSG_FAILURE(is PCRE properly installed?)
] ]
) )
else else
AC_MSG_NOTICE(pcre2-config not found) AC_MSG_NOTICE(pcre-config not found)
AC_MSG_NOTICE(trying to find PCRE2 anyway) AC_MSG_NOTICE(trying to find PCRE anyway)
AC_CHECK_LIB(pcre2, main) AC_CHECK_LIB(pcre, main)
fi fi
] ]
) )

View File

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

41
doc/Makefile.in Normal file
View File

@ -0,0 +1,41 @@
# 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 "21 May 2023" .TH MBOXGREP 1 "17 Feb 2023"
.SH NAME .SH NAME
mboxgrep \- displays email messages matching a pattern mboxgrep \- displays email messages matching a pattern
.SH SYNOPSIS .SH SYNOPSIS
@ -10,7 +10,7 @@ mboxgrep \- displays email messages matching a pattern
This manual page refers to This manual page refers to
.B mboxgrep .B mboxgrep
version version
.BR 0.7.12a . .BR 0.7.10 .
.PP .PP
.B mboxgrep .B mboxgrep
scans a scans a
@ -72,8 +72,8 @@ Do not lock files. This option is meaningful only if a mbox folder (see below)
is scanned. is scanned.
.IP "-c, --count" .IP "-c, --count"
Suppress normal output and print a count of matching messages. Suppress normal output and print a count of matching messages.
.IP "-o, --output=MAILBOX" .IP "-o, --output=FOLDER"
Suppress normal output and write messages to destination MAILBOX instead. Suppress normal output and write messages to destination folder FOLDER instead.
.IP "-p, --pipe=COMMAND" .IP "-p, --pipe=COMMAND"
Pipe each found message to COMMAND Pipe each found message to COMMAND
.IP "-d, --delete" .IP "-d, --delete"

View File

@ -1,4 +1,4 @@
This is mboxgrep.info, produced by makeinfo version 6.8 from This is mboxgrep.info, produced by makeinfo version 6.7 from
mboxgrep.texi. mboxgrep.texi.
INFO-DIR-SECTION Mail INFO-DIR-SECTION Mail
@ -9,7 +9,7 @@ END-INFO-DIR-ENTRY
 
File: mboxgrep.info, Node: Top, Up: (dir) File: mboxgrep.info, Node: Top, Up: (dir)
This file documents 'mboxgrep' (version 0.7.12a), a mailbox scanning This file documents 'mboxgrep' (version 0.7.10), a mailbox scanning
utility. utility.
Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar Copyright (C) 2000, 2001, 2002, 2003 Daniel Spiljar
@ -151,10 +151,10 @@ options below change such behavior.
'-nd' '-nd'
Ignore duplicate messages. Ignore duplicate messages.
'--output=MAILBOX' '--output=FOLDER'
'-o MAILBOX' '-o FOLDER'
Suppress normal output and write messages to destination MAILBOX Suppress normal output and write messages to destination folder
instead. FOLDER instead.
Note that 'mboxgrep' assumes the output folder is of the same Note that 'mboxgrep' assumes the output folder is of the same
format as the input folder. Currently there is no possibility to format as the input folder. Currently there is no possibility to
@ -250,17 +250,17 @@ Sleep well, little friend.
 
Tag Table: Tag Table:
Node: Top197 Node: Top197
Node: Introduction597 Node: Introduction596
Node: Invoking1466 Node: Invoking1465
Node: Miscellaneous1828 Node: Miscellaneous1827
Node: File locking2113 Node: File locking2112
Node: Regexp selection2750 Node: Regexp selection2749
Node: Output control3302 Node: Output control3301
Node: Search scope selection4342 Node: Search scope selection4345
Node: Mailbox type selection4583 Node: Mailbox type selection4586
Node: Examples4904 Node: Examples4907
Node: Bugs5728 Node: Bugs5731
Node: To Vicky6146 Node: To Vicky6149
 
End Tag Table End Tag Table

View File

@ -5,8 +5,8 @@
@setchapternewpage odd @setchapternewpage odd
@set EDITION 0.7 @set EDITION 0.7
@set VERSION 0.7.12a @set VERSION 0.7.10
@set UPDATED 21 May 2023 @set UPDATED 17 Feb 2023
@dircategory Mail @dircategory Mail
@direntry @direntry
@ -171,9 +171,10 @@ Use with extreme caution.
@itemx -nd @itemx -nd
Ignore duplicate messages. Ignore duplicate messages.
@item --output=MAILBOX @item --output=FOLDER
@itemx -o MAILBOX @itemx -o FOLDER
Suppress normal output and write messages to destination MAILBOX instead. Suppress normal output and write messages to destination folder FOLDER
instead.
Note that @code{mboxgrep} assumes the output folder is of the same format 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. as the input folder. Currently there is no possibility to convert folders.

File diff suppressed because it is too large Load Diff

251
install-sh Executable file
View File

@ -0,0 +1,251 @@
#!/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

View File

@ -1,6 +0,0 @@
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)

57
src/Makefile.in Normal file
View File

@ -0,0 +1,57 @@
# 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:

67
src/config.h.in Normal file
View File

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

View File

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

View File

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

View File

@ -18,32 +18,28 @@
*/ */
#ifndef MAILDIR_H #ifndef MAILDIR_H
# define MAILDIR_H #define MAILDIR_H
# include <config.h> #include <config.h>
# ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name) # define NAMLEN(dirent) strlen((dirent)->d_name)
# else #else
# define dirent direct # define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen # define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h> # include <sys/ndir.h>
# endif # endif /* HAVE_SYS_NDIR_H */
/* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H
# ifdef HAVE_SYS_DIR_H # include <sys/dir.h>
# include <sys/dir.h> # endif /* HAVE_SYS_DIR_H */
# endif # ifdef HAVE_NDIR_H
/* HAVE_SYS_DIR_H */ # include <ndir.h>
# ifdef HAVE_NDIR_H # endif /* HAVE_NDIR_H */
# include <ndir.h> #endif /* HAVE_DIRENT_H */
# endif
/* HAVE_NDIR_H */
# endif
/* HAVE_DIRENT_H */
# include "mboxgrep.h" #include "mboxgrep.h"
typedef struct typedef struct
{ {
@ -54,8 +50,8 @@ typedef struct
maildir_t *maildir_open (const char *path); maildir_t *maildir_open (const char *path);
int maildir_check (const char *path); int maildir_check (const char *path);
void maildir_create (const char *path); void maildir_create (const char *path);
void maildir_close (maildir_t * mdp); void maildir_close (maildir_t *mdp);
message_t *maildir_read_message (maildir_t * mdp); message_t *maildir_read_message (maildir_t *mdp);
void maildir_write_message (message_t * m, const char *path); void maildir_write_message (message_t *m, const char *path);
#endif /* MAILDIR_H */ #endif /* MAILDIR_H */

View File

@ -24,8 +24,9 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
# include <zlib.h> #include <zlib.h>
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#include "getopt.h" #include "getopt.h"
@ -35,11 +36,11 @@
#include "mbox.h" #include "mbox.h"
#include "mh.h" #include "mh.h"
#include "scan.h" #include "scan.h"
#include "wrap.h" /* xcalloc() et cetera */ #include "wrap.h" /* xcalloc() et cetera */
#include "re.h" #include "re.h"
#ifdef HAVE_LIBDMALLOC #ifdef HAVE_LIBDMALLOC
# include <dmalloc.h> #include <dmalloc.h>
#endif /* HAVE_LIBDMALLOC */ #endif /* HAVE_LIBDMALLOC */
option_t config; option_t config;
@ -53,57 +54,68 @@ main (int argc, char **argv)
runtime.count = 0; runtime.count = 0;
runtime.maildir_count = 0; runtime.maildir_count = 0;
static struct option long_options[] = { static struct option long_options[] =
{"count", 0, 0, 'c'}, {
{"delete", 0, 0, 'd'}, {"count", 0, 0, 'c'},
/* {"date", 1, 0, 'D'}, */ {"delete", 0, 0, 'd'},
{"extended-regexp", 0, 0, 'E'}, /* {"date", 1, 0, 'D'}, */
{"basic-regexp", 0, 0, 'G'}, {"extended-regexp", 0, 0, 'E'},
{"perl-regexp", 0, 0, 'P'}, {"basic-regexp", 0, 0, 'G'},
{"help", 0, 0, 'h'}, {"perl-regexp", 0, 0, 'P'},
{"ignore-case", 0, 0, 'i'}, {"help", 0, 0, 'h'},
{"mailbox-format", 1, 0, 'm'}, {"ignore-case", 0, 0, 'i'},
{"no", 1, 0, 'n'}, {"mailbox-format", 1, 0, 'm'},
{"pipe", 1, 0, 'p'}, {"no", 1, 0, 'n' },
{"regexp", 1, 0, 'e'}, {"pipe", 1, 0, 'p'},
{"invert-match", 0, 0, 'v'}, {"regexp", 1, 0, 'e'},
{"version", 0, 0, 'V'}, {"invert-match", 0, 0, 'v'},
{"headers", 0, 0, 'H'}, {"version", 0, 0, 'V'},
{"body", 0, 0, 'B'}, {"headers", 0, 0, 'H'},
{"no-messages", 0, 0, 's'}, {"body", 0, 0, 'B'},
{"output", 1, 0, 'o'}, {"no-messages", 0, 0, 's'},
{"no-duplicates", 0, 0, 200}, {"output", 1, 0, 'o'},
{"no-file-lock", 0, 0, 201}, {"no-duplicates", 0, 0, 200},
{"debug", 0, 0, 202}, {"no-file-lock", 0, 0, 201},
{"file-lock", 1, 0, 'l'}, {"debug", 0, 0, 202},
{"recursive", 0, 0, 'r'}, {"file-lock", 1, 0, 'l'},
{0, 0, 0, 0} {"recursive", 0, 0, 'r'},
}; {0, 0, 0, 0}
};
init_options (); set_default_options ();
get_options (&argc, argv, long_options); get_runtime_options (&argc, argv, long_options);
check_options (); if ((config.body == 0) && (config.headers == 0))
{
config.body = 1;
config.headers = 1;
}
if (config.format == MAILDIR && config.action == WRITE)
{
gethostname (config.hostname, HOST_NAME_SIZE);
config.pid = (int) getpid ();
}
runtime.cs = (checksum_t *) xmalloc (sizeof (checksum_t)); runtime.cs = (checksum_t *) xmalloc (sizeof (checksum_t));
runtime.cs->md5 = (char **) xcalloc (1, sizeof (char **)); runtime.cs->md5 = (char **) xcalloc (1, sizeof (char **));
runtime.cs->n = 0; runtime.cs->n = 0;
if (optind < argc && !config.haveregex) if (optind < argc && ! config.haveregex)
{ {
config.regex_s = xstrdup (argv[optind]); config.regex_s = xstrdup (argv[optind]);
config.haveregex = 1; config.haveregex = 1;
++optind; ++optind;
} }
if (config.haveregex) if (config.haveregex)
{ {
#ifdef HAVE_LIBPCRE2 #ifdef HAVE_LIBPCRE
if (config.regextype == REGEX_PERL) if (config.perl)
pcre_init (); pcre_init ();
else else
#endif /* HAVE_LIBPCRE2 */ #endif /* HAVE_LIBPCRE */
regex_init (); regex_init ();
} }
else else
@ -114,7 +126,7 @@ main (int argc, char **argv)
while (optind < argc) while (optind < argc)
{ {
if (config.action == ACTION_DELETE) if (config.action == DELETE)
{ {
tmpmbox_create (argv[optind]); tmpmbox_create (argv[optind]);
runtime.tmp_mbox = (mbox_t *) mbox_open (config.tmpfilename, "w"); runtime.tmp_mbox = (mbox_t *) mbox_open (config.tmpfilename, "w");
@ -129,7 +141,7 @@ main (int argc, char **argv)
havemailbox = 1; havemailbox = 1;
if (config.action == ACTION_COUNT) if (config.action == COUNT)
{ {
if (singlefile) if (singlefile)
fprintf (stdout, "%i\n", runtime.count); fprintf (stdout, "%i\n", runtime.count);
@ -141,20 +153,19 @@ main (int argc, char **argv)
fprintf (stdout, "%s:%i\n", argv[optind], runtime.count); fprintf (stdout, "%s:%i\n", argv[optind], runtime.count);
} }
} }
if (config.action == ACTION_DELETE) if (config.action == DELETE)
{ {
mbox_close (runtime.tmp_mbox); mbox_close (runtime.tmp_mbox);
rename (config.tmpfilename, argv[optind]); rename (config.tmpfilename, argv[optind]);
} }
++optind; ++optind;
} }
if (!havemailbox) if (! havemailbox)
{ {
config.format = FORMAT_MBOX; config.format = MBOX;
scan_mailbox ("-"); scan_mailbox ("-");
if (config.action == ACTION_COUNT) if (config.action == COUNT)
fprintf (stdout, "%i\n", runtime.count); fprintf (stdout, "%i\n", runtime.count);
} }

View File

@ -1,6 +1,6 @@
/* /*
mboxgrep - scan mailbox for messages matching a regular expression mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2023 Daniel Spiljar Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by under the terms of the GNU General Public License as published by
@ -30,13 +30,13 @@
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
#ifdef HAVE_FLOCK #ifdef HAVE_FLOCK
# include <sys/file.h> #include <sys/file.h>
#endif /* HAVE_FLOCK */ #endif /* HAVE_FLOCK */
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
# include <zlib.h> #include <zlib.h>
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
# include <bzlib.h> #include <bzlib.h>
#endif /* HAVE_LIBBZ2 */ #endif /* HAVE_LIBBZ2 */
#define BUFLEN 16384 #define BUFLEN 16384
@ -46,7 +46,7 @@
#include "wrap.h" #include "wrap.h"
#ifdef HAVE_LIBDMALLOC #ifdef HAVE_LIBDMALLOC
# include <dmalloc.h> #include <dmalloc.h>
#endif /* HAVE_LIBDMALLOC */ #endif /* HAVE_LIBDMALLOC */
mbox_t * mbox_t *
@ -70,11 +70,11 @@ mbox_open (const char *path, const char *mode)
fd = m_open (path, O_RDONLY, 0); fd = m_open (path, O_RDONLY, 0);
else if (mode[0] == 'w') else if (mode[0] == 'w')
fd = m_open (path, (O_WRONLY | O_CREAT | O_APPEND), fd = m_open (path, (O_WRONLY | O_CREAT | O_APPEND),
(S_IWUSR | S_IRUSR)); (S_IWUSR | S_IRUSR));
else else
{ {
fprintf (stderr, "%s: mbox.c: Unknown mode %c. You shouldn't " fprintf (stderr, "%s: mbox.c: Unknown mode %c. You shouldn't "
"get this error...", APPNAME, mode[0]); "get this error...", APPNAME, mode[0]);
exit (2); exit (2);
} }
@ -88,8 +88,8 @@ mbox_open (const char *path, const char *mode)
errno = 0; errno = 0;
return NULL; return NULL;
} }
if (config.lock > LOCK_NONE) if (config.lock)
{ {
#ifdef HAVE_FLOCK #ifdef HAVE_FLOCK
int op; int op;
@ -100,7 +100,7 @@ mbox_open (const char *path, const char *mode)
op = LOCK_EX; op = LOCK_EX;
if (-1 == flock (fd, op)) if (-1 == flock (fd, op))
#else #else
memset (&lck, 0, sizeof (struct flock)); memset (&lck, 0, sizeof (struct flock));
lck.l_whence = SEEK_SET; lck.l_whence = SEEK_SET;
if (mode[0] == 'r') if (mode[0] == 'r')
lck.l_type = F_RDLCK; lck.l_type = F_RDLCK;
@ -119,35 +119,35 @@ mbox_open (const char *path, const char *mode)
close (fd); close (fd);
return NULL; return NULL;
} }
} }
if (mode[0] == 'r') if (mode[0] == 'r')
{ {
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
mp->fp = (FILE *) m_fdopen (fd, "r"); mp->fp = (FILE *) m_fdopen (fd, "r");
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
mp->fp = (gzFile *) m_gzdopen (fd, "rb"); mp->fp = (gzFile *) m_gzdopen (fd, "rb");
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
mp->fp = (BZFILE *) BZ2_bzdopen (fd, "rb"); mp->fp = (BZFILE *) BZ2_bzdopen (fd, "rb");
#endif /* HAVE_LIBBZ2 */ #endif /* HAVE_LIBBZ2 */
} }
else if (mode[0] == 'w') else if (mode[0] == 'w')
{ {
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
mp->fp = (FILE *) m_fdopen (fd, "w"); mp->fp = (FILE *) m_fdopen (fd, "w");
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
mp->fp = (gzFile *) m_gzdopen (fd, "wb"); mp->fp = (gzFile *) m_gzdopen (fd, "wb");
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
mp->fp = (BZFILE *) BZ2_bzdopen (fd, "wb"); mp->fp = (BZFILE *) BZ2_bzdopen (fd, "wb");
#endif /* HAVE_LIBBZ2 */ #endif /* HAVE_LIBBZ2 */
} }
if (mp->fp == NULL) if (mp->fp == NULL)
{ {
if (config.merr) if (config.merr)
@ -163,14 +163,14 @@ mbox_open (const char *path, const char *mode)
if (mode[0] == 'r') if (mode[0] == 'r')
{ {
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
fgets (buffer, BUFSIZ, mp->fp); fgets (buffer, BUFSIZ, mp->fp);
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
gzgets (mp->fp, buffer, BUFSIZ); gzgets (mp->fp, buffer, BUFSIZ);
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
{ {
char c[1] = "\0"; char c[1] = "\0";
int n = 0; int n = 0;
@ -191,19 +191,18 @@ mbox_open (const char *path, const char *mode)
{ {
if (0 == strcmp ("-", path)) if (0 == strcmp ("-", path))
fprintf (stderr, "%s: (standard input): Not a mbox folder\n", fprintf (stderr, "%s: (standard input): Not a mbox folder\n",
APPNAME); APPNAME);
else else
fprintf (stderr, "%s: %s: Not a mbox folder\n", APPNAME, fprintf (stderr, "%s: %s: Not a mbox folder\n", APPNAME, path);
path);
} }
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
fclose (mp->fp); fclose (mp->fp);
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
gzclose (mp->fp); gzclose (mp->fp);
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
BZ2_bzclose (mp->fp); BZ2_bzclose (mp->fp);
#endif /* HAVE_LIBBZ2 */ #endif /* HAVE_LIBBZ2 */
return NULL; return NULL;
@ -216,14 +215,14 @@ mbox_open (const char *path, const char *mode)
void void
mbox_close (mbox_t * mp) mbox_close (mbox_t * mp)
{ {
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
fclose (mp->fp); fclose (mp->fp);
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
gzclose (mp->fp); gzclose (mp->fp);
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
BZ2_bzclose (mp->fp); BZ2_bzclose (mp->fp);
#endif /* HAVE_LIBBZ2 */ #endif /* HAVE_LIBBZ2 */
@ -249,7 +248,7 @@ mbox_read_message (mbox_t * mp)
for (;;) for (;;)
{ {
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
{ {
if (fgets (buffer, BUFSIZ, mp->fp) == NULL) if (fgets (buffer, BUFSIZ, mp->fp) == NULL)
{ {
@ -261,7 +260,7 @@ mbox_read_message (mbox_t * mp)
} }
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
{ {
if (gzgets (mp->fp, buffer, BUFSIZ) == NULL) if (gzgets (mp->fp, buffer, BUFSIZ) == NULL)
{ {
@ -274,7 +273,7 @@ mbox_read_message (mbox_t * mp)
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
{ {
char c[1] = "\0"; char c[1] = "\0";
int n = 0; int n = 0;
@ -309,7 +308,7 @@ mbox_read_message (mbox_t * mp)
{ {
message->headers = message->headers =
(char *) realloc (message->headers, (char *) realloc (message->headers,
((1 + s + message->hbytes) * sizeof (char))); ((1 + s + message->hbytes) * sizeof (char)));
strcpy (message->headers + message->hbytes, buffer); strcpy (message->headers + message->hbytes, buffer);
message->hbytes += s; message->hbytes += s;
} }
@ -322,7 +321,7 @@ mbox_read_message (mbox_t * mp)
} }
message->body = message->body =
(char *) realloc (message->body, (char *) realloc (message->body,
((1 + s + message->bbytes) * sizeof (char))); ((1 + s + message->bbytes) * sizeof (char)));
strcpy (message->body + message->bbytes, buffer); strcpy (message->body + message->bbytes, buffer);
message->bbytes += s; message->bbytes += s;
} }
@ -347,7 +346,7 @@ tmpfile_name (const char *path)
{ {
char *fname, *tmpdir; char *fname, *tmpdir;
if (path == NULL) /* no path prefix given, use /tmp or TMPDIR */ if (path == NULL) /* no path prefix given, use /tmp or TMPDIR */
{ {
tmpdir = getenv ("TMPDIR"); tmpdir = getenv ("TMPDIR");
if (tmpdir == NULL) if (tmpdir == NULL)
@ -362,26 +361,26 @@ tmpfile_name (const char *path)
config.tmpfilename = config.tmpfilename =
(char *) xmalloc ((strlen (tmpdir) + (strlen (fname) + 1)) (char *) xmalloc ((strlen (tmpdir) + (strlen (fname) + 1))
* sizeof (char)); * sizeof (char));
sprintf (config.tmpfilename, "%s%s", tmpdir, fname); sprintf (config.tmpfilename, "%s%s", tmpdir, fname);
} }
void void
mbox_write_message (message_t * msg, mbox_t * mbox) mbox_write_message (message_t *msg, mbox_t *mbox)
{ {
if (config.format == FORMAT_MBOX) if (config.format == MBOX)
fprintf (mbox->fp, "%s\n%s", msg->headers, msg->body); fprintf (mbox->fp, "%s\n%s", msg->headers, msg->body);
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
else if (config.format == FORMAT_ZMBOX) else if (config.format == ZMBOX)
{ {
gzwrite_loop (mbox->fp, msg->headers); gzwrite_loop (mbox->fp, msg->headers);
gzwrite (mbox->fp, "\n", 1); gzwrite(mbox->fp, "\n", 1);
gzwrite_loop (mbox->fp, msg->body); gzwrite_loop (mbox->fp, msg->body);
} }
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
else if (config.format == FORMAT_BZ2MBOX) else if (config.format == BZ2MBOX)
{ {
bzwrite_loop (mbox->fp, msg->headers); bzwrite_loop (mbox->fp, msg->headers);
BZ2_bzwrite (mbox->fp, "\n", 1); BZ2_bzwrite (mbox->fp, "\n", 1);
@ -403,14 +402,11 @@ tmpfile_mod_own (const int fd, const char *path)
if (stat (path, &s) != -1) if (stat (path, &s) != -1)
{ {
if (fchown (fd, s.st_uid, s.st_gid) == -1) if (fchown (fd, s.st_uid, s.st_gid) == -1)
if (config.merr) if (config.merr) perror (config.tmpfilename);
perror (config.tmpfilename);
if (fchmod (fd, s.st_mode) == -1) if (fchmod (fd, s.st_mode) == -1)
if (config.merr) if (config.merr) perror (config.tmpfilename);
perror (config.tmpfilename);
} }
else if (config.merr) else if (config.merr) perror (path);
perror (path);
} }
} }

View File

@ -18,11 +18,11 @@
*/ */
#ifndef MBOX_H #ifndef MBOX_H
# define MBOX_H 1 #define MBOX_H 1
# include <config.h> #include <config.h>
# include "message.h" #include "message.h"
typedef struct typedef struct
{ {
@ -39,6 +39,6 @@ void tmpfile_mod_own (const int fd, const char *path);
int tmpfile_create (void); int tmpfile_create (void);
void mbox_close (mbox_t * mbp); void mbox_close (mbox_t * mbp);
message_t *mbox_read_message (mbox_t * mp); message_t *mbox_read_message (mbox_t * mp);
void mbox_write_message (message_t * m, mbox_t * mbox); void mbox_write_message (message_t *m, mbox_t *mbox);
#endif /* MBOX_H */ #endif /* MBOX_H */

View File

@ -15,13 +15,14 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with mboxgrep; if not, write to the Free Software Foundation, along with mboxgrep; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef MBOXGREP_H #ifndef MBOXGREP_H
#define MBOXGREP_H #define MBOXGREP_H
#define APPNAME "mboxgrep" #define APPNAME "mboxgrep"
#define VERSION "0.7.12a" #define VERSION "0.7.10"
#define BUGREPORT_ADDR "dspiljar AT datatipp.se" #define BUGREPORT_ADDR "dspiljar AT datatipp.se"
#define HOST_NAME_SIZE 256 #define HOST_NAME_SIZE 256
@ -46,46 +47,34 @@
typedef enum typedef enum
{ {
FORMAT_UNDEF, MBOX,
FORMAT_MBOX, ZMBOX,
FORMAT_ZMBOX, MH,
FORMAT_MH, NNML,
FORMAT_NNML, NNMH,
FORMAT_NNMH, MAILDIR,
FORMAT_MAILDIR, BZ2MBOX
FORMAT_BZ2MBOX
} }
format_t; format_t;
typedef enum typedef enum
{ {
LOCK_UNDEF, NONE,
LOCK_NONE, FCNTL,
LOCK_FCNTL, FLOCK
LOCK_FLOCK
} }
lockmethod_t; lockmethod_t;
typedef enum typedef enum
{ {
ACTION_UNDEF, DISPLAY,
ACTION_DISPLAY, WRITE,
ACTION_WRITE, COUNT,
ACTION_COUNT, DELETE,
ACTION_DELETE, PIPE
ACTION_PIPE
} }
action_t; action_t;
typedef enum
{
REGEX_UNDEF,
REGEX_BASIC,
REGEX_EXTENDED,
REGEX_PERL
}
regextype_t;
typedef struct typedef struct
{ {
FILE *fp; FILE *fp;
@ -105,6 +94,9 @@ checksum_t;
typedef struct typedef struct
{ {
int extended;
int perl;
int body; int body;
int headers; int headers;
int dedup; int dedup;
@ -120,13 +112,12 @@ typedef struct
char hostname[HOST_NAME_SIZE]; char hostname[HOST_NAME_SIZE];
char *boxname, *outboxname, *pipecmd, *tmpfilename, *regex_s; char *boxname, *outboxname, *pipecmd, *tmpfilename, *regex_s;
void *pcre_pattern, *posix_pattern, *match_data; void *pcre_pattern, *pcre_hints, *posix_pattern;
int res1, res2; int res1, res2;
action_t action; action_t action;
format_t format; format_t format;
lockmethod_t lock; lockmethod_t lock;
regextype_t regextype;
} }
option_t; option_t;

View File

@ -18,14 +18,14 @@
*/ */
#ifndef MESSAGE_H #ifndef MESSAGE_H
# define MESSAGE_H 1 #define MESSAGE_H 1
# include <config.h> #include <config.h>
typedef struct typedef struct
{ {
char *filename; /* used with directory formats, such as maildir or MH */ char *filename; /* used with directory formats, such as maildir or MH */
char *msgid; char *msgid;
char *from; char *from;
char *headers; char *headers;
int hbytes; int hbytes;

207
src/mh.c
View File

@ -1,6 +1,6 @@
/* -*- C -*- /* -*- C -*-
mboxgrep - scan mailbox for messages matching a regular expression mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000, 2001, 2002, 2003, 2006, 2023 Daniel Spiljar Copyright (C) 2000, 2001, 2002, 2003, 2006 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by under the terms of the GNU General Public License as published by
@ -22,23 +22,20 @@
#include <string.h> #include <string.h>
#ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name) # define NAMLEN(dirent) strlen((dirent)->d_name)
#else #else
# define dirent direct # define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen # define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h> # include <sys/ndir.h>
# endif # endif /* HAVE_SYS_NDIR_H */
/* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H
# ifdef HAVE_SYS_DIR_H # include <sys/dir.h>
# include <sys/dir.h> # endif /* HAVE_SYS_DIR_H */
# endif # ifdef HAVE_NDIR_H
/* HAVE_SYS_DIR_H */ # include <ndir.h>
# ifdef HAVE_NDIR_H # endif /* HAVE_NDIR_H */
# include <ndir.h>
# endif
/* HAVE_NDIR_H */
#endif /* HAVE_DIRENT_H */ #endif /* HAVE_DIRENT_H */
#include <sys/types.h> #include <sys/types.h>
@ -52,13 +49,12 @@
#include "wrap.h" #include "wrap.h"
#ifdef HAVE_LIBDMALLOC #ifdef HAVE_LIBDMALLOC
# include <dmalloc.h> # include <dmalloc.h>
#endif /* HAVE_LIBDMALLOC */ #endif /* HAVE_LIBDMALLOC */
extern option_t config; extern option_t config;
DIR * DIR *mh_open (const char *path)
mh_open (const char *path)
{ {
DIR *dp; DIR *dp;
@ -66,24 +62,22 @@ mh_open (const char *path)
if (dp == NULL) if (dp == NULL)
{ {
if (config.merr) if (config.merr)
{ {
fprintf (stderr, "%s: %s: ", APPNAME, path); fprintf (stderr, "%s: %s: ", APPNAME, path);
perror (NULL); perror (NULL);
} }
errno = 0; errno = 0;
return NULL; return NULL;
} }
return dp; return dp;
} /* mh_open */ } /* mh_open */
void void mh_close (DIR *dp)
mh_close (DIR * dp)
{ {
closedir (dp); closedir (dp);
} /* mh_close */ } /* mh_close */
message_t * message_t *mh_read_message (DIR *dp)
mh_read_message (DIR * dp)
{ {
int isheaders = 1; int isheaders = 1;
int have_from = 0, have_date = 0, have_sender = 0; int have_from = 0, have_date = 0, have_sender = 0;
@ -97,17 +91,16 @@ mh_read_message (DIR * dp)
filename = NULL; filename = NULL;
for (;;) for(;;)
{ {
d_content = readdir (dp); d_content = readdir(dp);
if (d_content == NULL) if (d_content == NULL) return NULL;
return NULL;
if (d_content->d_name[0] == '.') if (d_content->d_name[0] == '.')
continue; continue;
filename = (char *) xrealloc filename = (char *) xrealloc
(filename, ((strlen (d_content->d_name)) + (filename, ((strlen (d_content->d_name)) +
(strlen (config.boxname)) + 2)); (strlen (config.boxname)) + 2));
/* message->headers = (char *) xrealloc (message->headers, 0); */ /* message->headers = (char *) xrealloc (message->headers, 0); */
/* message->hbytes = 0; */ /* message->hbytes = 0; */
@ -119,17 +112,17 @@ mh_read_message (DIR * dp)
fp = m_fopen (filename, "r"); fp = m_fopen (filename, "r");
isheaders = 1; isheaders = 1;
if (fp == NULL) if (fp == NULL)
{ {
free (message->headers); free (message->headers);
free (message->body); free (message->body);
message->hbytes = 0; message->hbytes = 0;
message->bbytes = 0; message->bbytes = 0;
continue; continue;
} }
fgets (buffer, BUFSIZ, fp); fgets (buffer, BUFSIZ, fp);
/* if (config.format == FORMAT_NNML || config.format == FORMAT_NNMH) */ /* if (config.format == NNML || config.format == NNMH) */
/* { */ /* { */
/* if (0 != strncmp ("X-From-Line: ", buffer, 13)) */ /* if (0 != strncmp ("X-From-Line: ", buffer, 13)) */
/* { */ /* { */
@ -144,80 +137,76 @@ mh_read_message (DIR * dp)
/* continue; */ /* continue; */
/* } */ /* } */
/* } */ /* } */
fseek (fp, 0, SEEK_SET); fseek (fp, 0, SEEK_SET);
while (fgets (buffer, BUFSIZ, fp) != NULL) while (fgets (buffer, BUFSIZ, fp) != NULL)
{ {
s = strlen (buffer); s = strlen (buffer);
if (0 == strncmp ("\n", buffer, 1) && isheaders == 1) if (0 == strncmp ("\n", buffer, 1) && isheaders == 1)
{ {
isheaders = 0; isheaders = 0;
continue; continue;
} /* if */ } /* if */
if (isheaders) if (isheaders)
{ {
if (0 == strncasecmp ("From: ", buffer, 6)) if (0 == strncasecmp ("From: ", buffer, 6))
have_from = 1; have_from = 1;
if (0 == strncasecmp ("Sender: ", buffer, 8)) if (0 == strncasecmp ("Sender: ", buffer, 8))
have_sender = 1; have_sender = 1;
if (0 == strncasecmp ("Date: ", buffer, 6)) if (0 == strncasecmp ("Date: ", buffer, 6))
have_date = 1; have_date = 1;
if (0 == strncasecmp ("Return-Path: ", buffer, 13)) if (0 == strncasecmp ("Return-Path: ", buffer, 13))
message->from = parse_return_path (buffer); message->from = parse_return_path (buffer);
message->headers = message->headers =
(char *) realloc (message->headers, (char *) realloc (message->headers,
((1 + s + ((1 + s + message->hbytes) * sizeof (char)));
message->hbytes) * sizeof (char))); strcpy (message->headers + message->hbytes, buffer);
strcpy (message->headers + message->hbytes, buffer); message->hbytes += s;
message->hbytes += s; } /* if */
} /* if */ else
else {
{ message->body =
message->body = (char *) realloc (message->body,
(char *) realloc (message->body, ((1 + s + message->bbytes) * sizeof (char)));
((1 + s + strcpy (message->body + message->bbytes, buffer);
message->bbytes) * sizeof (char))); message->bbytes += s;
strcpy (message->body + message->bbytes, buffer); } /* else */
message->bbytes += s; } /* while */
} /* else */
} /* while */
if ((!have_from && !have_sender) || !have_date) if ((!have_from && !have_sender)|| !have_date)
{ {
if (config.merr) if (config.merr)
fprintf (stderr, "%s: %s: Not a RFC 2822 message\n", fprintf (stderr, "%s: %s: Not a RFC 2822 message\n",
APPNAME, filename); APPNAME, filename);
fclose (fp); fclose (fp);
free (message->headers); free (message->headers);
message->headers = NULL; message->headers = NULL;
free (message->body); free (message->body);
message->body = NULL; message->body = NULL;
message->hbytes = 0; message->hbytes = 0;
message->bbytes = 0; message->bbytes = 0;
continue; continue;
} }
else else
{ {
message->filename = (char *) xstrdup (filename); message->filename = (char *) xstrdup (filename);
fclose (fp); fclose (fp);
free (filename); free (filename);
return message; return message;
} }
} /* for */ } /* for */
} /* mh_read_message */ } /* mh_read_message */
void void mh_write_message (message_t *m, const char *path)
mh_write_message (message_t * m, const char *path)
{ {
struct dirent *dc; struct dirent *dc;
int x, y = 0; int x, y = 0;
char s1[BUFSIZ]; char s1[BUFSIZ];
DIR *d; DIR *d; FILE *f;
FILE *f;
d = m_opendir (path); d = m_opendir (path);
rewinddir (d); rewinddir (d);
@ -226,11 +215,11 @@ mh_write_message (message_t * m, const char *path)
{ {
x = strtol (dc->d_name, NULL, 10); x = strtol (dc->d_name, NULL, 10);
if (x > y) if (x > y)
y = x; y = x;
} }
y++; y++;
sprintf (s1, "%s/%i", path, y); sprintf (s1, "%s/%i", path, y);
f = m_fopen (s1, "w"); f = m_fopen (s1, "w");
fprintf (f, "%s\n%s", m->headers, m->body); fprintf (f, "%s\n%s", m->headers, m->body);
fclose (f); fclose (f);

View File

@ -18,33 +18,29 @@
*/ */
#ifndef MH_H #ifndef MH_H
# define MH_H 1 #define MH_H 1
# include <config.h> #include <config.h>
# ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# else #else
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h> # include <sys/ndir.h>
# endif # endif /* HAVE_SYS_NDIR_H */
/* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H
# ifdef HAVE_SYS_DIR_H # include <sys/dir.h>
# include <sys/dir.h> # endif /* HAVE_SYS_DIR_H */
# endif # ifdef HAVE_NDIR_H
/* HAVE_SYS_DIR_H */ # include <ndir.h>
# ifdef HAVE_NDIR_H # endif /* HAVE_NDIR_H */
# include <ndir.h> #endif /* HAVE_DIRENT_H */
# endif
/* HAVE_NDIR_H */
# endif
/* HAVE_DIRENT_H */
# include "mboxgrep.h" #include "mboxgrep.h"
DIR *mh_open (const char *path); DIR *mh_open (const char *path);
void mh_close (DIR * dp); void mh_close (DIR *dp);
message_t *mh_read_message (DIR * dp); message_t *mh_read_message (DIR *dp);
void mh_write_message (message_t * m, const char *path); void mh_write_message (message_t *m, const char *path);
#endif /* MH_H */ #endif /* MH_H */

View File

@ -17,9 +17,9 @@
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#define _XOPEN_SOURCE /* Pull in strptime(3) from time.h */ #define _XOPEN_SOURCE /* Pull in strptime(3) from time.h */
#define _DEFAULT_SOURCE /* Compensate for _XOPEN_SOURCE to pull in strdup(3) #define _BSD_SOURCE /* Compensate for _XOPEN_SOURCE to pull in strdup(3)
* from string.h. */ * from string.h. */
#include <config.h> #include <config.h>
@ -28,86 +28,71 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <unistd.h>
#include "mboxgrep.h" #include "mboxgrep.h"
#include "misc.h"
#include "wrap.h" #include "wrap.h"
#include "getopt.h" #include "getopt.h"
#include "info.h" #include "info.h"
#include "message.h" #include "message.h"
/* Determine the folder format passed to -m. */ format_t
folder_format (const char *name)
void
set_folder_format (const char *name)
{ {
if (config.format > 0) format_t f;
{
if (config.merr)
fprintf (stderr, "%s: multiple mailbox types specified\n", APPNAME);
exit (2);
}
if (0 == strncasecmp (name, "mbox", 4)) if (0 == strncasecmp (name, "mbox", 4))
config.format = FORMAT_MBOX; f = MBOX;
else if (0 == strncasecmp (name, "zmbox", 5)) else if (0 == strncasecmp (name, "zmbox", 5))
config.format = FORMAT_ZMBOX; f = ZMBOX;
else if (0 == strncasecmp (name, "gzmbox", 6)) else if (0 == strncasecmp (name, "gzmbox", 6))
config.format = FORMAT_ZMBOX; f = ZMBOX;
else if (0 == strncasecmp (name, "bzmbox", 5)) else if (0 == strncasecmp (name, "bzmbox", 5))
config.format = FORMAT_BZ2MBOX; f = BZ2MBOX;
else if (0 == strncasecmp (name, "bz2mbox", 5)) else if (0 == strncasecmp (name, "bz2mbox", 5))
config.format = FORMAT_BZ2MBOX; f = BZ2MBOX;
else if (0 == strncasecmp (name, "mh", 2)) else if (0 == strncasecmp (name, "mh", 2))
config.format = FORMAT_MH; f = MH;
else if (0 == strncasecmp (name, "nnml", 4)) else if (0 == strncasecmp (name, "nnml", 4))
config.format = FORMAT_NNML; f = NNML;
else if (0 == strncasecmp (name, "nnmh", 4)) else if (0 == strncasecmp (name, "nnmh", 4))
config.format = FORMAT_NNMH; f = NNMH;
else if (0 == strncasecmp (name, "maildir", 7)) else if (0 == strncasecmp (name, "maildir", 7))
config.format = FORMAT_MAILDIR; f = MAILDIR;
else else
{ {
if (config.merr) if (config.merr)
fprintf (stderr, "%s: %s: unknown folder type\n", APPNAME, name); fprintf (stderr, "%s: %s: unknown folder type\n", APPNAME, name);
exit (2); exit (2);
} }
return f;
} }
/* Determine the file locking method passed to -l. */ lockmethod_t lock_method (const char *name)
void
set_lock_method (const char *name)
{ {
if (config.lock > 0) lockmethod_t l;
{
if (config.merr)
fprintf (stderr, "%s: conflicting file locking options specified\n", APPNAME);
exit (2);
}
if (0 == strncasecmp (name, "none", 4)) if (0 == strncasecmp (name, "none", 4))
config.lock = LOCK_NONE; l = NONE;
else if (0 == strncasecmp (name, "off", 3)) else if (0 == strncasecmp (name, "off", 3))
config.lock = LOCK_NONE; l = NONE;
#ifdef HAVE_FCNTL #ifdef HAVE_FCNTL
else if (0 == strncasecmp (name, "fcntl", 5)) else if (0 == strncasecmp (name, "fcntl", 5))
config.lock = LOCK_FCNTL; l = FCNTL;
#endif /* HAVE_FCNTL */ #endif /* HAVE_FCNTL */
#ifdef HAVE_FLOCK #ifdef HAVE_FLOCK
else if (0 == strncasecmp (name, "flock", 5)) else if (0 == strncasecmp (name, "flock", 5))
config.lock = LOCK_FLOCK; l = FLOCK;
#endif /* HAVE_FLOCK */ #endif /* HAVE_FLOCK */
else else
{ {
if (config.merr) if (config.merr)
fprintf (stderr, "mboxgrep: %s: unknown file locking method\n", name); fprintf (stderr, "mboxgrep: %s: unknown file locking method\n", name);
exit (2); exit (2);
} }
}
/* Dead code */ return l;
}
/* /*
time_t parse_date(char *datestr) time_t parse_date(char *datestr)
@ -137,19 +122,17 @@ time_t parse_date(char *datestr)
} }
*/ */
char * char * parse_return_path(char *rpath)
parse_return_path (char *rpath)
{ {
char *blah1, blah2[BUFSIZ]; char *blah1, blah2[BUFSIZ];
sscanf (rpath, "Return-Path: <%[^\r\n>]>", blah2); sscanf(rpath, "Return-Path: <%[^\r\n>]>", blah2);
blah1 = xstrdup (blah2); blah1 = xstrdup (blah2);
return blah1; return blah1;
} }
void * void * allocate_message (void)
allocate_message (void)
{ {
message_t *message; message_t *message;
@ -168,8 +151,7 @@ allocate_message (void)
return message; return message;
} }
void void postmark_print (message_t *msg)
postmark_print (message_t * msg)
{ {
time_t tt; time_t tt;
struct tm *ct; struct tm *ct;
@ -184,203 +166,133 @@ postmark_print (message_t * msg)
fprintf (stdout, "From nobody %s\n", date_str); fprintf (stdout, "From nobody %s\n", date_str);
} }
/* Initialize the option_t struct. */
void void
init_options (void) set_default_options (void)
{ {
config.regextype = REGEX_UNDEF; config.perl = 0;
config.extended = 1;
config.invert = 0; config.invert = 0;
config.headers = 0; config.headers = 0;
config.body = 0; config.body = 0;
config.action = ACTION_UNDEF; config.action = DISPLAY;
config.dedup = 0; config.dedup = 0;
config.recursive = 0; config.recursive = 0;
config.ignorecase = 0; config.ignorecase = 0;
config.format = FORMAT_UNDEF; config.format = MBOX; /* default mailbox format */
config.lock = LOCK_UNDEF; /* default file locking method */ config.lock = FCNTL; /* default file locking method */
config.merr = 1; /* report errors by default */ config.merr = 1; /* report errors by default */
config.debug = 0; config.debug = 0;
} }
/* Parse command-line arguments and assign values to option_t. */
void void
get_options (int *argc, char **argv, struct option *long_options) get_runtime_options (int *argc, char **argv, struct option *long_options)
{ {
int option_index = 0, c; int option_index = 0, c;
while (1) while (1)
{ {
c = getopt_long (*argc, argv, "BcdEe:GHhil:m:n:o:Pp:rsVv", long_options, c = getopt_long (*argc, argv, "BcdEe:GHhil:m:n:o:Pp:rsVv", long_options,
&option_index); &option_index);
if (c == -1) if (c == -1)
break; break;
switch (c) switch (c)
{ {
case '?': case '?':
usage (); usage();
case 'c': case 'c':
set_option_action (ACTION_COUNT, NULL); config.action = COUNT;
break; break;
case 'd': case 'd':
set_option_action (ACTION_DELETE, NULL); config.action = DELETE;
break; break;
case 'e': case 'e':
config.regex_s = xstrdup (optarg); config.regex_s = xstrdup (optarg);
config.haveregex = 1; config.haveregex = 1;
break; break;
case 'o': case 'o':
set_option_action (ACTION_WRITE, optarg); config.outboxname = xstrdup (optarg);
break; config.action = WRITE;
case 'E': break;
set_option_regextype (REGEX_EXTENDED); case 'E':
break; config.extended = 1;
case 'G': break;
set_option_regextype (REGEX_BASIC); case 'G':
break; config.extended = 0;
case 'P': break;
set_option_regextype (REGEX_PERL); case 'P':
break; #ifdef HAVE_LIBPCRE
case 'h': config.extended = 0;
help (); config.perl = 1;
break; #else
case 'i': fprintf(stderr,
config.ignorecase = 1; "%s: Support for Perl regular expressions not "
break; "compiled in\n", APPNAME);
case 'm': exit(2);
set_folder_format (optarg); #endif /* HAVE_LIBPCRE */
break; break;
case 'l': case 'h':
set_lock_method (optarg); help ();
break; break;
case 'p': case 'i':
set_option_action (ACTION_PIPE, optarg); config.ignorecase = 1;
break; break;
case 'V': case 'm':
version (); config.format = folder_format (optarg);
break; break;
case 'v': case 'l':
config.invert = 1; config.lock = lock_method (optarg);
break; break;
case 'H': case 'p':
config.headers = 1; config.action = PIPE;
break; config.pipecmd = xstrdup (optarg);
case 'B': break;
config.body = 1; case 'V':
break; version ();
case 's': break;
config.merr = 0; case 'v':
break; config.invert = 1;
case 201: break;
config.lock = 0; case 'H':
break; config.headers = 1;
case 202: break;
config.debug = 1; case 'B':
fprintf (stderr, "%s: %s, line %d: enable debugging\n", config.body = 1;
APPNAME, __FILE__, __LINE__); break;
break; case 's':
case 'r': config.merr = 0;
config.recursive = 1; break;
break; case 201:
case 200: config.lock = 0;
config.dedup = 1; break;
break; case 202:
case 'n': config.debug = 1;
{ fprintf (stderr, "%s: %s, line %d: enable debugging\n",
switch (optarg[0]) APPNAME, __FILE__, __LINE__);
{ break;
case 'd': case 'r':
config.dedup = 1; config.recursive = 1;
break; break;
case 'l': case 200:
set_lock_method ("none"); config.dedup = 1;
break; break;
default: case 'n':
fprintf (stderr, "%s: invalid option -- n%c\n", {
APPNAME, optarg[0]); switch (optarg[0])
exit (2); {
} case 'd':
} config.dedup = 1;
} /* switch */ break;
} /* while */ case 'l':
} config.lock = 0;
break;
/* Check the state of command-line options after parsing them. default:
* Raise error on conflicting options and set uninitialized ones to default values. fprintf(stderr, "%s: invalid option -- n%c\n",
*/ APPNAME, optarg[0]);
exit(2);
void }
check_options (void) }
{ } /* switch */
gethostname (config.hostname, HOST_NAME_SIZE); } /* while */
config.pid = (int) getpid ();
if (config.action == ACTION_UNDEF)
{
config.action = ACTION_DISPLAY;
}
if (config.format == FORMAT_UNDEF)
{
config.format = FORMAT_MBOX; /* default mailbox format */
}
if (config.regextype == REGEX_UNDEF)
{
config.regextype = REGEX_EXTENDED; /* default regex type */
}
if ((config.body == 0) && (config.headers == 0))
{
config.body = 1;
config.headers = 1;
}
}
void
set_option_action (action_t action, char *path)
{
if (config.action > 0)
{
if (config.merr)
fprintf (stderr, "%s: conflicting actions specified\n", APPNAME);
exit (2);
}
config.action = action;
if (action == ACTION_WRITE)
{
config.outboxname = xstrdup (path);
}
if (action == ACTION_PIPE)
{
config.pipecmd = xstrdup (optarg);
}
}
void
set_option_regextype (regextype_t regextype)
{
if (config.regextype > 0)
{
if (config.merr)
fprintf (stderr, "%s: conflicting matchers specified\n", APPNAME);
exit (2);
}
#ifndef HAVE_LIBPCRE2
if (regextype == REGEX_PERL);
{
fprintf (stderr,
"%s: Support for Perl regular expressions not compiled in\n",
APPNAME);
exit (2);
}
#endif /* HAVE_LIBPCRE2 */
config.regextype = regextype;
} }

View File

@ -18,24 +18,20 @@
*/ */
#ifndef MISC_H #ifndef MISC_H
# define MISC_H 1 #define MISC_H 1
# include "mboxgrep.h" #include "mboxgrep.h"
# include "getopt.h" #include "getopt.h"
# include "message.h" #include "message.h"
/* #include <time.h> */ /* #include <time.h> */
void set_folder_format (const char *name); format_t folder_format (const char *name);
void set_lock_method (const char *name); lockmethod_t lock_method (const char *name);
/* time_t parse_date(char *datestr); */ /* time_t parse_date(char *datestr); */
char *parse_return_path (char *rpath); char * parse_return_path(char *rpath);
void *allocate_message (void); void * allocate_message (void);
void postmark_print (message_t * msg); void postmark_print (message_t *msg);
void init_options (void); void set_default_options (void);
void get_options (int *argc, char **argv, void get_runtime_options (int *argc, char **argv, struct option *long_options);
struct option *long_options);
void check_options (void);
void set_option_action (action_t action, char *path);
void set_option_regextype (regextype_t regextype);
#endif /* MISC_H */ #endif /* MISC_H */

View File

@ -21,58 +21,55 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>
#ifdef HAVE_LIBPCRE2 #ifdef HAVE_LIBPCRE
# define PCRE2_CODE_UNIT_WIDTH 32 #include <pcre.h>
# include <pcre2.h> #endif /* HAVE_LIBPCRE */
#endif /* HAVE_LIBPCRE2 */
#include "mboxgrep.h" #include "mboxgrep.h"
#include "message.h" #include "message.h"
#include "wrap.h" /* xcalloc() et cetera */ #include "wrap.h" /* xcalloc() et cetera */
#ifdef HAVE_LIBPCRE2 #ifdef HAVE_LIBPCRE
void void
pcre_init (void) pcre_init (void)
{ {
int errornumber; int errptr;
PCRE2_SIZE erroroffset; const char *error;
config.pcre_pattern = config.pcre_pattern =
(pcre2_code *) pcre2_compile ((PCRE2_SPTR) config.regex_s, (PCRE2_SIZE) strlen (config.regex_s), (pcre *) pcre_compile (config.regex_s,
(config.ignorecase ? PCRE2_CASELESS : 0), (config.ignorecase ? PCRE_CASELESS : 0),
&errornumber, &erroroffset, NULL); &error, &errptr, NULL);
if (config.pcre_pattern == NULL) if (config.pcre_pattern == NULL)
{ {
if (config.merr) if (config.merr)
{ fprintf (stderr, "%s: %s: %s\n", APPNAME, config.regex_s,
PCRE2_UCHAR buffer[256]; error);
exit(2);
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 void
pcre_match (message_t * msg) pcre_match (message_t *msg)
{ {
int of[BUFSIZ];
if (config.headers) if (config.headers)
config.res1 = config.res1 =
pcre2_match ((pcre2_code *) config.pcre_pattern, pcre_exec ((pcre *) config.pcre_pattern,
(PCRE2_SPTR) msg->headers, (int) strlen (msg->headers), 0, 0, config.match_data, NULL); (pcre_extra *) config.pcre_hints,
msg->headers,
(int) strlen (msg->headers), 0, 0, of, BUFSIZ);
if (config.body) if (config.body)
config.res2 = config.res2 =
pcre2_match ((pcre2_code *) config.pcre_pattern, pcre_exec ((pcre *) config.pcre_pattern,
(PCRE2_SPTR) msg->body, (int) strlen (msg->body), 0, 0, config.match_data, NULL); (pcre_extra *) config.pcre_hints,
msg->body,
(int) strlen (msg->body), 0, 0, of, BUFSIZ);
config.res1 = config.res1 ^ 1; config.res1 = config.res1 ^ 1;
config.res2 = config.res2 ^ 1; config.res2 = config.res2 ^ 1;
} }
#endif /* HAVE_LIBPCRE2 */ #endif /* HAVE_LIBPCRE */
void void
regex_init (void) regex_init (void)
@ -80,21 +77,20 @@ regex_init (void)
int flag1 = 0, flag2 = 0; int flag1 = 0, flag2 = 0;
int errcode = 0; int errcode = 0;
char errbuf[BUFSIZ]; char errbuf[BUFSIZ];
if (config.ignorecase) if (config.ignorecase)
flag1 = REG_ICASE; flag1 = REG_ICASE;
if (config.regextype == REGEX_EXTENDED) if (config.extended)
flag2 = REG_EXTENDED; flag2 = REG_EXTENDED;
config.posix_pattern = (regex_t *) xmalloc (sizeof (regex_t)); config.posix_pattern = (regex_t *) xmalloc (sizeof (regex_t));
errcode = regcomp ((regex_t *) config.posix_pattern, config.regex_s, errcode = regcomp ((regex_t *) config.posix_pattern, config.regex_s,
(flag1 | flag2 | REG_NEWLINE)); (flag1 | flag2 | REG_NEWLINE ));
if (0 != errcode) if (0 != errcode)
{ {
if (config.merr) if (config.merr)
{ {
regerror (errcode, (regex_t *) config.posix_pattern, errbuf, regerror (errcode, (regex_t *) config.posix_pattern, errbuf, BUFSIZ);
BUFSIZ);
fprintf (stderr, "%s: %s: %s\n", APPNAME, config.regex_s, errbuf); fprintf (stderr, "%s: %s: %s\n", APPNAME, config.regex_s, errbuf);
} }
exit (2); exit (2);
@ -102,12 +98,12 @@ regex_init (void)
} }
void void
regex_match (message_t * msg) regex_match (message_t *msg)
{ {
if (config.headers) if (config.headers)
config.res1 = regexec ((regex_t *) config.posix_pattern, config.res1 = regexec ((regex_t *) config.posix_pattern,
msg->headers, 0, NULL, 0); msg->headers, 0, NULL, 0);
if (config.body) if (config.body)
config.res2 = regexec ((regex_t *) config.posix_pattern, config.res2 = regexec ((regex_t *) config.posix_pattern,
msg->body, 0, NULL, 0); msg->body, 0, NULL, 0);
} }

View File

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

View File

@ -1,6 +1,6 @@
/* /* -*- C -*-
mboxgrep - scan mailbox for messages matching a regular expression mboxgrep - scan mailbox for messages matching a regular expression
Copyright (C) 2000 - 2004, 2006, 2023 Daniel Spiljar Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 Daniel Spiljar
Mboxgrep is free software; you can redistribute it and/or modify it Mboxgrep is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by under the terms of the GNU General Public License as published by
@ -15,7 +15,8 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with mboxgrep; if not, write to the Free Software Foundation, along with mboxgrep; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
$Id: scan.c,v 1.32 2006-10-22 23:34:49 dspiljar Exp $ */
#include <config.h> #include <config.h>
@ -25,23 +26,20 @@
#include <sys/types.h> #include <sys/types.h>
#ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name) # define NAMLEN(dirent) strlen((dirent)->d_name)
#else #else
# define dirent direct # define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen # define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h> # include <sys/ndir.h>
# endif # endif /* HAVE_SYS_NDIR_H */
/* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H
# ifdef HAVE_SYS_DIR_H # include <sys/dir.h>
# include <sys/dir.h> # endif /* HAVE_SYS_DIR_H */
# endif # ifdef HAVE_NDIR_H
/* HAVE_SYS_DIR_H */ # include <ndir.h>
# ifdef HAVE_NDIR_H # endif /* HAVE_NDIR_H */
# include <ndir.h>
# endif
/* HAVE_NDIR_H */
#endif /* HAVE_DIRENT_H */ #endif /* HAVE_DIRENT_H */
#include <time.h> #include <time.h>
@ -59,21 +57,20 @@
#include "misc.h" #include "misc.h"
#include "re.h" #include "re.h"
#ifdef HAVE_FTS_OPEN #ifdef HAVE_FTS_OPEN
# include <sys/stat.h> # include <sys/stat.h>
# include <fts.h> # include <fts.h>
#else #else
# ifdef HAVE_FTW # ifdef HAVE_FTW
# include <ftw.h> # include <ftw.h>
# endif # endif /* HAVE_FTW */
/* HAVE_FTW */
#endif /* HAVE_FTS_OPEN */ #endif /* HAVE_FTS_OPEN */
#ifdef HAVE_LIBDMALLOC #ifdef HAVE_LIBDMALLOC
# include <dmalloc.h> #include <dmalloc.h>
#endif /* HAVE_LIBDMALLOC */ #endif /* HAVE_LIBDMALLOC */
void void scan_mailbox (char path[])
scan_mailbox (char path[]) /* {{{ */
{ {
static FILE *outf; static FILE *outf;
static mbox_t *mbox, *out; static mbox_t *mbox, *out;
@ -83,47 +80,42 @@ scan_mailbox (char path[])
int delete = 0; int delete = 0;
int isdup = 0; int isdup = 0;
if (config.format == FORMAT_MAILDIR && config.action == ACTION_WRITE) if (config.format == MAILDIR && config.action == WRITE)
{ {
foo = opendir (config.outboxname); /* do NOT change this to m_opendir! */ foo = opendir (config.outboxname); /* do NOT change this to m_opendir! */
if (foo == NULL && errno == ENOENT) if (foo == NULL && errno == ENOENT)
maildir_create (config.outboxname); maildir_create (config.outboxname);
else else closedir (foo);
closedir (foo);
if (-1 == maildir_check (config.outboxname)) if (-1 == maildir_check (config.outboxname))
{ {
if (config.merr) if (config.merr)
fprintf (stderr, "%s: %s: Not a maildir folder\n", APPNAME, fprintf (stderr, "%s: %s: Not a maildir folder\n", APPNAME,
config.outboxname); config.outboxname);
exit (2); exit (2);
} }
} }
runtime.count = 0; runtime.count = 0;
if (config.action == ACTION_DELETE) if (config.action == DELETE)
delete = 1; delete = 1;
if ((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX) if ((config.format == MBOX) || (config.format == ZMBOX) ||
|| (config.format == FORMAT_BZ2MBOX)) (config.format == BZ2MBOX))
{ {
mbox = (mbox_t *) mbox_open (path, "r"); mbox = (mbox_t *) mbox_open (path, "r");
if (mbox == NULL) if (mbox == NULL) return;
return;
} }
else if ((config.format == FORMAT_MH) || (config.format == FORMAT_NNMH) else if ((config.format == MH) || (config.format == NNMH) ||
|| (config.format == FORMAT_NNML)) (config.format == NNML))
{ {
boxd = mh_open (path); boxd = mh_open (path);
if (boxd == NULL) if (boxd == NULL) return;
return;
} }
else if (config.format == FORMAT_MAILDIR) else if (config.format == MAILDIR)
{ {
maildird = maildir_open (path); maildird = maildir_open (path);
if (maildird == NULL) return;
if (maildird == NULL)
return;
} }
for (;;) for (;;)
@ -131,105 +123,102 @@ scan_mailbox (char path[])
config.res1 = 1; config.res1 = 1;
config.res2 = 1; config.res2 = 1;
if ((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX) if ((config.format == MBOX) || (config.format == ZMBOX) ||
|| (config.format == FORMAT_BZ2MBOX)) (config.format == BZ2MBOX))
msg = (message_t *) mbox_read_message (mbox); msg = (message_t *) mbox_read_message (mbox);
else if ((config.format == FORMAT_MH) || (config.format == FORMAT_NNMH) else if ((config.format == MH) || (config.format == NNMH) ||
|| (config.format == FORMAT_NNML)) (config.format == NNML))
msg = (message_t *) mh_read_message (boxd); msg = (message_t *) mh_read_message (boxd);
else if (config.format == FORMAT_MAILDIR) else if (config.format == MAILDIR)
msg = (message_t *) maildir_read_message (maildird); msg = (message_t *) maildir_read_message (maildird);
if (msg == NULL) if (msg == NULL) break;
break;
if (msg->from == NULL) if (msg->from == NULL) msg->from = (char *) xstrdup ("nobody");
msg->from = (char *) xstrdup ("nobody");
#ifdef HAVE_LIBPCRE2 #ifdef HAVE_LIBPCRE
if (config.regextype == REGEX_PERL) if (config.perl)
pcre_match (msg); pcre_match (msg);
else else
#endif /* HAVE_LIBPCRE2 */ #endif /* HAVE_LIBPCRE */
regex_match (msg); regex_match (msg);
if (config.dedup) if (config.dedup)
isdup = md5_check_message (msg->body, runtime.cs); isdup = md5_check_message (msg->body, runtime.cs);
if (((config.res1 == 0) | (config.res2 == 0)) ^ if (((config.res1 == 0) | (config.res2 == 0)) ^
((config.invert ^ delete)) && ((config.invert ^ delete)) &&
((config.dedup && !isdup) || !config.dedup)) ((config.dedup && !isdup) || !config.dedup))
{ {
if (config.action == ACTION_DISPLAY) if (config.action == DISPLAY)
{ {
if (config.format != FORMAT_MBOX && config.format != FORMAT_ZMBOX if (config.format != MBOX && config.format != ZMBOX
&& config.format != FORMAT_BZ2MBOX && config.format != BZ2MBOX
&& 0 != strncmp ("From ", msg->headers, 5)) && 0 != strncmp ("From ", msg->headers, 5))
postmark_print (msg); postmark_print (msg);
fprintf (stdout, "%s\n%s", msg->headers, msg->body);
}
else if (config.action == WRITE)
{
if (config.format == MAILDIR)
maildir_write_message (msg, config.outboxname);
else if (config.format == MH || config.format == NNMH ||
config.format == NNML)
mh_write_message (msg, config.outboxname);
else if ((config.format == MBOX) || (config.format == ZMBOX) ||
(config.format == BZ2MBOX))
{
out = mbox_open (config.outboxname, "w");
/* fprintf (out->fp, "%s\n%s", msg->headers, msg->body); */
mbox_write_message (msg, out);
mbox_close (out);
}
}
else if (config.action == PIPE)
{
outf = popen (config.pipecmd, "w");
if (outf == NULL)
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, config.pipecmd);
perror (NULL);
}
exit (2);
} /* if */
fprintf (outf, "%s\n%s", msg->headers, msg->body);
pclose (outf);
}
else if (config.action == COUNT)
runtime.count++;
else if (config.action == DELETE &&
((config.format == MBOX) || (config.format == ZMBOX) ||
(config.format == BZ2MBOX)))
mbox_write_message (msg, runtime.tmp_mbox);
}
fprintf (stdout, "%s\n%s", msg->headers, msg->body); else if (((((config.res1 == 0) | (config.res2 == 0)) ^
} config.invert) && delete) &&
else if (config.action == ACTION_WRITE) ((config.format == MH) || (config.format == NNMH) ||
{ (config.format == NNML) || (config.format == MAILDIR)))
if (config.format == FORMAT_MAILDIR) m_unlink(msg->filename);
maildir_write_message (msg, config.outboxname);
else if (config.format == FORMAT_MH || config.format == FORMAT_NNMH
|| config.format == FORMAT_NNML)
mh_write_message (msg, config.outboxname);
else if ((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX)
|| (config.format == FORMAT_BZ2MBOX))
{
out = mbox_open (config.outboxname, "w");
/* fprintf (out->fp, "%s\n%s", msg->headers, msg->body); */
mbox_write_message (msg, out);
mbox_close (out);
}
}
else if (config.action == ACTION_PIPE)
{
outf = popen (config.pipecmd, "w");
if (outf == NULL)
{
if (config.merr)
{
fprintf (stderr, "%s: %s: ", APPNAME, config.pipecmd);
perror (NULL);
}
exit (2);
} /* if */
fprintf (outf, "%s\n%s", msg->headers, msg->body);
pclose (outf);
}
else if (config.action == ACTION_COUNT)
runtime.count++;
else if (config.action == ACTION_DELETE &&
((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX)
|| (config.format == FORMAT_BZ2MBOX)))
mbox_write_message (msg, runtime.tmp_mbox);
}
else free(msg->body);
if (((((config.res1 == 0) | (config.res2 == 0)) ^ config.invert) free(msg->headers);
&& delete) && ((config.format == FORMAT_MH) || (config.format == FORMAT_NNMH) free(msg);
|| (config.format == FORMAT_NNML) } /* for */
|| (config.format == FORMAT_MAILDIR))) if ((config.format == MBOX) || (config.format == ZMBOX) ||
m_unlink (msg->filename); (config.format == BZ2MBOX))
free (msg->body);
free (msg->headers);
free (msg);
} /* for */
if ((config.format == FORMAT_MBOX) || (config.format == FORMAT_ZMBOX)
|| (config.format == FORMAT_BZ2MBOX))
mbox_close (mbox); mbox_close (mbox);
else if ((config.format == FORMAT_MH) || (config.format == FORMAT_NNMH) else if ((config.format == MH) || (config.format == NNMH) ||
|| (config.format == FORMAT_NNML)) (config.format == NNML))
mh_close (boxd); mh_close(boxd);
} }
/* }}} */
void recursive_scan (char path[])
/* {{{ */
void
recursive_scan (char path[])
{ {
#ifdef HAVE_FTS_OPEN #ifdef HAVE_FTS_OPEN
FTS *ftsfoo; FTS *ftsfoo;
@ -247,9 +236,9 @@ recursive_scan (char path[])
if (ftsfoo == NULL) if (ftsfoo == NULL)
{ {
/* fixme (?) */ /* fixme (?) */
perror (APPNAME); perror(APPNAME);
exit (2); exit (2);
} }
while ((ftsbar = fts_read (ftsfoo))) while ((ftsbar = fts_read (ftsfoo)))
@ -262,34 +251,34 @@ recursive_scan (char path[])
#endif /* HAVE_FTS_OPEN */ #endif /* HAVE_FTS_OPEN */
} }
int /* }}} */
md5_check_message (char *body, checksum_t * chksum)
int md5_check_message (char *body, checksum_t *chksum)
/* {{{ */
{ {
struct md5_ctx a; struct md5_ctx a;
char b[16]; char b[16];
int i; int i;
md5_init_ctx (&a); md5_init_ctx (&a);
if (body == NULL) if (body == NULL)
md5_process_bytes ("", 0, &a); md5_process_bytes ("", 0, &a);
else else
md5_process_bytes (body, strlen (body), &a); md5_process_bytes (body, strlen(body), &a);
md5_finish_ctx(&a, b);
md5_finish_ctx (&a, b);
for (i = 0; i < chksum->n; i++) for (i = 0; i < chksum->n; i++)
{ {
if (0 == strncmp ((char *) chksum->md5[i], b, 16)) if (0 == strncmp ((char *)chksum->md5[i], b, 16))
return 1; return 1;
} }
chksum->md5 = chksum->md5 =
(char **) xrealloc (chksum->md5, (1 + chksum->n) * sizeof (char *)); (char **) xrealloc (chksum->md5, (1 + chksum->n) * sizeof (char *));
chksum->md5[chksum->n] = xstrdup (b); chksum->md5[chksum->n] = xstrdup (b);
(chksum->n)++; (chksum->n)++;
return 0; return 0;
} }
/* }}} */

View File

@ -18,12 +18,12 @@
*/ */
#ifndef SCAN_H #ifndef SCAN_H
# define SCAN_H 1 #define SCAN_H 1
# include "mboxgrep.h" #include "mboxgrep.h"
void scan_mailbox (char path[]); void scan_mailbox (char path[]);
void recursive_scan (char path[]); void recursive_scan (char path[]);
int md5_check_message (char *body, checksum_t * chksum); int md5_check_message (char *body, checksum_t *chksum);
#endif /* SCAN_H */ #endif /* SCAN_H */

View File

@ -24,29 +24,26 @@
#include <errno.h> #include <errno.h>
#ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name) # define NAMLEN(dirent) strlen((dirent)->d_name)
#else #else
# define dirent direct # define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen # define NAMLEN(dirent) (dirent)->d_namlen
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h> # include <sys/ndir.h>
# endif # endif /* HAVE_SYS_NDIR_H */
/* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H
# ifdef HAVE_SYS_DIR_H # include <sys/dir.h>
# include <sys/dir.h> # endif /* HAVE_SYS_DIR_H */
# endif # ifdef HAVE_NDIR_H
/* HAVE_SYS_DIR_H */ # include <ndir.h>
# ifdef HAVE_NDIR_H # endif /* HAVE_NDIR_H */
# include <ndir.h>
# endif
/* HAVE_NDIR_H */
#endif /* HAVE_DIRENT_H */ #endif /* HAVE_DIRENT_H */
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
# include <zlib.h> #include <zlib.h>
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
# include <bzlib.h> #include <bzlib.h>
#endif /* HAVE_LIBBZ2 */ #endif /* HAVE_LIBBZ2 */
#include <sys/types.h> #include <sys/types.h>
@ -57,13 +54,12 @@
#include "mboxgrep.h" #include "mboxgrep.h"
#ifndef APPNAME #ifndef APPNAME
# define APPNAME "mboxgrep" #define APPNAME "mboxgrep"
#endif #endif
#define BUFLEN 16384 #define BUFLEN 16384
int int m_open (const char *pathname, int flags, mode_t mode)
m_open (const char *pathname, int flags, mode_t mode)
{ {
int blah; int blah;
@ -80,10 +76,9 @@ m_open (const char *pathname, int flags, mode_t mode)
exit (2); exit (2);
} }
return blah; return blah;
} }
FILE * FILE *m_fopen (const char *path, const char *mode)
m_fopen (const char *path, const char *mode)
{ {
FILE *blah; FILE *blah;
@ -101,8 +96,7 @@ m_fopen (const char *path, const char *mode)
return blah; return blah;
} }
FILE * FILE *m_fdopen (int fildes, const char *mode)
m_fdopen (int fildes, const char *mode)
{ {
FILE *blah; FILE *blah;
@ -117,8 +111,7 @@ m_fdopen (int fildes, const char *mode)
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
gzFile gzFile m_gzdopen (int fildes, const char *mode)
m_gzdopen (int fildes, const char *mode)
{ {
gzFile blah; gzFile blah;
@ -133,8 +126,7 @@ m_gzdopen (int fildes, const char *mode)
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
DIR * DIR *m_opendir (const char *name)
m_opendir (const char *name)
{ {
DIR *blah; DIR *blah;
@ -152,8 +144,7 @@ m_opendir (const char *name)
#ifndef HAVE_LIBDMALLOC #ifndef HAVE_LIBDMALLOC
void * void *xmalloc (size_t size)
xmalloc (size_t size)
{ {
void *foo; void *foo;
@ -167,8 +158,7 @@ xmalloc (size_t size)
return foo; return foo;
} }
void * void *xrealloc (void *ptr, size_t size)
xrealloc (void *ptr, size_t size)
{ {
void *foo; void *foo;
@ -182,8 +172,7 @@ xrealloc (void *ptr, size_t size)
return foo; return foo;
} }
void * void *xcalloc (size_t nmemb, size_t size)
xcalloc (size_t nmemb, size_t size)
{ {
void *foo; void *foo;
@ -197,8 +186,7 @@ xcalloc (size_t nmemb, size_t size)
return foo; return foo;
} }
char * char *xstrdup (const char *s)
xstrdup (const char *s)
{ {
char *foo; char *foo;
@ -214,8 +202,7 @@ xstrdup (const char *s)
#endif /* HAVE_LIBDMALLOC */ #endif /* HAVE_LIBDMALLOC */
int int m_unlink (const char *pathname)
m_unlink (const char *pathname)
{ {
int baz; int baz;
@ -233,8 +220,7 @@ m_unlink (const char *pathname)
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
void void gzwrite_loop (void *fp, char *str)
gzwrite_loop (void *fp, char *str)
{ {
int quux, len, baz; int quux, len, baz;
@ -242,8 +228,8 @@ gzwrite_loop (void *fp, char *str)
baz = strlen (str); baz = strlen (str);
for (;;) for (;;)
{ {
len = gzwrite (fp, (str + quux), len = gzwrite (fp, (str+quux),
(((quux + BUFLEN) < baz) ? BUFLEN : (baz - quux))); (((quux + BUFLEN) < baz) ? BUFLEN : (baz - quux)));
quux += len; quux += len;
if (quux == baz) if (quux == baz)
break; break;
@ -254,8 +240,7 @@ gzwrite_loop (void *fp, char *str)
#ifdef HAVE_LIBBZ2 #ifdef HAVE_LIBBZ2
void void bzwrite_loop (void *fp, char *str)
bzwrite_loop (void *fp, char *str)
{ {
int quux, len, baz; int quux, len, baz;
@ -263,8 +248,8 @@ bzwrite_loop (void *fp, char *str)
baz = strlen (str); baz = strlen (str);
for (;;) for (;;)
{ {
len = BZ2_bzwrite (fp, (str + quux), len = BZ2_bzwrite (fp, (str+quux),
(((quux + BUFLEN) < baz) ? BUFLEN : (baz - quux))); (((quux + BUFLEN) < baz) ? BUFLEN : (baz - quux)));
quux += len; quux += len;
if (quux == baz) if (quux == baz)
break; break;

View File

@ -22,64 +22,55 @@
/* wrappers around certain std functions */ /* wrappers around certain std functions */
#ifndef WRAP_H #ifndef WRAP_H
# define WRAP_H #define WRAP_H
# include <config.h> #include <config.h>
# include <stdio.h> #include <stdio.h>
# include <sys/types.h> #include <sys/types.h>
# ifdef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H
# include <dirent.h> # include <dirent.h>
# else #else
# ifdef HAVE_SYS_NDIR_H # ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h> # include <sys/ndir.h>
# endif # endif /* HAVE_SYS_NDIR_H */
/* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H
# ifdef HAVE_SYS_DIR_H # include <sys/dir.h>
# include <sys/dir.h> # endif /* HAVE_SYS_DIR_H */
# endif # ifdef HAVE_NDIR_H
/* HAVE_SYS_DIR_H */ # include <ndir.h>
# ifdef HAVE_NDIR_H # endif /* HAVE_NDIR_H */
# include <ndir.h> #endif /* HAVE_DIRENT_H */
# endif #ifdef HAVE_LIBZ
/* HAVE_NDIR_H */ #include <zlib.h>
# endif #endif /* HAVE_LIBZ */
/* HAVE_DIRENT_H */
# ifdef HAVE_LIBZ
# include <zlib.h>
# endif
/* HAVE_LIBZ */
# include <stdlib.h> #include <stdlib.h>
# ifdef HAVE_LIBDMALLOC #ifdef HAVE_LIBDMALLOC
# include <dmalloc.h> # include <dmalloc.h>
# endif #endif /* HAVE_LIBDMALLOC */
/* HAVE_LIBDMALLOC */
int m_open (const char *pathname, int flags, mode_t mode); int m_open (const char *pathname, int flags, mode_t mode);
FILE *m_fopen (const char *path, const char *mode); FILE *m_fopen (const char *path, const char *mode);
FILE *m_fdopen (int fildes, const char *mode); FILE *m_fdopen (int fildes, const char *mode);
# ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
gzFile m_gzdopen (int fildes, const char *mode); gzFile m_gzdopen (int fildes, const char *mode);
void gzwrite_loop (void *fp, char *str); void gzwrite_loop (void *fp, char *str);
# endif #endif /* HAVE_LIBZ */
/* HAVE_LIBZ */ #ifdef HAVE_LIBBZ2
# ifdef HAVE_LIBBZ2
void bzwrite_loop (void *fp, char *str); void bzwrite_loop (void *fp, char *str);
# endif #endif /* HAVE_LIBBZ2 */
/* HAVE_LIBBZ2 */
DIR *m_opendir (const char *name); DIR *m_opendir (const char *name);
# ifndef HAVE_LIBDMALLOC #ifndef HAVE_LIBDMALLOC
void *xmalloc (size_t size); void *xmalloc (size_t size);
void *xrealloc (void *ptr, size_t size); void *xrealloc (void *ptr, size_t size);
void *xcalloc (size_t nmemb, size_t size); void *xcalloc (size_t nmemb, size_t size);
char *xstrdup (const char *s); char *xstrdup (const char *s);
# endif #endif /* HAVE_LIBDMALLOC */
/* HAVE_LIBDMALLOC */
int m_unlink (const char *pathname); int m_unlink (const char *pathname);