1##---------------------------------------------------------------------------##
2##  File:
3##      $Id: mhopt.pl,v 2.68 2012/01/29 19:45:55 ehood Exp $
4##  Author:
5##      Earl Hood       mhonarc@mhonarc.org
6##  Description:
7##      Routines to set options for MHonArc.
8##---------------------------------------------------------------------------##
9##    MHonArc -- Internet mail-to-HTML converter
10##    Copyright (C) 1997-2002	Earl Hood, mhonarc@mhonarc.org
11##
12##    This program is free software; you can redistribute it and/or modify
13##    it under the terms of the GNU General Public License as published by
14##    the Free Software Foundation; either version 2 of the License, or
15##    (at your option) any later version.
16##
17##    This program is distributed in the hope that it will be useful,
18##    but WITHOUT ANY WARRANTY; without even the implied warranty of
19##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20##    GNU General Public License for more details.
21##
22##    You should have received a copy of the GNU General Public License
23##    along with this program; if not, write to the Free Software
24##    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25##    02111-1307, USA
26##---------------------------------------------------------------------------##
27
28package mhonarc;
29
30use Getopt::Long;
31use Time::Local;
32
33##---------------------------------------------------------------------------
34##	get_resources() is responsible for grabbing resource settings from
35##	the command-line and resource file(s).
36##
37sub get_resources {
38    my ($tmp);
39    my (%opt) = ();
40    local ($_);
41
42    die(qq{Try "$PROG -help" for usage information\n})
43        unless GetOptions(
44        \%opt,
45        'add',    # Add a message to archive
46        'afs',    # Bypass file permission checks
47        'addressmodifycode=s',
48        # Perl expression for modifying displayed addresses
49        'annotate',    # Add a note to message(s)
50        'attachmentdir=s',
51        # Pathname to attachment files directory
52        'attachmenturl=s',
53        # URL to attachment files directory
54        'authsort',    # Sort by author
55        'archive',     # Create an archive (the default)
56        'conlen',      # Honor Content-Length fields
57        'checknoarchive',
58        # Check for 'no archive' flag in messages
59        'datefields=s',     # Fields that contains the date of a message
60        'dbfile=s',         # Database/state filename for mhonarc archive
61        'dbfileperms=i',    # Octal permission to set DBFILE
62        'debug',            # Turn on debugging
63        'decodeheads',      # Decode all 1522 encoded data in message headers
64        'definevar|definevars=s@',
65        # Define custom resource variables
66        'doc',              # Print link to doc at end of index page
67        'docurl=s',         # URL to mhonarc documentation
68        'editidx',          # Change index page layout only
69        'expiredate=s',     # Message cut-off date
70        'expireage=i',      # Time in seconds from current if message expires
71        'fasttempfiles',    # Do not use random filenames for temporary files
72        'followsymlinks',
73        # Follow/allow symlinks when create files
74        'fileperms=i',    # Octal permission to create files
75        'folrefs',        # Print links to explicit follow-ups/references
76        'footer=s',       # File containing user text for bottom of index page
77        # 	(option no longer applicable)
78        'force',           # Perform archive operation even if unable to lock
79        'fromfields=s',    # Fields that contains the 'from' of a message
80        'genidx',          # Generate an index based upon archive contents
81        'gmtdatefmt=s',    # Date specification for GMT date
82        'gzipexe=s',       # Pathname of Gzip executable
83        'gzipfiles',       # Gzip files
84        'gziplinks',       # Add ".gz" extensions to files
85        'header=s',        # File containing user text for top of index page
86        # 	(option no longer applicable)
87        'htmlext=s',       # Extension for HTML files
88        'iconurlprefix=s',
89        # Prefix for icon urls
90        'idxfname=s',      # Filename of index page
91        'idxprefix=s',     # Filename prefix for multi-page main index
92        'idxsize=i',       # Maximum number of messages shown in indexes
93        'keeponrmm',       # Do not delete message files on archive remove
94        'lang=s',          # Set locale/language
95        'localdatefmt=s',
96        # Date specification for local date
97        'lock',          # Do archive locking (default)
98        'lockdelay=i',   # Time delay in seconds between lock tries
99        'lockmethod=s',  # Set the method of locking
100        'locktries=i',   # Number of tries in locking an archive
101        'mailtourl=s',   # URL to use for e-mail address hyperlinks
102        'main',          # Create a main index
103        'maxpgs=i',      # Maximum number of index pages
104        'maxsize=i',     # Maximum number of messages allowed in archive
105        'mbox',          # Use mailbox format		(ignored now)
106        'mh',            # Use MH mail folders format	(ignored now)
107        'mhpattern=s',   # Regular expression for message files in a directory
108        'modifybodyaddresses',
109        # addressmodifycode applies to text entities
110        'modtime',        # Set modification time on files to message date
111        'months=s',       # Month names
112        'monthsabr=s',    # Abbreviated month names
113        'msgexcfilter=s',
114        # Perl expression(s) for selective message exclusion
115        'msgpgs',         # Create message pages
116        'msgsep=s',       # Message separator for mailbox files
117        'msgprefix=s',    # Filename prefix for message files
118        'multipg',        # Generate multi-page indexes
119        'news',           # Add links to newsgroups
120        'newsurl=s',      # URL to use for news hyperlinks
121        'noauthsort',     # Do not sort by author
122        'noarchive',      # Do not create an archive
123        'nochecknoarchive',
124        # Do not check for 'no archive' flag in messages
125        'noconlen',       # Ignore Content-Length fields
126        'nodecodeheads',
127        # Do not decode 1522 encoded data in message headers
128        'nodoc',          # Do not print link to doc at end of index page
129        'nofasttempfiles',
130        # Use random filenames for temporary files
131        'nofollowsymlinks',
132        # Do not follow symlinks when creating files
133        'nofolrefs',    # Do not print links to explicit follow-ups/references
134        'nogzipfiles',  # Do not Gzip files
135        'nogziplinks',  # Do not add '.gz' extensions to files
136        'nokeeponrmm',  # Delete message files on archive remove
137        'nolock',       # Do no archive locking
138        'nomailto',     # Do not add in mailto links for e-mail addresses
139        'nomain',       # Do not create a main index
140        'nomsgpgs',     # Do not create message pages
141        'nomodtime',    # Do no set modification time on files to message date
142        'nomultipg',    # Do not generate multi-page indexes
143        'nonews',       # Do not add links to newsgroups
144        'noposixstrftime',
145        # Use own implementation for time format process
146        'noprintxcomments',
147        # Do not print X- comments
148        'noreverse',    # List messages in normal order
149        'nosaveresources',
150        # Do not save resource values in db
151        'nosort',        # Do not sort
152        'nospammode',    # Do not run in (anti)spam mode
153        'nosubsort',     # Do not sort by subject
154        'nosubjectthreads',
155        # Do not do subject based threading
156        'nosubjecttxt=s',
157        # Text to use if message has no subject
158        'notedir',        # Location of notes
159        'notetext=s@',    # Text data of note
160        'nothread',       # Do not create threaded index
161        'notreverse',     # List oldest thread first
162        'notsubsort|tnosubsort',
163        # Do not list threads by subject
164        'notsort|tnosort',
165        # List threads by ordered processed
166        'nourl',          # Do not make URL hyperlinks
167        'otherindex|otherindexes=s@',
168        # List of other rcfiles for extra indexes
169        'outdir=s',       # Destination of HTML files
170        'pagenum=s',      # Page to output if -genidx
171        'perlinc=s@',     # List of paths to search for MIME filters
172        'posixstrftime',
173        # Use POSIX strftime()
174        'printxcomments',
175        # Print X- comments
176        'quiet',          # No status messages while running
177        'rcfile=s@',      # Resource file for mhonarc
178        'reconvert!',     # Reconvert existing messages
179        'varregex=s',     # Regex matching resource variables
180        'reverse',        # List messages in reverse order
181        'rmm',            # Remove messages from an archive
182        'savemem',        # Write message data while processing
183        'saveresources',
184        # Save resource values in db
185        'scan',           # List out archive contents to terminal
186        'single',         # Convert a single message to HTML
187        'sort',           # Sort messages in increasing date order
188        'spammode',       # Run in (anti)spam mode
189        'stderr=s',       # Set file for stderr
190        'stdin=s',        # Set file for stdin
191        'stdout=s',       # Set file for stdout
192        'subjectarticlerxp=s',
193        # Regex for leading articles in subjects
194        'subjectreplyrxp=s',
195        # Regex for leading reply string in subjects
196        'subjectstripcode=s',
197        # Perl expression for modifying subjects
198        'subjectthreads',
199        # Check subjects for threads
200        'subsort',         # Sort message by subject
201        'tidxfname=s',     # File name of threaded index page
202        'tidxprefix=s',    # Filename prefix for multi-page thread index
203        'time',            # Print processing time
204        'title=s',         # Title of index page
205        'ttitle=s',        # Title of threaded index page
206        'thread',          # Create threaded index
207        'tlevels=i',       # Maximum # of nested lists in threaded index
208        'treverse',        # Reverse order of thread listing
209        'tslice=s',        # Set size of thread slice listing
210        'tslicelevels=i',
211        # Maximum # of nested lists in thread slices
212        'tsort',           # List threads by date
213        'tsubsort',        # List threads by subject
214        'umask=i',         # Set umask of process
215        'url',             # Make URL hyperlinks
216        'weekdays=s',      # Weekday names
217        'weekdaysabr=s',
218        # Abbreviated weekday names
219
220        ## API (only?) options
221        'noarg',     # Just load code
222        'readdb',    # Just read db
223
224        'v',         # Version information
225        'help'       # A brief usage message
226        );
227
228    ## Check for help/version options (nothing to do)
229    if ($opt{'help'}) { &usage();   return 0; }
230    if ($opt{'v'})    { &version(); return 0; }
231    if ($opt{'debug'}) {
232        $DEBUG = 1;
233    }
234
235    ## Check std{in,out,err} options
236DUP: {
237        $MhaStdin = \*STDIN;
238        #$MhaStdout = \*STDOUT;
239        #$MhaStderr = \*STDERR;
240    STDOUTERR: {
241            if (defined($opt{'stdout'}) && !ref($opt{'stdout'})) {
242                open(STDOUT, ">>$opt{'stdout'}")
243                    || die qq/ERROR: Unable to create "$opt{'stdout'}": $!\n/;
244                if ($opt{'stderr'} eq $opt{'stdout'}) {
245                    open(STDERR, ">&STDOUT")
246                        || die qq/ERROR: Unable to dup STDOUT: $!\n/;
247                    last STDOUTERR;
248                }
249            }
250            if (defined($opt{'stderr'}) && !ref($opt{'stderr'})) {
251                open(STDERR, ">>$opt{'stderr'}")
252                    || die qq/ERROR: Unable to create "$opt{'stderr'}": $!\n/;
253            }
254        }
255        if (defined($opt{'stdin'})) {
256            if (ref($opt{'stdin'})) {
257                $MhaStdin = $opt{'stdin'};
258            } else {
259                open(STDIN, "<$opt{'stdin'}")
260                    || die qq/ERROR: Unable to open "$opt{'stdin'}": $!\n/;
261                $MhaStdin = \*STDIN;
262            }
263        }
264        my $curfh = select(STDOUT);
265        $| = 1;
266        select(STDERR);
267        $| = 1;
268        select($curfh);
269    }
270
271    ## Initialize variables
272    require 'mhinit.pl';
273    &mhinit_vars();
274
275    ## These options have NO resource file equivalent.
276    $NoArg  = $opt{'noarg'};
277    $ReadDB = $opt{'readdb'};
278
279    $ADD      = $opt{'add'};
280    $RMM      = $opt{'rmm'};
281    $SCAN     = $opt{'scan'};
282    $QUIET    = $opt{'quiet'};
283    $EDITIDX  = $opt{'editidx'};
284    $ANNOTATE = $opt{'annotate'};
285    $AFS      = $opt{'afs'};
286    if ($opt{'genidx'}) {
287        $IDXONLY = 1;
288        $QUIET   = 1;
289        $ADD     = 0;
290    } else {
291        $IDXONLY = 0;
292    }
293    if ($opt{'single'} && !$RMM && !$ANNOTATE) {
294        $SINGLE = 1;
295        $QUIET  = 1;
296    } else {
297        $SINGLE = 0;
298    }
299    $ReadDB = 1
300        if ($ADD
301        || $EDITIDX
302        || $RMM
303        || $ANNOTATE
304        || $SCAN
305        || $IDXONLY);
306    $DoArchive = 1 if $opt{'archive'};
307    $DoArchive = 0 if $opt{'noarchive'};
308
309    $Reconvert = $opt{'reconvert'} if defined($opt{'reconvert'});
310
311    my $dolock = !$NoArg && !$opt{'nolock'};
312
313    ## Check argv
314    unless (($#ARGV >= 0)
315        || $ADD
316        || $SINGLE
317        || $EDITIDX
318        || $SCAN
319        || $IDXONLY
320        || $ReadDB
321        || !$DoArchive
322        || $NoArg) {
323        usage();
324        return -1;
325    }
326
327    ## Require needed libraries
328    require 'ewhutil.pl';
329    require 'mhtime.pl';
330    require 'mhfile.pl';
331    require 'mhutil.pl';
332    require 'mhrcfile.pl';
333    require 'mhscan.pl'   if $SCAN;
334    require 'mhsingle.pl' if $SINGLE;
335    require 'mhrmm.pl'    if $RMM;
336    require 'mhnote.pl'   if $ANNOTATE;
337    if (!$SCAN) {
338        # require readmail library
339        require 'readmail.pl';
340        mhinit_readmail_vars();
341    }
342
343    print STDOUT "This is MHonArc v$VERSION, Perl $] $^O\n" unless $QUIET;
344
345    ## Check for locale/lang setting
346    $Lang = $opt{'lang'} if defined($opt{'lang'});
347
348    ## Evaluate site local initialization
349    delete($INC{'mhasiteinit.pl'});    # force re-evaluation
350    eval { require 'mhasiteinit.pl'; };    # ignore status
351
352    ## Read default resource file
353DEFRCFILE: {
354        if ($DefRcFile) {
355            last DEFRCFILE if read_resource_file($DefRcFile);
356        }
357        my $home_dir = $ENV{'HOME'};
358        if (defined $home_dir) {
359            # check if in home directory
360            last DEFRCFILE
361                if read_resource_file(join($DIRSEP, $home_dir, $DefRcName),
362                1);
363        }
364        local $_;
365        foreach (@INC) {
366            next if ($_ eq $home_dir);
367            last DEFRCFILE
368                if read_resource_file(join($DIRSEP, $_, $DefRcName), 1);
369        }
370    }
371
372    ## Grab a few options
373    @FMTFILE = @{$opt{'rcfile'}} if defined($opt{'rcfile'});
374    $LOCKTRIES = $opt{'locktries'}
375        if defined($opt{'locktries'})
376        && ($opt{'locktries'} > 0);
377    $LOCKDELAY = $opt{'lockdelay'}
378        if defined($opt{'lockdelay'})
379        && ($opt{'lockdelay'} > 0);
380    $FORCELOCK = $opt{'force'};
381
382    $LockMethod = &set_lock_mode($opt{'lockmethod'})
383        if defined($opt{'lockmethod'});
384
385    ## These options must be grabbed before reading the database file
386    ## since these options may tells us where the database file is.
387    $OUTDIR = $opt{'outdir'} if $opt{'outdir'};
388    if (!$NoArg && !($SCAN || $IDXONLY || $SINGLE)) {
389        die qq/ERROR: "$OUTDIR" does not exist\n/ unless -e $OUTDIR;
390        if (!$AFS) {
391            die qq/ERROR: "$OUTDIR" is not readable\n/   unless -r $OUTDIR;
392            die qq/ERROR: "$OUTDIR" is not writable\n/   unless -w $OUTDIR;
393            die qq/ERROR: "$OUTDIR" is not executable\n/ unless -x $OUTDIR;
394        }
395    }
396    $DBFILE = $opt{'dbfile'} if $opt{'dbfile'};
397
398    ## Create lock
399    $LOCKFILE = join($DIRSEP, $OUTDIR, $LOCKFILE);
400    if ($dolock && $DoArchive && !$SINGLE) {
401        if (!&$LockFunc($LOCKFILE, $LOCKTRIES, $LOCKDELAY, $FORCELOCK)) {
402            $! = 75;    # EX_TEMPFAIL (for sendmail)
403            die("ERROR: Unable to lock $OUTDIR after $LOCKTRIES tries\n");
404        }
405    }
406
407    ## Check if we need to access database file
408    if ($ReadDB) {
409        $DBPathName =
410            OSis_absolute_path($DBFILE)
411            ? $DBFILE
412            : join($DIRSEP, $OUTDIR, $DBFILE);
413
414        ## Invoke preload callback
415        if (defined($CBDbPreLoad) && defined(&$CBDbPreLoad)) {
416            &$CBDbPreLoad($DBPathName);
417        }
418        if (-e $DBPathName) {
419            print STDOUT "Reading database ...\n" unless $QUIET;
420
421            ## Just perform a require.  Delete %INC entry to force
422            ## evaluation.
423            delete $INC{$DBPathName};
424            require($DBPathName)
425                || die("ERROR: Database read error of $DBPathName\n");
426
427            ## Check db version with program version
428            if ($VERSION ne $DbVERSION) {
429                warn "Warning: Database ($DbVERSION) != ",
430                    "program ($VERSION) version.\n";
431            }
432
433            ## Check for 1.x archive, and update data as needed
434            if ($DbVERSION =~ /^1\./) {
435                print STDOUT "Updating database $DbVERSION data ...\n"
436                    unless $QUIET;
437                &update_data_1_to_2();
438                &update_data_2_1_to_later();
439                &update_data_2_4_to_later();
440
441                ## Check for 2.[0-4] archive
442            } elsif ($DbVERSION =~ /^2\.[0-4]\./) {
443                print STDOUT "Updating database $DbVERSION data ...\n"
444                    unless $QUIET;
445                if ($DbVERSION =~ /^2\.[01]\./) {
446                    &update_data_2_1_to_later();
447                }
448                &update_data_2_4_to_later();
449            }
450
451            ## Set %Follow here just incase it does not get recomputed
452            %Follow = %FollowOld;
453
454            ## Check if %Time is defined
455            if (!%Time) {
456                my ($k, $v);
457                while (($k, $v) = each %IndexNum) {
458                    $Time{$k} = (split(/$X/o, $k, 2))[0];
459                }
460            }
461            if ($DoFromAddr && !%FromAddr) {
462                my ($k, $v);
463                while (($k, $v) = each %From) {
464                    $FromAddr{$k} = extract_email_address($v);
465                }
466            }
467            if ($DoFromName && !%FromName) {
468                my ($k, $v);
469                while (($k, $v) = each %From) {
470                    $FromName{$k} = extract_email_name($v);
471                }
472            }
473        }
474        if (!$IDXONLY) {
475            if   ($#ARGV < 0) { $ADDSINGLE = 1; }  # See if adding single mesg
476            else              { $ADDSINGLE = 0; }
477            $ADD = $MhaStdin;
478        }
479    }
480    my ($OldMULTIIDX) = $MULTIIDX;
481
482    ## Remove lock if db not going to be changed
483    if ($SCAN || $IDXONLY) {
484        &$UnlockFunc();
485    }
486
487    ## Clear thread flag if genidx, must be explicitly set
488    $THREAD = 0 if $IDXONLY;
489
490    ##	Read resource file(s)
491    ##	Look for resource in outdir unless existing according to
492    ##  current value.
493    foreach (@FMTFILE) {
494        $_ = join($DIRSEP, $OUTDIR, $_) unless -e $_;
495        &read_resource_file($_);
496    }
497
498    ## Set locale
499    eval {
500        require POSIX;
501        if ($Lang) {
502            POSIX::setlocale(&POSIX::LC_ALL, $Lang);
503        } else {
504            POSIX::setlocale(&POSIX::LC_ALL, '');
505        }
506    };
507    if ($@ && $Lang) {
508        warn qq/Warning: Setting locale appears to not be supported: $@\n/;
509    }
510
511    ##	Re-check readmail settings
512    if (!$SCAN) {
513        # If text encoding has been specified, change $MHeadCnvFunc.
514        if (defined(readmail::load_textencoder())) {
515            $MHeadCnvFunc = \&htmlize_enc_head;
516        }
517    }
518
519    ## Check if extension for HTML files defined on the command-line
520    $HtmlExt = $opt{'htmlext'} if defined($opt{'htmlext'});
521
522    ## Other indexes resource files
523    if (defined($opt{'otherindex'})) {
524        my @array = ();
525        local ($_);
526        foreach (@{$opt{'otherindex'}}) {
527            push(@array, split(/$PATHSEP/o, $_));
528        }
529        unshift(@OtherIdxs, @array);
530    }
531
532    ## Perl INC paths
533    if (defined($opt{'perlinc'})) {
534        my @array = ();
535        local ($_);
536        foreach (@{$opt{'perlinc'}}) {
537            push(@array, split(/$PATHSEP/o, $_));
538        }
539        unshift(@PerlINC, @array);
540    }
541
542    @OtherIdxs = remove_dups(\@OtherIdxs);
543    @PerlINC   = remove_dups(\@PerlINC);
544    unshift(@INC, @PerlINC);
545
546    ## Set alternative prefs
547    if (!$SCAN) {
548        readmail::MAILset_alternative_prefs(@MIMEAltPrefs);
549        $IsDefault{'MIMEALTPREFS'} = !scalar(@MIMEAltPrefs);
550    }
551
552    ## Get other command-line options
553    $DBFILE = $opt{'dbfile'} if $opt{'dbfile'};    # Override db
554    $DBPathName =
555        OSis_absolute_path($DBFILE)
556        ? $DBFILE
557        : join($DIRSEP, $OUTDIR, $DBFILE);
558
559    $DOCURL    = $opt{'docurl'}    if $opt{'docurl'};
560    $FROM      = $opt{'msgsep'}    if $opt{'msgsep'};
561    $IDXPREFIX = $opt{'idxprefix'} if $opt{'idxprefix'};
562    $IDXSIZE   = $opt{'idxsize'}   if defined($opt{'idxsize'});
563    $IDXSIZE *= -1 if $IDXSIZE < 0;
564    $OUTDIR     = $opt{'outdir'}     if $opt{'outdir'};          # Override db
565    $MAILTOURL  = $opt{'mailtourl'}  if $opt{'mailtourl'};
566    $NewsUrl    = $opt{'newsurl'}    if $opt{'newsurl'};
567    $MAXPGS     = $opt{'maxpgs'}     if defined($opt{'maxpgs'});
568    $MAXPGS     = 0                  if $MAXPGS < 0;
569    $MAXSIZE    = $opt{'maxsize'}    if defined($opt{'maxsize'});
570    $MAXSIZE    = 0                  if $MAXSIZE < 0;
571    $MHPATTERN  = $opt{'mhpattern'}  if $opt{'mhpattern'};
572    $TIDXPREFIX = $opt{'tidxprefix'} if $opt{'tidxprefix'};
573    $TITLE      = $opt{'title'}      if $opt{'title'};
574    $TLEVELS    = $opt{'tlevels'}    if $opt{'tlevels'};
575    $TTITLE     = $opt{'ttitle'}     if $opt{'ttitle'};
576    $MsgPrefix = $opt{'msgprefix'} if defined($opt{'msgprefix'});
577    $GzipExe   = $opt{'gzipexe'}   if $opt{'gzipexe'};
578    $VarExp    = $opt{'varregex'}
579        if $opt{'varregex'}
580        && ($opt{'varregex'} =~ /\S/);
581    $TSLICELEVELS  = $opt{'tslicelevels'}  if $opt{'tslicelevels'};
582    $IconURLPrefix = $opt{'iconurlprefix'} if $opt{'iconurlprefix'};
583
584    $IDXNAME =
585           $opt{'idxfname'}
586        || $IDXNAME
587        || $ENV{'M2H_IDXFNAME'}
588        || "maillist.$HtmlExt";
589    $TIDXNAME =
590           $opt{'tidxfname'}
591        || $TIDXNAME
592        || $ENV{'M2H_TIDXFNAME'}
593        || "threads.$HtmlExt";
594
595    $ExpireDate = $opt{'expiredate'} if $opt{'expiredate'};
596    $ExpireTime = $opt{'expireage'}  if $opt{'expireage'};
597    $ExpireTime *= -1 if $ExpireTime < 0;
598
599    $GMTDateFmt   = $opt{'gmtdatefmt'}   if $opt{'gmtdatefmt'};
600    $LocalDateFmt = $opt{'localdatefmt'} if $opt{'localdatefmt'};
601
602    $AddressModify = $opt{'addressmodifycode'} if $opt{'addressmodifycode'};
603    $SubArtRxp     = $opt{'subjectarticlerxp'} if $opt{'subjectarticlerxp'};
604    $SubReplyRxp   = $opt{'subjectreplyrxp'}   if $opt{'subjectreplyrxp'};
605    $SubStripCode  = $opt{'subjectstripcode'}  if $opt{'subjectstripcode'};
606    $MsgExcFilter = $opt{'msgexcfilter'} if defined($opt{'msgexcfilter'});
607
608    $NoSubjectTxt = $opt{'nosubjecttxt'} if $opt{'nosubjecttxt'};
609
610    $IdxPageNum = $opt{'pagenum'} if defined($opt{'pagenum'});
611
612    $AttachmentDir = $opt{'attachmentdir'} if defined($opt{'attachmentdir'});
613    $AttachmentUrl = $opt{'attachmenturl'} if defined($opt{'attachmenturl'});
614
615    ## Determine location of message note files
616    $NoteDir = $opt{'notedir'} if $opt{'notedir'};
617
618    ## See if note text defined on command-line
619    if (defined $opt{'notetext'}) {
620        $NoteText = join(" ", @{$opt{'notetext'}});
621    } else {
622        $NoteText = undef;
623    }
624
625    ## Parse any rc variable definition from command-line
626    if (defined($opt{'definevar'})) {
627        my @array = ();
628        foreach (@{$opt{'definevar'}}) {
629            push(@array, &parse_vardef_str($_));
630        }
631        %CustomRcVars = (%CustomRcVars, @array);
632    }
633
634    $CONLEN    = 1 if $opt{'conlen'};
635    $CONLEN    = 0 if $opt{'noconlen'};
636    $MAIN      = 1 if $opt{'main'};
637    $MAIN      = 0 if $opt{'nomain'};
638    $MODTIME   = 1 if $opt{'modtime'};
639    $MODTIME   = 0 if $opt{'nomodtime'};
640    $MULTIIDX  = 1 if $opt{'multipg'};
641    $MULTIIDX  = 0 if $opt{'nomultipg'};
642    $NODOC     = 0 if $opt{'doc'};
643    $NODOC     = 1 if $opt{'nodoc'};
644    $NOMAILTO  = 1 if $opt{'nomailto'};
645    $NONEWS    = 0 if $opt{'news'};
646    $NONEWS    = 1 if $opt{'nonews'};
647    $NOURL     = 0 if $opt{'url'};
648    $NOURL     = 1 if $opt{'nourl'};
649    $SLOW      = 1 if $opt{'savemem'};
650    $THREAD    = 1 if $opt{'thread'};
651    $THREAD    = 0 if $opt{'nothread'};
652    $TREVERSE  = 1 if $opt{'treverse'};
653    $TREVERSE  = 0 if $opt{'notreverse'};
654    $DoFolRefs = 1 if $opt{'folrefs'};
655    $DoFolRefs = 0 if $opt{'nofolrefs'};
656    $GzipFiles = 1 if $opt{'gzipfiles'};
657    $GzipFiles = 0 if $opt{'nogzipfiles'};
658    $GzipLinks = 1 if $opt{'gziplinks'};
659    $GzipLinks = 0 if $opt{'nogziplinks'};
660    $NoMsgPgs  = 0 if $opt{'msgpgs'};
661    $NoMsgPgs  = 1 if $opt{'nomsgpgs'};
662    $SaveRsrcs = 1 if $opt{'saveresources'};
663    $SaveRsrcs = 0 if $opt{'nosaveresources'};
664    $SpamMode  = 1 if $opt{'spammode'};
665    $SpamMode  = 0 if $opt{'nospammode'};
666    $KeepOnRmm = 1 if $opt{'keeponrmm'};
667    $KeepOnRmm = 0 if $opt{'nokeeponrmm'};
668
669    $PrintXComments = 1 if $opt{'printxcomments'};
670    $PrintXComments = 0 if $opt{'noprintxcomments'};
671
672    $CheckNoArchive = 1 if $opt{'checknoarchive'};
673    $CheckNoArchive = 0 if $opt{'nochecknoarchive'};
674    $FastTempFiles  = 1 if $opt{'fasttempfiles'};
675    $FastTempFiles  = 0 if $opt{'nofasttempfiles'};
676    $FollowSymlinks = 1 if $opt{'followsymlinks'};
677    $FollowSymlinks = 0 if $opt{'nofollowsymlinks'};
678    $POSIXstrftime  = 1 if $opt{'posixstrftime'};
679    $POSIXstrftime  = 0 if $opt{'noposixstrftime'};
680
681    $AddrModifyBodies = 1 if $opt{'modifybodyaddresses'};
682    $AddrModifyBodies = 0 if $opt{'nomodifybodyaddresses'};
683
684    $DecodeHeads = 1 if $opt{'decodeheads'};
685    $DecodeHeads = 0 if $opt{'nodecodeheads'};
686    $readmail::DecodeHeader = $DecodeHeads;
687
688    ## Clear main flag if genidx and thread specified
689    $MAIN = 0 if $IDXONLY && $THREAD;
690
691    @DateFields = split(/[:;]/, $opt{'datefields'}) if $opt{'datefields'};
692    @FromFields = split(/[:;]/, $opt{'fromfields'}) if $opt{'fromfields'};
693    foreach (@FromFields) { s/\s//g; tr/A-Z/a-z/; }
694
695    ($TSliceNBefore, $TSliceNAfter, $TSliceInclusive) =
696        split(/[:;]/, $opt{'tslice'})
697        if $opt{'tslice'};
698
699    @Months   = split(/:/, $opt{'months'})    if defined($opt{'months'});
700    @months   = split(/:/, $opt{'monthsabr'}) if defined($opt{'monthsabr'});
701    @Weekdays = split(/:/, $opt{'weekdays'})  if defined($opt{'weekdays'});
702    @weekdays = split(/:/, $opt{'weekdaysabr'})
703        if defined($opt{'weekdaysabr'});
704
705    $MULTIIDX = 0 if !$IDXSIZE;
706
707    ##	Set umask
708    if ($UNIX) {
709        $UMASK = $opt{'umask'} if defined($opt{'umask'});
710        eval { umask oct($UMASK); };
711    }
712    $FilePerms      = $opt{'fileperms'} if defined($opt{'fileperms'});
713    $FilePermsOct   = oct($FilePerms);
714    $DbFilePerms    = $opt{'dbfileperms'} if defined($opt{'dbfileperms'});
715    $DbFilePermsOct = oct($DbFilePerms);
716
717    ##	Get sort method
718    $AUTHSORT = 1 if $opt{'authsort'};
719    $AUTHSORT = 0 if $opt{'noauthsort'};
720    $SUBSORT  = 1 if $opt{'subsort'};
721    $SUBSORT  = 0 if $opt{'nosubsort'};
722    $NOSORT   = 1 if $opt{'nosort'};
723    $NOSORT   = 0 if $opt{'sort'};
724    $REVSORT  = 1 if $opt{'reverse'};
725    $REVSORT  = 0 if $opt{'noreverse'};
726    if ($NOSORT) {
727        $SUBSORT  = 0;
728        $AUTHSORT = 0;
729    } elsif ($SUBSORT) {
730        $AUTHSORT = 0;
731    }
732
733    ## Check for thread listing order
734    $TSUBSORT = 1 if $opt{'tsubsort'};
735    $TSUBSORT = 0 if $opt{'notsubsort'};
736    $TNOSORT  = 1 if $opt{'notsort'};
737    $TNOSORT  = 0 if $opt{'tsort'};
738    $TREVERSE = 1 if $opt{'treverse'};
739    $TREVERSE = 0 if $opt{'notreverse'};
740    if ($TNOSORT) {
741        $TSUBSORT = 0;
742    }
743    $NoSubjectThreads = 1 if $opt{'nosubjectthreads'};
744    $NoSubjectThreads = 0 if $opt{'subjectthreads'};
745
746    ## Check if all messages must be updated (this has been simplified;
747    ## any serious change should be done via editidx).
748    if ($EDITIDX || ($OldMULTIIDX != $MULTIIDX)) {
749        $UPDATE_ALL = 1;
750    } else {
751        $UPDATE_ALL = 0;
752    }
753
754    ## Clean up list-based resources
755    @ExtraHFields = remove_dups(\@ExtraHFields);
756    @FieldOrder   = remove_dups(\@FieldOrder);
757
758    ## Set date names
759    &set_date_names(\@weekdays, \@Weekdays, \@months, \@Months);
760
761    ## Set %Zone with user-specified timezones
762    while (($zone, $offset) = each(%ZoneUD)) {
763        $Zone{$zone} = $offset;
764    }
765
766    ## Require some more libaries
767    require 'mhidxrc.pl';
768    &mhidxrc_set_vars();
769    require 'mhdysub.pl';
770    &create_routines();
771    require 'mhrcvars.pl';
772    require 'mhindex.pl';
773    require 'mhthread.pl';
774    require 'mhdb.pl' unless $SCAN || $IDXONLY || !$DoArchive;
775
776    ## Load text clipping function
777    if (defined($TextClipSrc)) {
778        eval { require $TextClipSrc; };
779        if ($@) { warn qq/Warning: $@\n/; }
780    }
781    if (!defined($TextClipFunc) || !defined(&$TextClipFunc)) {
782        $TextClipFunc              = \&clip_text;
783        $TextClipSrc               = undef;
784        $IsDefault{'TEXTCLIPFUNC'} = 1;
785    } else {
786        $IsDefault{'TEXTCLIPFUNC'} = 0;
787    }
788
789    ## Check if rewriting addresses in bodies
790    if ($AddrModifyBodies) {
791        $readmail::TextPreFilter = sub {
792            my $fields = shift;
793            my $data_r = shift;
794            # do not rewrite cid: URLs.
795            #$$data_r =~ s{($AddrExp)}{rewrite_raw_address($1)}geox;
796            $$data_r =~ s{
797		((?:cid:)?)($AddrExp)
798	    }{
799		($1 eq "") ? rewrite_raw_address($2) : $1.$2;
800	    }gieox;
801            }
802    }
803
804    ## Predefine %Index2TLoc in case of message deletion
805    if (@TListOrder) {
806        @Index2TLoc{@TListOrder} = (0 .. $#TListOrder);
807    }
808
809    ## Define %Index2MsgId hash
810    foreach (keys %MsgId) {
811        $Index2MsgId{$MsgId{$_}} = $_;
812    }
813
814    ## Set $ExpireDateTime from $ExpireDate
815    if ($ExpireDate) {
816        my @array = ();
817        if (@array = &parse_date($ExpireDate)) {
818            $ExpireDateTime = &get_time_from_date(@array[1 .. $#array]);
819        } else {
820            warn qq|Warning: Unable to parse EXPIREDATE, "$ExpireDate"\n|;
821        }
822    }
823
824    ## Get highest message number
825    if ($ADD) {
826        $LastMsgNum = &get_last_msg_num();
827    } else {
828        $LastMsgNum = -1;
829    }
830
831    ## Delete bogus empty entries in hashes due to bug in earlier
832    ## versions to avoid any future problems.
833    delete($IndexNum{''});
834    delete($Subject{''});
835    delete($From{''});
836    delete($MsgId{''});
837    delete($FollowOld{''});
838    delete($ContentType{''});
839    delete($Refs{''});
840
841    # update DOCURL if default old value
842    if ($DOCURL eq 'http://www.oac.uci.edu/indiv/ehood/mhonarc.html') {
843        $DOCURL = 'http://www.mhonarc.org/';
844    }
845
846    ## Check if printing process time
847    $TIME = $opt{'time'};
848
849    1;
850}
851
852##---------------------------------------------------------------------------
853##	Version routine
854##
855sub version {
856    select(STDOUT);
857    print $VINFO;
858}
859
860##---------------------------------------------------------------------------
861##	Usage routine
862##
863sub usage {
864    require 'mhusage.pl';
865    &mhusage();
866}
867
868##---------------------------------------------------------------------------
869##	Routine to update 1.x data structures to 2.0.
870##
871sub update_data_1_to_2 {
872    local (%EntName2Char) = ('lt', '<', 'gt', '>', 'amp', '&',);
873    #--------------------------------------
874    sub entname_to_char {
875        my ($name) = shift;
876        my ($ret)  = $EntName2Char{$name};
877        if (!$ret) {
878            $ret = "&$name;";
879        }
880        $ret;
881    }
882    #--------------------------------------
883    my ($index);
884    foreach $index (keys %From) {
885        $From{$index} =~ s/\&([\w\-.]+);/&entname_to_char($1)/ge;
886    }
887    foreach $index (keys %Subject) {
888        $Subject{$index} =~ s/\&([\w\-.]+);/&entname_to_char($1)/ge;
889    }
890    delete $IndexNum{''};
891    $TLITXT = '<li>' . $TLITXT unless ($TLITXT) && ($TLITXT =~ /<li>/i);
892    $THEAD .= "<ul>\n" unless ($THEAD) && ($THEAD =~ m%<ul>\s*$%i);
893    $TFOOT = "</ul>\n" unless ($TFOOT) && ($TFOOT =~ m%^\s*</ul>%i);
894}
895
896##---------------------------------------------------------------------------
897##	Update 2.1, or earlier, data.
898##
899sub update_data_2_1_to_later {
900    no warnings qw(deprecated);
901    # we can preserve filter arguments
902    if (%main::MIMEFiltersArgs) {
903        warn qq/         preserving MIMEARGS...\n/;
904        %readmail::MIMEFiltersArgs = %main::MIMEFiltersArgs;
905        $IsDefault{'MIMEARGS'} = 0;
906    }
907}
908
909##---------------------------------------------------------------------------
910##	Update 2.4, or earlier, data.
911##
912sub update_data_2_4_to_later {
913    # convert Perl 4 style data to Perl 5 style
914    my ($index, $value);
915    while (($index, $value) = each(%Refs)) {
916        next if ref($value);
917        $Refs{$index} = [split(/$X/o, $value)];
918    }
919    while (($index, $value) = each(%FollowOld)) {
920        next if ref($value);
921        $FollowOld{$index} = [split(/$bs/o, $value)];
922    }
923    while (($index, $value) = each(%Derived)) {
924        next if ref($value);
925        $Derived{$index} = [split(/$X/o, $value)];
926    }
927}
928
929##---------------------------------------------------------------------------
930##	Initialize readmail.pl variables
931##
932sub mhinit_readmail_vars {
933    $readmail::DEBUG = $DEBUG;
934
935    ##	Default decoders
936    %readmail::MIMEDecoders = (
937        '7bit'             => 'as-is',
938        '8bit'             => 'as-is',
939        'binary'           => 'as-is',
940        'base64'           => 'base64::b64decode',
941        'quoted-printable' => 'quoted_printable::qprdecode',
942        'x-uuencode'       => 'base64::uudecode',
943        'x-uue'            => 'base64::uudecode',
944        'uuencode'         => 'base64::uudecode',
945    );
946    %readmail::MIMEDecodersSrc = (
947        'base64'           => 'base64.pl',
948        'quoted-printable' => 'qprint.pl',
949        'x-uuencode'       => 'base64.pl',
950        'x-uue'            => 'base64.pl',
951        'uuencode'         => 'base64.pl',
952    );
953    $IsDefault{'MIMEDECODERS'} = 1;
954
955    ##	Default filters
956    %readmail::MIMEFilters = (
957        # Content-type			Filter
958        #-----------------------------------------------------------------
959        "application/ms-tnef",       "m2h_null::filter",
960        "application/octet-stream",  "m2h_external::filter",
961        "application/x-patch",       "m2h_text_plain::filter",
962        "message/delivery-status",   "m2h_text_plain::filter",
963        "message/external-body",     "m2h_msg_extbody::filter",
964        "message/partial",           "m2h_text_plain::filter",
965        "text/enriched",             "m2h_text_enriched::filter",
966        "text/html",                 "m2h_text_html::filter",
967        "text/plain",                "m2h_text_plain::filter",
968        "text/richtext",             "m2h_text_enriched::filter",
969        "text/tab-separated-values", "m2h_text_tsv::filter",
970        "text/x-html",               "m2h_text_html::filter",
971
972        "application/*", "m2h_external::filter",
973        "audio/*",       "m2h_external::filter",
974        "chemical/*",    "m2h_external::filter",
975        "image/*",       "m2h_external::filter",
976        "model/*",       "m2h_external::filter",
977        "text/*",        "m2h_text_plain::filter",
978        "video/*",       "m2h_external::filter",
979
980        "x-sun-attachment", "m2h_text_plain::filter",
981    );
982
983    %readmail::MIMEFiltersSrc = (
984        # Content-type			Filter
985        #-----------------------------------------------------------------
986        "application/ms-tnef",       "mhnull.pl",
987        "application/octet-stream",  "mhexternal.pl",
988        "application/x-patch",       "mhtxtplain.pl",
989        "message/delivery-status",   "mhtxtplain.pl",
990        "message/external-body",     "mhmsgextbody.pl",
991        "message/partial",           "mhtxtplain.pl",
992        "text/enriched",             "mhtxtenrich.pl",
993        "text/html",                 "mhtxthtml.pl",
994        "text/plain",                "mhtxtplain.pl",
995        "text/richtext",             "mhtxtenrich.pl",
996        "text/tab-separated-values", "mhtxttsv.pl",
997        "text/x-html",               "mhtxthtml.pl",
998
999        "application/*", "mhexternal.pl",
1000        "audio/*",       "mhexternal.pl",
1001        "chemical/*",    "mhexternal.pl",
1002        "image/*",       "mhexternal.pl",
1003        "model/*",       "mhexternal.pl",
1004        "text/*",        "mhtxtplain.pl",
1005        "video/*",       "mhexternal.pl",
1006
1007        "x-sun-attachment", "mhtxtplain.pl",
1008    );
1009    $IsDefault{'MIMEFILTERS'} = 1;
1010
1011    ##  Default filter arguments
1012    %readmail::MIMEFiltersArgs = (
1013        # Content-type			Arguments
1014        #-----------------------------------------------------------------
1015        'm2h_external::filter', 'inline',
1016    );
1017    $IsDefault{'MIMEARGS'} = 1;
1018
1019    ##  Charset filters
1020    %readmail::MIMECharSetConverters = (
1021        # Character set		Converter Function
1022        #-----------------------------------------------------------------
1023        'plain',              'mhonarc::htmlize',
1024        'us-ascii',           'mhonarc::htmlize',
1025        'iso-8859-1',         'MHonArc::CharEnt::str2sgml',
1026        'iso-8859-2',         'MHonArc::CharEnt::str2sgml',
1027        'iso-8859-3',         'MHonArc::CharEnt::str2sgml',
1028        'iso-8859-4',         'MHonArc::CharEnt::str2sgml',
1029        'iso-8859-5',         'MHonArc::CharEnt::str2sgml',
1030        'iso-8859-6',         'MHonArc::CharEnt::str2sgml',
1031        'iso-8859-7',         'MHonArc::CharEnt::str2sgml',
1032        'iso-8859-8',         'MHonArc::CharEnt::str2sgml',
1033        'iso-8859-9',         'MHonArc::CharEnt::str2sgml',
1034        'iso-8859-10',        'MHonArc::CharEnt::str2sgml',
1035        'iso-8859-11',        'MHonArc::CharEnt::str2sgml',
1036        'iso-8859-13',        'MHonArc::CharEnt::str2sgml',
1037        'iso-8859-14',        'MHonArc::CharEnt::str2sgml',
1038        'iso-8859-15',        'MHonArc::CharEnt::str2sgml',
1039        'iso-8859-16',        'MHonArc::CharEnt::str2sgml',
1040        'iso-2022-jp',        'MHonArc::CharEnt::str2sgml',
1041        'iso-2022-kr',        'MHonArc::CharEnt::str2sgml',
1042        'euc-jp',             'MHonArc::CharEnt::str2sgml',
1043        'utf-8',              'MHonArc::CharEnt::str2sgml',
1044        'cp866',              'MHonArc::CharEnt::str2sgml',
1045        'cp932',              'MHonArc::CharEnt::str2sgml',
1046        'cp936',              'MHonArc::CharEnt::str2sgml',
1047        'cp949',              'MHonArc::CharEnt::str2sgml',
1048        'cp950',              'MHonArc::CharEnt::str2sgml',
1049        'cp1250',             'MHonArc::CharEnt::str2sgml',
1050        'cp1251',             'MHonArc::CharEnt::str2sgml',
1051        'cp1252',             'MHonArc::CharEnt::str2sgml',
1052        'cp1253',             'MHonArc::CharEnt::str2sgml',
1053        'cp1254',             'MHonArc::CharEnt::str2sgml',
1054        'cp1255',             'MHonArc::CharEnt::str2sgml',
1055        'cp1256',             'MHonArc::CharEnt::str2sgml',
1056        'cp1257',             'MHonArc::CharEnt::str2sgml',
1057        'cp1258',             'MHonArc::CharEnt::str2sgml',
1058        'koi-0',              'MHonArc::CharEnt::str2sgml',
1059        'koi-7',              'MHonArc::CharEnt::str2sgml',
1060        'koi8-a',             'MHonArc::CharEnt::str2sgml',
1061        'koi8-b',             'MHonArc::CharEnt::str2sgml',
1062        'koi8-e',             'MHonArc::CharEnt::str2sgml',
1063        'koi8-f',             'MHonArc::CharEnt::str2sgml',
1064        'koi8-r',             'MHonArc::CharEnt::str2sgml',
1065        'koi8-u',             'MHonArc::CharEnt::str2sgml',
1066        'gost19768-87',       'MHonArc::CharEnt::str2sgml',
1067        'viscii',             'MHonArc::CharEnt::str2sgml',
1068        'big5-eten',          'MHonArc::CharEnt::str2sgml',
1069        'big5-hkscs',         'MHonArc::CharEnt::str2sgml',
1070        'gb2312',             'MHonArc::CharEnt::str2sgml',
1071        'macarabic',          'MHonArc::CharEnt::str2sgml',
1072        'maccentraleurroman', 'MHonArc::CharEnt::str2sgml',
1073        'maccroatian',        'MHonArc::CharEnt::str2sgml',
1074        'maccyrillic',        'MHonArc::CharEnt::str2sgml',
1075        'macgreek',           'MHonArc::CharEnt::str2sgml',
1076        'machebrew',          'MHonArc::CharEnt::str2sgml',
1077        'macicelandic',       'MHonArc::CharEnt::str2sgml',
1078        'macromanian',        'MHonArc::CharEnt::str2sgml',
1079        'macroman',           'MHonArc::CharEnt::str2sgml',
1080        'macthai',            'MHonArc::CharEnt::str2sgml',
1081        'macturkish',         'MHonArc::CharEnt::str2sgml',
1082        'hp-roman8',          'MHonArc::CharEnt::str2sgml',
1083        'default',            '-ignore-',
1084    );
1085    %readmail::MIMECharSetConvertersSrc = (
1086        # Character set		Converter Function
1087        #-----------------------------------------------------------------
1088        'plain',              undef,
1089        'us-ascii',           undef,
1090        'iso-8859-1',         'MHonArc/CharEnt.pm',
1091        'iso-8859-2',         'MHonArc/CharEnt.pm',
1092        'iso-8859-3',         'MHonArc/CharEnt.pm',
1093        'iso-8859-4',         'MHonArc/CharEnt.pm',
1094        'iso-8859-5',         'MHonArc/CharEnt.pm',
1095        'iso-8859-6',         'MHonArc/CharEnt.pm',
1096        'iso-8859-7',         'MHonArc/CharEnt.pm',
1097        'iso-8859-8',         'MHonArc/CharEnt.pm',
1098        'iso-8859-9',         'MHonArc/CharEnt.pm',
1099        'iso-8859-10',        'MHonArc/CharEnt.pm',
1100        'iso-8859-11',        'MHonArc/CharEnt.pm',
1101        'iso-8859-13',        'MHonArc/CharEnt.pm',
1102        'iso-8859-14',        'MHonArc/CharEnt.pm',
1103        'iso-8859-15',        'MHonArc/CharEnt.pm',
1104        'iso-8859-16',        'MHonArc/CharEnt.pm',
1105        'iso-2022-jp',        'MHonArc/CharEnt.pm',
1106        'iso-2022-kr',        'MHonArc/CharEnt.pm',
1107        'euc-jp',             'MHonArc/CharEnt.pm',
1108        'utf-8',              'MHonArc/CharEnt.pm',
1109        'cp866',              'MHonArc/CharEnt.pm',
1110        'cp932',              'MHonArc/CharEnt.pm',
1111        'cp936',              'MHonArc/CharEnt.pm',
1112        'cp949',              'MHonArc/CharEnt.pm',
1113        'cp950',              'MHonArc/CharEnt.pm',
1114        'cp1250',             'MHonArc/CharEnt.pm',
1115        'cp1251',             'MHonArc/CharEnt.pm',
1116        'cp1252',             'MHonArc/CharEnt.pm',
1117        'cp1253',             'MHonArc/CharEnt.pm',
1118        'cp1254',             'MHonArc/CharEnt.pm',
1119        'cp1255',             'MHonArc/CharEnt.pm',
1120        'cp1256',             'MHonArc/CharEnt.pm',
1121        'cp1257',             'MHonArc/CharEnt.pm',
1122        'cp1258',             'MHonArc/CharEnt.pm',
1123        'koi-0',              'MHonArc/CharEnt.pm',
1124        'koi-7',              'MHonArc/CharEnt.pm',
1125        'koi8-a',             'MHonArc/CharEnt.pm',
1126        'koi8-b',             'MHonArc/CharEnt.pm',
1127        'koi8-e',             'MHonArc/CharEnt.pm',
1128        'koi8-f',             'MHonArc/CharEnt.pm',
1129        'koi8-r',             'MHonArc/CharEnt.pm',
1130        'koi8-u',             'MHonArc/CharEnt.pm',
1131        'gost19768-87',       'MHonArc/CharEnt.pm',
1132        'viscii',             'MHonArc/CharEnt.pm',
1133        'big5-eten',          'MHonArc/CharEnt.pm',
1134        'big5-hkscs',         'MHonArc/CharEnt.pm',
1135        'gb2312',             'MHonArc/CharEnt.pm',
1136        'macarabic',          'MHonArc/CharEnt.pm',
1137        'maccentraleurroman', 'MHonArc/CharEnt.pm',
1138        'maccroatian',        'MHonArc/CharEnt.pm',
1139        'maccyrillic',        'MHonArc/CharEnt.pm',
1140        'macgreek',           'MHonArc/CharEnt.pm',
1141        'machebrew',          'MHonArc/CharEnt.pm',
1142        'macicelandic',       'MHonArc/CharEnt.pm',
1143        'macromanian',        'MHonArc/CharEnt.pm',
1144        'macroman',           'MHonArc/CharEnt.pm',
1145        'macthai',            'MHonArc/CharEnt.pm',
1146        'macturkish',         'MHonArc/CharEnt.pm',
1147        'hp-roman8',          'MHonArc/CharEnt.pm',
1148        'default',            undef,
1149    );
1150    $IsDefault{'CHARSETCONVERTERS'} = 1;
1151
1152    ##	Default charset aliases
1153    readmail::MAILset_charset_aliases(
1154        {   'us-ascii' => [
1155                'ascii',           'ansi_x3.4-1968',
1156                'iso646',          'iso646-us',
1157                'iso646.irv:1991', 'cp367',
1158                'ibm367',          'csascii',
1159                'iso-ir-6',        'us'
1160            ],
1161            'iso-8859-1' => [
1162                'latin1',       'l1',
1163                'iso_8859_1',   'iso_8859-1:1987',
1164                'iso8859-1',    'iso8859_1',
1165                '8859-1',       '8859_1',
1166                'cp819',        'ibm819',
1167                'x-mac-latin1', 'iso-ir-100'
1168            ],
1169            'iso-8859-2' => [
1170                'latin2',     'l2',
1171                'iso_8859_2', 'iso_8859-2:1987',
1172                'iso8859-2',  'iso8859_2',
1173                '8859-2',     '8859_2',
1174                'iso-ir-101'
1175            ],
1176            'iso-8859-3' => [
1177                'latin3',     'l3',
1178                'iso_8859_3', 'iso_8859-3:1988',
1179                'iso8859-3',  'iso8859_3',
1180                '8859-3',     '8859_3',
1181                'iso-ir-109'
1182            ],
1183            'iso-8859-4' => [
1184                'latin4',     'l4',
1185                'iso_8859_4', 'iso_8859-4:1988',
1186                'iso8859-4',  'iso8859_4',
1187                '8859-4',     '8859_4',
1188                'iso-ir-110'
1189            ],
1190            'iso-8859-5' => ['iso_8859-5:1988', 'cyrillic', 'iso-ir-144'],
1191            'iso-8859-6' => [
1192                'iso_8859-6:1987', 'arabic',
1193                'asmo-708',        'ecma-114',
1194                'iso-ir-127'
1195            ],
1196            'iso-8859-7' => [
1197                'iso_8859-7:1987', 'greek',
1198                'greek8',          'ecma-118',
1199                'elot_928',        'iso-ir-126'
1200            ],
1201            'iso-8859-8' =>
1202                ['iso-8859-8-i', 'iso_8859-8:1988', 'hebrew', 'iso-ir-138'],
1203            'iso-8859-9' => [
1204                'latin5',     'l5',
1205                'iso_8859_9', 'iso-8859_9:1989',
1206                'iso8859-9',  'iso8859_9',
1207                '8859-9',     '8859_9',
1208                'iso-ir-148'
1209            ],
1210            'iso-8859-10' => [
1211                'latin6',      'l6',
1212                'iso_8859_10', 'iso_8859-10:1993',
1213                'iso8859-10',  'iso8859_10',
1214                '8859-10',     '8859_10',
1215                'iso-ir-157'
1216            ],
1217            'iso-8859-13' => ['latin7', 'l7'],
1218            'iso-8859-14' => ['latin8', 'l8'],
1219            'iso-8859-15' => [
1220                'latin9',      'latin0',     'l9',         'l0',
1221                'iso_8859_15', 'iso8859-15', 'iso8859_15', '8859-15',
1222                '8859_15'
1223            ],
1224            'iso-2022-jp' => ['iso-2022-jp-1'],
1225            'utf-8'       => ['utf8'],
1226            'cp932'       => [
1227                'shiftjis', 'shift_jis', 'shift-jis', 'x-sjis',
1228                'ms_kanji', 'csshiftjis'
1229            ],
1230            'cp936' => ['gbk', 'ms936', 'windows-936'],
1231            'cp949' => [
1232                'euc-kr',         'ks_c_5601-1987',
1233                'ks_c_5601-1989', 'ksc_5601',
1234                'iso-ir-149',     'windows-949',
1235                'ms949',          'korean'
1236            ],
1237            'cp950'         => ['windows-950'],
1238            'cp1250'        => ['windows-1250'],
1239            'cp1251'        => ['windows-1251'],
1240            'cp1252'        => ['windows-1252'],
1241            'cp1253'        => ['windows-1253'],
1242            'cp1254'        => ['windows-1254'],
1243            'cp1255'        => ['windows-1255'],
1244            'cp1256'        => ['windows-1256'],
1245            'cp1257'        => ['windows-1257'],
1246            'cp1258'        => ['windows-1258'],
1247            'koi-0'         => ['gost-13052'],
1248            'koi8-e'        => ['iso-ir-111', 'ecma-113:1986'],
1249            'koi8-r'        => ['cp878'],
1250            'gost-19768-87' => ['ecma-cyrillic', 'ecma-113', 'ecma-113:1988'],
1251            'big5-eten'     => ['big5', 'csbig5', 'tcs-big5', 'tcsbig5'],
1252            'big5-hkscs' => ['big5hkscs', 'big5hk', 'hkscs-big5', 'hk-big5'],
1253            'gb2312'     => [
1254                'gb_2312-80', 'csgb2312',
1255                'hz-gb-2312', 'iso-ir-58',
1256                'euc-cn',     'chinese',
1257                'csiso58gb231280'
1258            ],
1259            'macarabic' => ['apple-arabic', 'x-mac-arabic'],
1260            'maccentraleurroman' =>
1261                ['apple-centeuro', 'x-mac-centraleurroman'],
1262            'maccroatian'  => ['apple-croatian', 'x-mac-croatian'],
1263            'maccyrillic'  => ['apple-cyrillic', 'x-mac-cyrillic'],
1264            'macgreek'     => ['apple-greek',    'x-mac-greek'],
1265            'machebrew'    => ['apple-hebrew',   'x-mac-hebrew'],
1266            'macicelandic' => ['apple-iceland',  'x-mac-icelandic'],
1267            'macromanian'  => ['apple-romanian', 'x-mac-romanian'],
1268            'macroman' => ['apple-roman', 'mac', 'macintosh', 'x-mac-roman'],
1269            'macthai'  => ['apple-thai',  'x-mac-thai'],
1270            'macturkish' => ['apple-turkish', 'x-mac-turkish'],
1271        }
1272    );
1273    $IsDefault{'CHARSETALIASES'} = 1;
1274
1275    ##  Content-Types to exclude:
1276    ##    Nothing is excluded by default.
1277    %readmail::MIMEExcs = ();
1278    $IsDefault{'MIMEEXCS'} = 1;
1279
1280    ##  Content-Types to only include:
1281    ##    Blank by default: include everything
1282    %readmail::MIMEIncs = ();
1283    $IsDefault{'MIMEIncs'} = 1;
1284
1285    ##  Content-type multipart/alternative preferences
1286    ##    Note: The variable is not a readmail package variable, but it
1287    ##	    is used to set readmail package properties.
1288    @MIMEAltPrefs = ();
1289    $IsDefault{'MIMEALTPREFS'} = 1;
1290
1291    ##	Text encoding
1292    $readmail::TextEncode = undef;
1293    $IsDefault{'TEXTENCODE'} = 1;
1294
1295    $readmail::FormatHeaderFunc = \&mhonarc::htmlize_header;
1296    $MHeadCnvFunc               = \&readmail::MAILdecode_1522_str;
1297}
1298
1299##---------------------------------------------------------------------------
13001;
1301